Udostępnij przez


Korzystanie z obiektów klienta

Aby uzyskać przegląd roli obiektów klienta w interakcji z silnikiem debugera, zobacz Obiekty klienta.

Ogólnie rzecz biorąc, metody klienta mogą być wywoływane tylko z wątku, w którym został utworzony klient. Zazwyczaj metody wywoływane z nieprawidłowego wątku natychmiast kończą się niepowodzeniem. Godnym uwagi wyjątkiem od tej reguły jest metoda CreateClient; Ta metoda może być wywoływana z dowolnego wątku i zwraca nowego klienta, którego można użyć w wątku, z którego została wywołana. Inne wyjątki są udokumentowane w sekcji referencyjnej.

Ciąg opisujący obiekt klienta jest zwracany przez metodę GetIdentity lub można zapisać w strumieniu wyjściowym silnika przy użyciu OutputIdentity.

Interfejsy COM

Interfejs API silnika debugera zawiera kilka interfejsów podobnych do COM; implementują interfejs IUnknown.

Interfejsy opisane w sekcji Interfejsy aparatu debugowania są implementowane przez klienta (choć niekoniecznie w najnowszej wersji). Możesz użyć metody COM IUnknown::QueryInterface , aby uzyskać każdy z tych interfejsów z innych.

Klienci implementują interfejs IUnknown COM i używają go do obsługi liczników odwołań i wyboru interfejsu. Jednak klienci nie są zarejestrowanymi obiektami COM. Metoda IUnknown::AddRef służy do przyrostowania liczby odwołań w obiekcie, a metoda IUnknown::Release służy do dekrementacji liczby odwołań. Gdy wywoływana jest funkcja IUnknown::QueryInterface , liczba odwołań jest zwiększana, więc gdy wskaźnik interfejsu klienta nie jest już potrzebny, należy wywołać metodę IUnknown::Release , aby usunąć liczbę odwołań.

Liczba odwołań zostanie zainicjowana do jednej po utworzeniu obiektu klienta przy użyciu polecenia DebugCreate lub DebugConnect.

Zobacz zestaw SDK platformy, aby uzyskać więcej informacji o tym, kiedy liczby odwołań powinny być zwiększane i dekrementowane.

IUnknown::QueryInterface, DebugCreate i DebugConnect każdy ma identyfikator interfejsu jako jeden z ich argumentów. Ten identyfikator interfejsu można uzyskać przy użyciu operatora __uuidof . Na przykład:

IDebugClient * debugClient;
HRESULT Hr = DebugCreate( __uuidof(IDebugClient), (void **)&debugClient );

Ważne Interfejsy IDebug*, takie jak IDebugEventCallbacks, chociaż podobne do COM, nie są prawdziwymi interfejsami API COM. Wywoływanie tych interfejsów z zarządzanego kodu nie jest obsługiwanym scenariuszem. Problemy, takie jak zbieranie śmieci i zarządzanie właścicielstwem wątków, prowadzą do niestabilności systemu, kiedy interfejsy są wywoływane przy użyciu kodu zarządzalnego.