2012-09-21 3 views
5

ich durch einige älteren C++ Code mit dem Windows Imaging Component Bibliothek zu tun zu gehen und ich beobachtete dies:Übergabe einen CComPtr auf eine Funktion mit einem rohen Zeiger Prototyp

void setProperties(IPropertyBag2* const pBag) 
{ 
    pBag->Write(...); 
} 

void other_function() 
{ 
    CComPtr<IPropertyBag2> pBag; 
    //Code to initialize pBag 
    setProperties(pBag); 
} 

Die setProperties Methode schreibt einfach ein Bündel von Eigenschaften der Eigenschaft Tasche. Der Code kompiliert und läuft gut, weil ich denke, dass es den entsprechenden Typcasting-Operator aufruft.

Meine Frage ist, ob eine solche Schnittstelle empfohlen wird oder gibt es eine bessere Möglichkeit, den Zeiger zu übergeben. Zum Beispiel gibt es einen Unterschied (in Bezug auf die Sicherheit/Leistung), wenn die Signatur geändert wurde:

void setProperties(const CComPtr<IPropertyBag2>& pBag) 

Antwort

2

Raw-Schnittstellenzeiger sind die kanonische Methode, mit COM-Objekten zu arbeiten. Sie sind auch die flexibelsten. Wenn Sie einen Verweis auf ein CComPtr verwenden, können Sie CComPtr immer verwenden.

Jeder COM-Zeiger, auch ein dummer, ist automatisch ein intelligenter Zeiger, da das Objekt selbst AddRef und Release implementiert. Wenn die Funktion keine Kopie des Zeigers beibehält, braucht man sich darüber nicht zu sorgen.

Der CComPtr-Typ wird automatisch automatisch in einen Rohzeiger umgewandelt.

+3

Die Verwendung eines CComPtr-Parameters bindet Sie nicht immer an CComPtr, da CComPtr-Konstruktoren nicht explizit sind. Und rohe Schnittstellenzeiger sind keine intelligenten Zeiger. Das Vergessen eines Objekts wird zu einem Leck führen. Es hat alle die gleichen Probleme wie das Vergessen, Speicher zu löschen, der mit "neu" zugewiesen wurde. – user1610015

1

Es gibt nicht viele Vorteile bei der Verwendung eines CComPtr Parameter (es sei denn, es ist nicht konstanten und Sie‘ werde es ändern). CComPtr ist nützlicher für lokale Variablen und Instanzvariablen.

Aber es ist OK, es zu tun, wenn nur als eine Frage der Stil/Konsistenz.