Udostępnij za pośrednictwem


Tworzenie tabeli interfejsu globalnego

Użyj następującego wywołania, aby utworzyć obiekt tabeli interfejsu globalnego i uzyskać wskaźnik do IGlobalInterfaceTable:

HRESULT hr;
hr = CoCreateInstance(CLSID_StdGlobalInterfaceTable,
                 NULL,
                 CLSCTX_INPROC_SERVER,
                 IID_IGlobalInterfaceTable,
                 (void **)&gpGIT);
if (hr != S_OK) {
  exit(0); // Handle errors here.
}

Notatka

Podczas tworzenia obiektu tabeli interfejsu globalnego przy użyciu poprzedniego wywołania należy połączyć się z biblioteką uuid.lib. Spowoduje to rozwiązanie problemów z symbolami zewnętrznymi CLSID_StdGlobalInterfaceTable i IID_IGlobalInterfaceTable.

 

Istnieje jedno wystąpienie tabeli interfejsu globalnego na proces, więc wszystkie wywołania tej funkcji w procesie zwracają to samo wystąpienie.

Po wywołaniu funkcji CoCreateInstance zarejestruj interfejs w apartamencie, w którym się znajduje, poprzez wywołanie metody RegisterInterfaceInGlobal. Ta metoda dostarcza plik cookie identyfikujący interfejs i jego lokalizację. Mieszkanie szukające wskaźnika do tego interfejsu wywołuje następnie GetInterfaceFromGlobal metodę z tym plikiem cookie, a następnie implementacja dostarcza wskaźnik interfejsu do mieszkania wywołującego. Aby odwołać globalną rejestrację interfejsu, każde mieszkanie może wywołać metodę RevokeInterfaceFromGlobal.

Prostym przykładem użycia IGlobalInterfaceTable byłoby przekazanie wskaźnika interfejsu na obiekcie w jednowątkowym mieszkaniu (STA) do wątku roboczego w innym mieszkaniu. Zamiast marshalingu go do strumienia i przekazywania strumienia do wątku roboczego jako parametru wątku, IGlobalInterfaceTable pozwala po prostu przekazać plik cookie.

Podczas rejestrowania interfejsu w tabeli interfejsu globalnego otrzymujesz plik cookie, którego można użyć zamiast przekazywać rzeczywisty wskaźnik (za każdym razem, gdy trzeba przekazać wskaźnik), albo do innego parametru przechodzącego do innego mieszkania (jako parametru do ThreadProc za pośrednictwem CreateThread) lub do pamięci procesowej dostępnej poza mieszkaniem.

Wymagana jest ostrożność, ponieważ korzystanie z interfejsów globalnych nakłada na programistę dodatkową odpowiedzialność za zarządzanie problemami, takimi jak warunki wyścigu i wzajemne wykluczenie, które są związane z uzyskiwaniem dostępu do stanu globalnego z wielu wątków jednocześnie.

Com zapewnia standardową implementację interfejsu IGlobalInterfaceTable. Zdecydowanie zaleca się użycie tej standardowej implementacji, ponieważ zapewnia ona pełne funkcje bezpieczne wątkowo.

kiedy używać tabeli interfejsu globalnego