Hat der Anrufer Notwendigkeit, die IShellBrowser * erhalten über die undokumentierte WM_GETISHELLBROWSER (WM_USER + 7) Nachricht veröffentlichen?
-
19-09-2019 - |
Frage
Einige haben darauf hingewiesen, dass es existiert eine nicht dokumentierte Nachricht, dass abruft die IShellBrowser Interface-Zeiger aus dem gemeinsamen Dialog HWND für die Datei öffnen und speichern Dialoge.
Aber es gibt widersprüchlichen Informationen (oder keine Informationen), ob der Zeiger ist AddRef'd, oder wenn es nur die rohe Adresse zurückgegeben wird, und kein Release () soll es heißen?
Lösung
Nein. Die Regeln des Component Object Model .
Auszug:
Referenz-Zählregeln
Regel 1: AddRef muss genannt werden jede neue Kopie einer Schnittstelle Zeiger und Release genannt für jeden Zerstörung eines Schnittstellenzeiger, es sei denn, andere Regeln explizit erlaubt sonst.
Die folgenden Regeln rufen gemeinsam nonexceptions 1 Regel.
- Regel 1a: In-out-Parameter an Funktionen. Der Anrufer muss die tatsächlichen Parameter AddRef, da sie durch die Angerufenen freigegeben werden, wenn der Out-Wert auf ihn gespeichert ist.
- Regel 1b: Fetching eine globale Variable. Die lokale Kopie der Schnittstellenzeiger geholt aus einer vorhandenen Kopie des Zeigers in einer globalen Variablen müssen unabhängig Verweis gezählt werden, da aufgerufenen Funktionen könnten die Kopie in den globalen zerstören, während die lokale Kopie noch am Leben ist.
- Regel 1c: „dünne Luft“ New Zeiger synthetisiert aus Eine Funktion, die einen Schnittstellenzeiger mit speziellem internem Wissen synthetisiert, anstatt es aus einer anderen Quelle zu erhalten, muss eine anfängliche AddRef auf den neu synthetisierten Zeigern tun. Wichtige Beispiele für solche Routinen umfassen zB Erstellung Routinen, Implementierungen von IUnknown :: Query-Interface, und so weiter.
- Regel 1d: eine Kopie eines intern gespeicherten Zeiger zurückkehrend. Nachdem der Zeiger zurückgegeben wurde, hat der Angerufene keine Ahnung, wie seine Lebensdauer der intern gespeicherten Kopie des Zeigers auf das bezieht. Somit muss der Angerufene AddRef auf den Zeiger Kopie aufrufen, bevor es zurück.
Regel 2: Spezielle Kenntnisse seitens ein Stück Code, der Beziehungen von den Anfängen und die Endungen der Lebensdauern von zwei oder mehr Kopien eines Interface-Zeiger kann erlauben AddRef / Veröffentlichung Paare zu sein weggelassen.
- Aus Sicht des COM-Client, Referenzzählung ist immer ein pro-Interface-Konzept. Kunden sollten nie davon ausgehen, dass ein Objekt den gleichen Referenzzähler für alle Schnittstellen verwendet.
- Die Rückgabewerte von AddRef und Release sollte sich nicht darauf verlassen, und sollte nur für Debugging-Zwecke verwendet werden.
- Zeigerstabilität; siehe Details in der OLE-Hilfedatei unter „Reference-Counting Regeln“, Unterabschnitt „Die Stabilisierung der diese Zeiger und halten es gültig.“
Sehen Sie die ausgezeichnete „Objektverwaltung Lebensdauern in OLE“technischen Artikel von Douglas Hodges, und Kapitel 3 Inside OLE, 2. Auflage, von Kraig Brockschmidt (MSDN Library, Bücher) für Weitere Informationen zu Referenzzählung.