Hat der Anrufer Notwendigkeit, die IShellBrowser * erhalten über die undokumentierte WM_GETISHELLBROWSER (WM_USER + 7) Nachricht veröffentlichen?

StackOverflow https://stackoverflow.com/questions/1909853

  •  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?

War es hilfreich?

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.

scroll top