Erstellen der globalen Schnittstellentabelle
Verwenden Sie den folgenden Aufruf, um das globale Schnittstellentabellenobjekt zu erstellen und einen Zeiger auf IGlobalInterfaceTable zu erhalten:
HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGlobalInterfaceTable,
(void **)&gpGIT);
if (hr != S_OK) {
exit(0); // Handle errors here.
}
Hinweis
Beim Erstellen des globalen Schnittstellentabellenobjekts mithilfe des vorherigen Aufrufs muss eine Verknüpfung mit der Bibliothek uuid.lib erstellt werden. Dadurch werden die externen Symbole CLSID _ StdGlobalInterfaceTable und IID _ IGlobalInterfaceTable behoben.
Es gibt eine einzelne Instanz der globalen Schnittstellentabelle pro Prozess, sodass alle Aufrufe dieser Funktion in einem Prozess dieselbe Instanz zurückgeben.
Registrieren Sie nach dem Aufruf der CoCreateInstance-Funktion die Schnittstelle aus dem Apartment, in dem sie sich befindet, mit einem Aufruf der RegisterInterfaceInGlobal-Methode. Diese Methode stellt ein Cookie bereit, das die Schnittstelle und deren Position identifiziert. Ein Apartment, das einen Zeiger auf diese Schnittstelle sucht, ruft dann die GetInterfaceFromGlobal-Methode mit diesem Cookie auf, und die Implementierung stellt dann einen Schnittstellenzeiger auf das aufrufende Apartment bereit. Um die globale Registrierung der Schnittstelle zu widerrufen, kann jedes Apartment die RevokeInterfaceFromGlobal-Methode aufrufen.
Ein einfaches Beispiel für die Verwendung von IGlobalInterfaceTable wäre, wenn Sie einen Schnittstellenzeiger für ein Objekt in einem Singlethread-Apartment (STA) an einen Arbeitsthread in einem anderen Apartment übergeben möchten. Anstatt sie in einen Stream marshallen und den Stream als Threadparameter an den Arbeitsthread übergeben zu müssen, können Sie mit IGlobalInterfaceTable einfach ein Cookie übergeben.
Wenn Sie die Schnittstelle in der globalen Schnittstellentabelle registrieren, erhalten Sie ein Cookie, das Sie verwenden können, anstatt den tatsächlichen Zeiger (immer wenn Sie den Zeiger übergeben müssen) zu übergeben, entweder an einen Nichtmethodenparameter, der in ein anderes Apartment (als Parameter für ThreadProc über CreateThread)geht, oder an den Prozessspeicher, auf den außerhalb Ihres Apartment zugegriffen werden kann.
Vorsicht ist erforderlich, da die Verwendung globaler Schnittstellen den Programmierer zusätzlich belastet, probleme wie Racebedingungen und gegenseitigen Ausschluss zu verwalten, die mit dem gleichzeitigen Zugriff auf den globalen Zustand aus mehreren Threads verbunden sind.
COM stellt eine Standardimplementierung der IGlobalInterfaceTable-Schnittstelle bereit. Es wird dringend empfohlen, diese Standardimplementierung zu verwenden, da sie vollständige threadsichere Funktionen bietet.