2009-09-18 14 views
10

Ich habe ein ATL COM-Objekt mit VS2008 und der Code enthält Verweise auf eine Definition erzeugt _MERGE_PROXYSTUB genannt (weil ich wählte die Option ‚Merge-Proxy/Stub‘, wenn ich zunächst den Assistenten ausgeführt haben.)Was ist der Punkt von _MERGE_PROXYSTUB?

Was der Punkt ist ein Proxy/Stub? Wenn ich die Zusammenführungsoption nicht auswähle, erhalte ich stattdessen eine separate MyControlPS.DLL - wann würde diese jemals verwendet werden?

FWIW scheint das Steuerelement zu registrieren und funktioniert gut, wenn ich den gesamten Code entfernen, der von _MERGE_PROXYSTUB definiert wird. Ein Debug-Build definiert nicht einmal _MERGE_PROXYSTUB und es funktioniert immer noch OK.

Also, kann ich ohne einen Proxy/Stub tun?

Antwort

14

Sie benötigen einen Proxy/Stub, wenn Sie möchten, dass Ihr COM-Objekt von einer Anwendung aufgerufen wird, die ein anderes Threadingmodell als Ihr COM-Objekt verwendet. Zum Beispiel haben wir ein Plug-In, das von einer Anwendung geladen wird, die ein bestimmtes Threading-Modell verwendet (kann sich nicht erinnern), aber unser COM-Objekt ist Multithread-Apartment (MTA) - also der Proxy/Stub ist erforderlich, um die Daten zwischen den Objekten zu übertragen, wenn ein Funktionsaufruf erfolgt, während die Regeln des Threading-Modells noch eingehalten werden.

Wenn diese Regeln gebrochen werden, dann COM entweder eine Ausnahme auslösen oder einen Fehler HRESULT wie RPC_E_WRONG_THREAD Rückkehr

Wenn Sie den Merge-Proxy/Stub-Option nicht aktivieren, dann Visual Studio erzeugt ein separates Projekt für die Proxy/Stubs, die in eine separate DLL eingebaut werden. Dies erschwert die Bereitstellung, wenn sie erforderlich ist. Sie können sie jedoch im Grunde nur ignorieren, wenn Sie nicht von Threading-Modellproblemen betroffen sind.

So können Sie ohne Proxy/Stubs zu tun, wenn die Anwendung das COM-Objekt aufrufen, um die gleiche Threading-Modell als Objekt

Larry Osterman bietet eine lesbare Einführung in threading models in seinem Blog mit.

3

Wenn Ihre Schnittstellen nur Typbibliothek-freundliche Typen (BSTR, VARIANT usw.) enthalten und im Bibliotheksblock Ihrer IDL angezeigt werden, können Sie sie als "type library marshalled" definieren. Der angegebene Proxy/Stub verwendet die Metadaten aus der Typbibliothek.

Wenn Schnittstellen in den Bibliotheksblock eingefügt werden und DllRegisterServer angepasst wird, um die Typbibliothek zu registrieren (TRUE an XxxModule :: DllRegisterServer übergeben, wenn ich mich richtig erinnere) werden Ihre Schnittstellen vom System bei Bedarf wie beschrieben marshallled von John Sibylle.

An diesem Punkt wird der Proxy/Stub nicht einmal verwendet, so _MERGE_PROXYSTUB hat keinen Effekt.

Verwandte Themen