Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Widzieliśmy wcześniej, że obiekt może zaimplementować więcej niż jeden interfejs. Obiekt Wspólnego okna dialogowego jest realnym przykładem tego. Aby obsługiwać najbardziej typowe zastosowania, obiekt implementuje interfejs IFileOpenDialog. Ten interfejs definiuje podstawowe metody wyświetlania okna dialogowego i uzyskiwania informacji o wybranym pliku. Jednak w celu bardziej zaawansowanego użycia obiekt implementuje również interfejs o nazwie IFileDialogCustomize. Program może użyć tego interfejsu, aby dostosować wygląd i zachowanie okna dialogowego, dodając nowe kontrolki interfejsu użytkownika.
Pamiętaj, że każdy interfejs COM musi dziedziczyć bezpośrednio lub pośrednio z interfejsu IUnknown. Na poniższym diagramie przedstawiono dziedziczenie obiektu dialogu wspólnego elementu.
Jak widać na diagramie, bezpośredni przodek IFileOpenDialog jest interfejsem IFileDialog, który dalej dziedziczy IModalWindow. W miarę przechodzenia w górę łańcucha dziedziczenia z IFileOpenDialog do IModalWindowinterfejsy definiują coraz bardziej uogólnione funkcje okien. Na koniec interfejs IModalWindow dziedziczy IUnknown. Obiekt wspólnego okna dialogowego implementuje również IFileDialogCustomize, który istnieje w osobnej hierarchii dziedziczenia.
Teraz załóżmy, że masz wskaźnik do interfejsu IFileOpenDialog. Jak uzyskać wskaźnik do interfejsu IFileDialogCustomize?
Po prostu rzutowanie wskaźnika IFileOpenDialog na wskaźnik IFileDialogCustomize nie będzie działać. Nie ma niezawodnego sposobu "rzutowania krzyżowego" w hierarchii dziedziczenia bez jakiejś formy informacji o typie czasu wykonywania (RTTI), która jest wysoce zależną od języka funkcją.
Podejście COM polega na zapytać obiektu, aby dać IFileDialogCustomize wskaźnik, używając pierwszego interfejsu jako kanału do obiektu. Odbywa się to przez wywołanie metody IUnknown::QueryInterface z pierwszego wskaźnika interfejsu. Możesz traktować QueryInterface jako niezależną od języka wersję słowa kluczowego dynamic_cast w języku C++.
Metoda QueryInterface ma następujący podpis:
HRESULT QueryInterface(REFIID riid, void **ppvObject);
Na podstawie tego, co już wiesz o CoCreateInstance, możesz odgadnąć, jak działa QueryInterface.
- Parametr riid to GUID, który określa interfejs, którego potrzebujesz. Typ danych REFIID to definicja typu typedef dla
const GUID&. Zwróć uwagę, że identyfikator klasy (CLSID) nie jest wymagany, ponieważ obiekt został już utworzony. Wymagany jest tylko identyfikator interfejsu. - Parametr ppvObject otrzymuje wskaźnik do interfejsu. Typ danych tego parametru jest void**, z tego samego powodu, że CoCreateInstance używa tego typu danych: QueryInterface można użyć do wykonywania zapytań dla dowolnego interfejsu COM, więc parametr nie może być silnie wpisany.
Oto jak wywołać QueryInterface, aby uzyskać wskaźnik IFileDialogCustomize.
hr = pFileOpen->QueryInterface(IID_IFileDialogCustomize,
reinterpret_cast<void**>(&pCustom));
if (SUCCEEDED(hr))
{
// Use the interface. (Not shown.)
// ...
pCustom->Release();
}
else
{
// Handle the error.
}
Jak zawsze sprawdź wartość zwracaną HRESULT, jeśli metoda nie powiedzie się. Jeśli metoda powiedzie się, należy wywołać Release po zakończeniu korzystania ze wskaźnika, zgodnie z opisem w Zarządzanie okresem istnienia obiektu.
Następny