2009-09-18 14 views
10

Mam wygenerowany obiekt ATL COM przy użyciu VS2008 i kod zawiera odniesienia do definicji zwanej _MERGE_PROXYSTUB (bo wybrałem opcję „Merge proxy/stub” Kiedy początkowo prowadził kreatora.)Jaki jest sens _MERGE_PROXYSTUB?

Co jest punktem proxy/stub? Jeśli nie wybiorę opcji scalania, zamiast tego otrzymam oddzielną MyControlPS.DLL - kiedy to kiedykolwiek zostanie użyte?

FWIW Sterowanie wydaje się rejestrować i działa poprawnie, jeśli usunę cały kod otoczony przez definicje _MERGE_PROXYSTUB. Kompilacja debugowania nie definiuje nawet _MERGE_PROXYSTUB i nadal działa poprawnie.

Czy mogę więc obejść się bez proxy/kodu pośredniczącego?

Odpowiedz

14

Potrzebujesz proxy/kodu pośredniczącego, jeśli chcesz, aby obiekt COM był wywoływany z aplikacji przy użyciu innego modelu wątkowania niż obiekt COM.

Na przykład mamy wtyczkę, która jest ładowana przez aplikację, która używa określonego modelu wątków (nie pamiętam, która), ale naszym obiektem COM jest wielowątkowe mieszkanie (MTA) - więc proxy/skrót to wymagane do przekazywania danych między obiektami podczas wywoływania funkcji, przy jednoczesnym zachowaniu reguł modelu wątków.

Jeśli te zasady są łamane, a następnie COM albo będzie wyjątek lub zwracają HRESULT awarii takiej jak RPC_E_WRONG_THREAD

Jeśli nie zaznaczysz opcję scalania proxy/skrótową, a następnie visual studio tworzy indywidualne projekt dla proxy/stubów, które zostaną wbudowane w osobną bibliotekę dll. Utrudnia to wdrażanie, jeśli są one wymagane, ale możesz je po prostu zignorować, jeśli nie masz wpływu na problemy z modelowaniem wątków.

Więc można zrobić bez proxy/odcinki jeżeli wniosek wywołanie obiektu COM jest przy użyciu tego samego modelu wątków jako obiektu

Larry Osterman zapewnia czytelny wprowadzenie do threading models na swoim blogu.

3

Ponadto, jeśli interfejsy zawierają tylko typy przyjazne bibliotece typów (BSTR, VARIANT, itp.) I pojawiają się w bloku biblioteki IDL, możesz wybrać opcję "wpisz bibliotekę uporządkowaną", co oznacza, że ​​system pod warunkiem, że proxy/stub używa metadanych z biblioteki typów.

Gdy interfejsy są umieszczane wewnątrz bloku biblioteki, a DllRegisterServer jest dostosowany do rejestrowania biblioteki typów (przekazywać TRUE do XxxModule :: DllRegisterServer, jeśli dobrze pamiętam) twoje interfejsy będą zestawione przez system, jeśli to konieczne, zgodnie z opisem John Sibly.

W tym momencie proxy/skrót nie jest nawet używany, więc _MERGE_PROXYSTUB nie daje żadnego efektu.