Я пытаюсь отправить объект COM поверх сообщения MSMQ на C ++. Это мой объект:
class ATL_NO_VTABLE CAnalisis :
public CComObjectRootEx,
public CComCoClass,
public ISupportErrorInfo,
public IDispatchImpl,
public IPersistStreamInit
{
private:
typedef struct {
DOUBLE size;
float color;
float light;
BSTR imgName;
BSTR uname;
} Image;
Image img;
STDMETHOD(Load)(IStream *pStm);
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
Все идет хорошо, и я могу получить весь объект, кроме типов BSTR. Плавающие и целые числа правильно отправлены и получены. Но типы BSTR не работают. Я пытаюсь отправить строки и не могу найти способ. Вместо этого я попробовал использовать VARIANT, и результат оказался неверным. Почему-то похоже, что строки не сериализованы.
Вот некоторые функции get и set для моего компонента ATL:
Этот работает нормально:
STDMETHODIMP CAnalisis::getLight(FLOAT* light)
{
*light=img.light;
return S_OK;
}
STDMETHODIMP CAnalisis::setLight(FLOAT light)
{
img.light=light;
return S_OK;
}
Этот не:
STDMETHODIMP CAnalisis::getImgName(BSTR* imgName)
{
*imgName = img.imgName;
return S_OK;
}
STDMETHODIMP CAnalisis::setImgName(BSTR imgName)
{
img.imgName=imgName;
return S_OK;
}
и таким образом я создаю сообщение MSMQ и заполняю значения в моем производителе:
// For these ActiveX components we need only smart interface pointer
IMSMQQueueInfosPtr pQueueInfos;
IMSMQQueueInfoPtr pQueueInfo;
IMSMQQueuePtr pQueue;
IUnknownPtr pIUnknown;
// Instanciate the follwing ActiveX components
IMSMQQueryPtr pQuery(__uuidof(MSMQQuery));
IMSMQMessagePtr pMessage(__uuidof(MSMQMessage));
IAnalisisPtr pAnalisis(__uuidof(Analisis));
WCHAR * imagen;
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->Send(pQueue);
вот код сериализации
STDMETHODIMP CAnalisis::Load( IStream *pStm )
{
ULONG cb;
HRESULT hr;
if (NULL==pStm)
return ResultFromScode(E_POINTER);
// Read an object from the stream.
//
hr=pStm->Read(&img, sizeof(Image), &cb);
if (FAILED(hr))
return hr;
if (sizeof(Image) != cb)
return E_FAIL;
return NOERROR;
}
STDMETHODIMP CAnalisis::Save( IStream *pStm, BOOL bClearDirty )
{
ULONG cb;
HRESULT hr;
if (NULL==pStm)
return ResultFromScode(E_POINTER);
// Write an object into the stream.
hr=pStm->Write(&img, (ULONG)sizeof(Image), &cb);
if (FAILED(hr) || sizeof(Image)!=cb)
return ResultFromScode(STG_E_WRITEFAULT);
return NOERROR;
}
Если я получаю значение BSTR в производителе (до сериализации), pAnalisis-getImgName()
, это работает нормально. Напротив, когда я пытаюсь получить его у потребителя, после прочтения сообщения из очереди оно ничего не возвращает. Другие значения, такие как размер, возвращаются без проблем.
Кто-нибудь знает, как отправить значение BSTR внутри COM-объекта через MSMQ?
Я пытался найти несколько похожих примеров, но безуспешно.
Дело в том, что я получаю либо очень странное значение со странными символами, либо шестнадцатеричное значение, в зависимости от того, как я извлекаю значение ... Дело в том, что я никогда не получаю правильное значение.
и мне было интересно, однако ... мы уверены, что можно отправить значение BSTR? если я не ошибаюсь, это указатель на строку ... Я запускаю два разных процесса (т.е. производителя и потребителя), поэтому они используют разные блоки памяти, и они предназначены для запуска на разных машинах, так. ..
Я пытался отправить эту информацию как тип VARIANT .. но тоже потерялся. Однако, это кажется немного менее надуманным, чем отправка BSTR.
ЛЮБЫЕ ИДЕИ НА ЭТОМ?