2009-10-28 17 views

Odpowiedz

3

W this answer do innej kwestii dotyczącej Organizowanie user voyce punkty this article że w zasadzie stanowi, co następuje:

Kiedy każdy interfejs (IDispatch pochodzący lub nie) jest oznaczony albo dual lub oleautomation (lub oba) jest traktowany specjalnie, gdy RegisterTypeLib() jest wywoływana (co zwykle jest wykonywane przez DllRegisterServer). Dla każdego takiego interfejsu tworzony jest klucz HKCR \ Interface {InterfaceId}, pod którym klasa {00020424-0000-0000-C0000-000000000046} jest określana jako proxy/stub. Ten identyfikator klasy odpowiada typelibowi marshallerowi, znanemu także jako oleautomation marshaller.

+0

Ach tak, zgadza się. Ponieważ miałeś już "oleautomation", pomyślałem, że to było ukryte ... Nie znałem jednak dokładnej specyfikacji, więc dziękuję za kontynuację! –

+0

Nadal uważam, że powinieneś upewnić się, że obiekt nie odpowiada obecnie na QI dla 'IDispatch' zanim go usuniesz. –

+0

Tak, całkowicie zgadzam się z odpowiedzią QI z IDispatch. – sharptooth

1

Nie widzę powodu, że będzie działać, podane tutaj docs: http://msdn.microsoft.com/en-us/library/aa366807(VS.85).aspx

Interfejsy określone przez podwójną atrybutu musi być zgodna z Automatyki i wyprowadzić z IDispatch. Ten atrybut nie jest dozwolony w przypadku dispinterfaces.

Możliwe, że atrybut [dual] domyślnie dodaje IDispatch do interfejsu.

Co można zrobić, to sprawdzić kod implementujący interfejs (zakładając, że jest to ATL), jeśli pochodzi od IDispatchImpl. Jeśli tak, to faktycznie odpowiada QI dla IDispatch i może być używany jako taki.

Inną opcją jest utworzenie obiektu implementującego IOurInterface i QI dla IDispatch - jeśli się powiedzie, prawdopodobnie nie można go usunąć.

Właściwie, pomyśl o tym, być może [dual] nie wymaga technicznie, aby uzyskać z IDispatch, o ile zaimplementować zarówno niestandardowy interfejs i IDispatch?