Erstellen der globalen Schnittstellentabelle
Verwenden Sie den folgenden Aufruf, um das objekt der globalen Schnittstellentabelle zu erstellen und einen Zeiger auf IGlobalInterfaceTable abzurufen:
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 hergestellt werden. Dadurch werden die externen Symbole CLSID_StdGlobalInterfaceTable und IID_IGlobalInterfaceTable aufgelöst.
Es gibt eine einzelne instance der globalen Schnittstellentabelle pro Prozess, sodass alle Aufrufe dieser Funktion in einem Prozess denselben instance 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 Speicherort 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 Workerthread in einem anderen Apartment übergeben möchten. Anstatt ihn in einen Stream marshallen und den Stream als Threadparameter an den Workerthread übergeben zu müssen, ermöglicht IGlobalInterfaceTable die einfache Übergabe eines Cookies.
Wenn Sie die Schnittstelle in der globalen Schnittstellentabelle registrieren, erhalten Sie ein Cookie, das Sie verwenden können, anstatt den tatsächlichen Zeiger zu übergeben (wenn Sie den Zeiger übergeben müssen), entweder an einen nichtmethodischen Parameter, der zu einem anderen Apartment wechselt (als Parameter für ThreadProc über CreateThread) oder in den Prozessspeicher, auf den außerhalb Ihres Apartments zugegriffen werden kann.
Vorsicht ist erforderlich, da die Verwendung von globalen Schnittstellen den Programmierer zusätzlich belastet, Probleme wie Racebedingungen und gegenseitige Ausgrenzung zu verwalten, die mit dem gleichzeitigen Zugriff auf den globalen Zustand von 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.
Zugehörige Themen