2009-09-18 7 views
10

que han generado un objeto COM de ATL utilizando VS2008 y el código contiene referencias a una definición llamada _MERGE_PROXYSTUB (porque elegí la opción 'Combinar proxy/stub' al principio, cuando me encontré con el asistente.)¿Cuál es el punto de _MERGE_PROXYSTUB?

¿Cuál es el punto de un proxy/stub? Si no selecciono la opción de fusión, obtendré un MyControlPS.DLL por separado, ¿cuándo se usará esto alguna vez?

FWIW Parece que el control se registra y funciona bien si elimino todo el código rodeado por las definiciones _MERGE_PROXYSTUB. Una versión de depuración ni siquiera define _MERGE_PROXYSTUB y todavía funciona bien.

Entonces, ¿puedo prescindir de un proxy/stub?

Respuesta

14

Necesita un proxy/stub si desea llamar su objeto COM desde una aplicación que utiliza un modelo de subprocesamiento diferente a su objeto COM.

Por ejemplo, tenemos un complemento que se carga por una aplicación que utiliza un modelo de subprocesamiento particular (no recuerdo cuál), pero nuestro objeto COM es un apartamento multiproceso (MTA), por lo que el proxy/stub es requerido para ordenar los datos entre los objetos cuando se realiza una llamada de función, mientras se siguen las reglas del modelo de subprocesamiento.

Si estas reglas se rompen, a continuación, COM o bien lanzar una excepción o devolver un error HRESULT como RPC_E_WRONG_THREAD

Si no activa la opción de combinación proxy/stub, a continuación, Visual Studio produce una separada proyecto para el proxy/stubs que obtiene construir en un dll separado. Esto hace que las cosas sean más difíciles de implementar si son necesarias, pero básicamente puede simplemente ignorarlas si no se ve afectado por problemas con el modelo de subprocesos.

Así se puede prescindir de proxy/talones de si la aplicación que llama el objeto COM está utilizando el mismo modelo de hilos como su objeto

Larry Osterman proporciona una introducción legible a threading models en su blog.

3

Además, si sus interfaces contienen solo tipos de librería de tipo de biblioteca (BSTR, VARIANT, etc.) y aparecen en el bloque de biblioteca de su IDL, puede optar por tenerlas "ordenadas por biblioteca" lo que significa que un sistema- el proxy/stub proporcionado utiliza los metadatos de la biblioteca de tipos.

Cuando las interfaces se colocan dentro del bloque de la biblioteca, y DllRegisterServer se personaliza para registrar la biblioteca de tipos (pase TRUE a XxxModule :: DllRegisterServer, si recuerdo correctamente) el sistema organizará sus interfaces, si es necesario, como se describe por John Sibly.

En ese punto, el proxy/stub ni siquiera se utiliza, por lo que _MERGE_PROXYSTUB no tiene ningún efecto.