2008-11-04 6 views
9

OK, also konnte ich nicht wirklich an einen passenden Titel denken, der das zusammenfasst.COM, VARIANT enthält BSTR. Wer vergibt?

Die IPrintPipelinePropertyBag-Schnittstelle verfügt über die Methode AddProperty, die passend "eine Eigenschaft zu einem Eigenschaftenbeutel hinzufügt".

http://msdn.microsoft.com/en-us/library/aa506384.aspx

AddProperty ([in, string] const Wchar_t * pszName, [in] const VARIANT pVar *);

Wir verwenden den folgenden Code, um dem Eigenschaftenbeutel eine Zeichenfolge hinzuzufügen.

CComVariant varProperty = CComBSTR(someString); 
pPrintPropertyBag->AddProperty(L"SOME_PROPERTY", &varFilename); 

Es ist ziemlich offensichtlich, aber, dass die CComBSTR und CComVariant die erstellt wird, nach einer Weile den Gültigkeitsbereich verlässt. Ich bin mir nicht sicher, ob der PropertyBag die Zeichenfolge verarbeitet und eine eigene Kopie erstellt. Da wir alle möglichen Dinge in einem VARIANT speichern können, sollte dies nicht der Fall sein.

Angenommen, die Zeichenfolge wird nicht behandelt, ist meine Frage, was ist das Muster dafür in COM zu tun? Wie sollte ich ein VARIANT übergeben, das eine zugewiesene Zeichenfolge enthält, diese Zeichenfolge für andere Threads verfügbar machen, selbst wenn der Thread, der AddProperty genannt wird, zuerst gestorben ist, und die Zuweisung der Zeichenfolge ordnungsgemäß aufheben?

Antwort

14

Wenn Sie eine COM-Funktion mit Strings oder VARIANTs aufrufen, ist in den meisten Fällen die einzige Garantie, dass diese Objekte während des gesamten Aufrufs verfügbar sind. Nach dem Aufruf ist das Objekt selbst dafür verantwortlich, Kopien der Daten zu erstellen. Zum Beispiel wird VARIANT höchstwahrscheinlich die VariantCopy-Funktion verwenden, die Strings kopiert, COM-Objekte kopiert (die Anzahl der Referenzen erhöht). Die einzige Sache, um die Sie sich kümmern sollten, ist, wenn Sie eine tatsächliche Schnittstelle in der VARIANT übergeben: in diesem Fall sollte die Schnittstelle ordnungsgemäß gezählt werden, und QueryInterface, AddRef und Release sollten alle entsprechend implementiert werden. Und geben Sie das Objekt niemals wieder frei, bevor die Referenzzählung 0 erreicht;)

EDIT: Oh, und wenn Sie mehr über COM-Programmierung erfahren möchten, sollten Sie "Essential COM" von "Don Box" erhalten. Don Box ist der COM Guru, und das Buch wird Ihnen fast alles beibringen, was Sie jemals über COM und mehr wissen wollten;)