我正在尝试通过 C++ 中的 MSMQ 消息发送 COM 对象。这是我的对象:
类 ATL_NO_VTABLE CANalisis :
公共 CComObjectRootEx,
公共 CComCoClass,
公共 ISupportErrorInfo,
公共IDispatchImpl,
公共 IPersistStreamInit
{
私人的:
类型定义结构{
双倍尺寸;
浮动颜色;
浮灯;
BSTR imgName;
BSTR 名称;
} 图片;
图像图像;
标准方法(加载)(IStream *pStm);
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
一切都很好,我可以得到整个对象,但 BSTR 类型。浮点数和整数被正确发送和接收。但是 BSTR 类型不起作用。我正在尝试发送字符串,但找不到路。我确实尝试使用 VARIANT,但结果也是错误的。不知何故,看起来字符串没有序列化。
这些是我的 ATL 组件的一些 get 和 set 函数:
这个工作正常:
STDMETHODIMP CANalisis::getLight(FLOAT* light)
{
*light=img.light;
返回 S_OK;
}
STDMETHODIMP CANalisis::setLight(FLOAT light)
{
img.light=光;
返回 S_OK;
}
这个没有:
STDMETHODIMP CANalisis::getImgName(BSTR* imgName)
{
*imgName = img.imgName;
返回 S_OK;
}
STDMETHODIMP CANalisis::setImgName(BSTR imgName)
{
img.imgName=imgName;
返回 S_OK;
}
这就是我创建 MSMQ 消息并在生产者中填充值的方式:
// 对于这些 ActiveX 组件,我们只需要智能接口指针
IMSMQQueueInfosPtr pQueueInfos;
IMSMQQueueInfoPtr pQueueInfo;
IMSMQQueuePtr pQueue;
IUnknownPtr pIUnknown;
// 实例化以下 ActiveX 组件
IMSMQQueryPtr pQuery(__uuidof(MSMQQuery));
IMSMQMessagePtr pMessage(__uuidof(MSMQMessage));
IAnalisisPtr pAnalisis(__uuidof(Analisis));
WCHAR * 图像;
imagen = L"imagen1.jpg";
pAnalisis->setImgName(imagen);
(...)
pAnalisis->setFruitSize(20.00);
(...)
pQueueInfo = new IMSMQQueueInfoPtr( __uuidof(MSMQQueueInfo) );
pQueueInfo->PathName = "MYCOMPUTER\\private$\\myprivatequeue";
pQueue = pQueueInfo->Open(MQ_SEND_ACCESS, MQ_DENY_NONE);
pMessage->Body = static_cast(pAnalisis);
pMessage->发送(pQueue);
这是序列化代码
STDMETHODIMP CANalisis::Load( IStream *pStm )
{
乌龙cb;
HRESULT 小时;
如果 (NULL==pStm)
返回 ResultFromScode(E_POINTER);
// 从流中读取一个对象。
//
hr=pStm->Read(&img, sizeof(Image), &cb);
如果(失败(小时))
返回小时;
如果(大小(图像)!= cb)
返回 E_FAIL;
返回无错误;
}
STDMETHODIMP CANalisis::Save( IStream *pStm, BOOL bClearDirty )
{
乌龙cb;
HRESULT 小时;
如果 (NULL==pStm)
返回 ResultFromScode(E_POINTER);
// 将对象写入流中。
hr=pStm->Write(&img, (ULONG)sizeof(Image), &cb);
if (FAILED(hr) || sizeof(Image)!=cb)
返回 ResultFromScode(STG_E_WRITEFAULT);
返回无错误;
}
如果我在生产者中获得 BSTR 值(在序列化之前) pAnalisis-getImgName(),它工作正常。相反,当我尝试在消费者中获取它时,在从队列中读取消息后,它不会返回任何内容。其他值(例如大小)可以毫无问题地返回。
有谁知道如何通过 MSMQ 在 COM 对象内发送 BSTR 值?
我试图找到一些类似的例子,但完全是徒劳的。
问题是我得到了一个带有奇怪字符的非常奇怪的值或一个十六进制值,这取决于我如何提取值..问题是我永远不会得到正确的值。
我想知道,但是......我们确定可以发送 BSTR 值吗?如果我没记错的话,它是一个指向字符串的指针......我正在运行两个不同的进程(即生产者和消费者),所以它们使用不同的内存块,它们应该在不同的机器上运行。 ..
我试图将此信息作为 VARIANT 类型发送..但也迷路了。但是,这似乎比发送 BSTR 更牵强。
对此有任何想法吗?