J'essaie d'envoyer un objet COM sur un message MSMQ en C++. C'est mon objet:envoie un objet COM avec un type de valeur BSTR dans un message MSMQ
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);
Tout va bien et je peux obtenir l'objet entier mais les types BSTR. Les flottants et les nombres entiers sont correctement envoyés et reçus. Mais les types BSTR ne fonctionnent pas. J'essaie d'envoyer des chaînes et ne peux pas trouver le chemin. J'ai essayé avec VARIANT à la place et le résultat était faux aussi. D'une certaine manière, il semble que les chaînes ne sont pas sérialisées.
Voici quelques-uns des get et fonctions définies pour mon composant ATL:
Celui-ci fonctionne très bien:
STDMETHODIMP CAnalisis::getLight(FLOAT* light) { *light=img.light; return S_OK; } STDMETHODIMP CAnalisis::setLight(FLOAT light) { img.light=light; return S_OK; }
Celui-ci ne compte pas:
STDMETHODIMP CAnalisis::getImgName(BSTR* imgName) { *imgName = img.imgName; return S_OK; } STDMETHODIMP CAnalisis::setImgName(BSTR imgName) { img.imgName=imgName; return S_OK; }
et c'est la façon dont je crée le message MSMQ et remplis les valeurs dans mon producteur:
// 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);
ici est le code de sérialisation
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; }
Si je reçois la valeur BSTR dans le producteur (avant sérialisation), pAnalisis-getImgName()
, il fonctionne très bien. En revanche, lorsque j'essaie de l'obtenir chez le consommateur, après avoir lu le message de la file d'attente, il ne renvoie rien. Les autres valeurs, telles que la taille, sont renvoyées sans problème.
Est-ce que quelqu'un sait comment envoyer une valeur BSTR dans un objet COM via MSMQ?
J'ai essayé de trouver des exemples similaires mais totalement en vain. Le fait est que je reçois soit une valeur très bizarre avec des caractères étranges ou une valeur hexadécimale, selon la façon dont j'extrais la valeur .. le fait est que je n'ai jamais la bonne valeur.
et je me demandais, cependant ... sommes-nous sûrs qu'il est possible d'envoyer une valeur BSTR? si je ne me trompe pas, c'est un pointeur sur une chaîne ... J'exécute deux processus différents (ie producteur et consommateur), donc ils utilisent des blocs de mémoire différents, et ils sont destinés à être exécutés sur des machines différentes. J'ai essayé d'envoyer cette info comme un type VARIANT .. mais aussi perdu. Cependant, cela semble un peu moins tiré par les cheveux que d'envoyer un BSTR.
TOUTES LES IDÉES?
donc vous voulez dire que je devrais enlever ceci de la structure, si je ne me trompe pas:
– markitus82Non, modifiez le code de sérialisation. Réponse éditée pour clarifier. – sharptooth
IL A TRAVAILLÉ !!!! J'ai abandonné il y a environ deux semaines, après avoir lutté pendant quelques jours. maintenant c'est fait dans un moment. Merci beaucoup. Je viens de marquer cette réponse comme la bonne, et totalement utile. Je suis sûr que cela sera utile pour de nombreux autres programmeurs car il n'y a pas d'exemples du tout.AMAZING! ThxAmillion! – markitus82