Ich versuche, ein COM-Objekt über eine MSMQ-Nachricht in C++ zu senden. Das ist mein Objekt:senden Sie ein COM-Objekt mit einem BSTR-Werttyp in einer MSMQ-Nachricht
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);
Alles geht gut und ich kann das ganze Objekt aber die BSTR-Typen bekommen. Floats und Integer werden ordnungsgemäß gesendet und empfangen. Aber die BSTR-Typen funktionieren nicht. Ich versuche, Strings zu senden und kann den Weg nicht finden. Ich habe es stattdessen mit VARIANT versucht und das Ergebnis war auch falsch. Irgendwie sieht es so aus, als ob die Strings nicht serialisiert sind.
Dies sind einige der Get- und Set-Funktionen für meine ATL-Komponente:
Dieses funktioniert gut:
STDMETHODIMP CAnalisis::getLight(FLOAT* light) { *light=img.light; return S_OK; } STDMETHODIMP CAnalisis::setLight(FLOAT light) { img.light=light; return S_OK; }
Dieses nicht:
STDMETHODIMP CAnalisis::getImgName(BSTR* imgName) { *imgName = img.imgName; return S_OK; } STDMETHODIMP CAnalisis::setImgName(BSTR imgName) { img.imgName=imgName; return S_OK; }
und das ist die Art, wie ich die MSMQ-Nachricht erstelle und die Werte in meinem Producer fülle:
// 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);
hier ist die Serialisierungscode
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; }
Wenn ich den BSTR Wert in dem Erzeuger (vor der Serialisierung) erhalten, pAnalisis-getImgName()
, es funktioniert gut. Im Gegensatz dazu, wenn ich versuche, es in den Verbraucher zu bekommen, nach dem Lesen der Nachricht aus der Warteschlange, gibt es nichts zurück. Die anderen Werte, z. B. die Größe, werden ohne Probleme zurückgegeben.
weiß jemand, wie man einen BSTR-Wert innerhalb eines COM-Objekts durch MSMQ sendet?
Ich habe versucht, einige ähnliche Beispiele zu finden, aber völlig umsonst.
die Sache ist, dass ich entweder einen sehr seltsamen Wert mit komischen Zeichen oder einem hexadezimalen Wert bekomme, abhängig davon, wie ich den Wert extrahiere .. die Sache ist, dass ich nie den richtigen Wert bekomme.
und ich frage mich, aber ... sind wir sicher, dass es möglich ist, einen BSTR-Wert zu senden? Wenn ich nicht falsch liege, ist es ein Zeiger auf eine Zeichenkette ... Ich führe zwei verschiedene Prozesse aus (dh Producer und Consumer), also benutzen sie verschiedene Speicherblöcke und sie sollen auf verschiedenen Maschinen laufen. ..
Ich habe versucht, diese Informationen als VARIANT-Typ zu senden .. ging aber auch verloren. Dies erscheint jedoch etwas weniger weit hergeholt als das Senden eines BSTR.
JEDE IDEEN ZU DIESEM?
so meinst du, dass ich das aus der Struktur nehmen sollte, wenn ich mich nicht irre:
– markitus82Nein, ändern Sie den Serialisierungscode. Bearbeitete Antwort zu klären. – sharptooth
ES GEARBEITET !!!! Ich gab vor ungefähr 2 Wochen auf, nachdem ich für ein paar Tage gekämpft habe. jetzt ist es schon lange fertig. ich danke dir sehr. Ich habe diese Antwort gerade als die richtige markiert, und total hilfreich.Ich bin sicher, dass dies für viele andere Programmierer nützlich sein wird, da es überhaupt keine Beispiele gibt. Erstaunlich! ThxAmillion! – markitus82