2009-05-05 8 views
5

Rozumiem, że CoCreateInstance znajduje serwer COM dla danego ID klasy, tworzy instancję obiektu dla tego identyfikatora i pobiera interfejs z tej instancji obiektu. CoGetClassObject() znajduje serwer COM dla identyfikatora klasy, tworzy instancję fabryki klas dla tego id klasy i pobiera ten fabryczny interfejs klasy, który może być następnie użyty do tworzenia rzeczywistych obiektów.Jaka jest różnica między CoCreateInstance() i CoGetClassObject() podczas tworzenia obiektów na tym samym komputerze?

Jak inaczej te funkcje różnią się, gdy są używane do tworzenia obiektów na tym samym komputerze? Czy działają one w ten sam sposób, ale powodują, że inny kod jest wywoływany na dokładnie tym samym serwerze COM?

Odpowiedz

8

CoGetClassObject zasadniczo zwraca wskaźnik do fabryki dla określonego interfejsu. Pod maską CoCreateInstance korzysta z CoGetClassObject. Zaletą wywoływania CoGetClassObject jest to, że pozwala tylko raz utworzyć fabrykę klas, jeśli chcesz utworzyć wiele instancji danego obiektu.

Sekcja MSDN na CoGetClassObject zawiera krótką dyskusję na temat tego, w jaki sposób można skorzystać z tej funkcji.

+0

Przeczytałem, że, ale nie widzę żadnych korzyści poza tym, że CoGetClassObject() jest potencjalnie szybszy, a obiekt fabryki klasy może utrzymywać stan pomiędzy wywołaniami CreateInstance(). – sharptooth

+1

@ Sharppt, to prawie jist tego. Niezbyt wiele korzyści, dlatego rzadko go używasz. – JaredPar

+0

Czy jest szansa, że ​​istnieją inne subtelne różnice, takie jak kolejność wyszukiwania zależności? Czy te funkcje działają tak samo, ale po prostu wywołuj inny kod na tym samym serwerze COM? – sharptooth

1

Jeden scenariusz oprócz tego, co powiedział JaredPar - wywołać funkcji CoGetClassObject powrót fabrykę klasy (zwraca DllGetClassObject eksportowane funkcję biblioteki DLL w przypadku serwera InProc). Fabryka klas służy do tworzenia instancji klasy Coclass. CoCreateInstance wewnętrznie wywołuje CoGetClassObject, pobiera wymaganą fabrykę klas, a następnie używa jej do utworzenia instancji żądanej coclass. Podczas wywoływania CoCreateInstance, nie można opóźnić tworzenia koklass. Są chwile, kiedy tworzenie coclass może być kosztowne i chciałbyś opóźnić jego utworzenie, ale nadal masz dostęp do fabryki klas, aby można było utworzyć instancję coclass na żądanie.