Pregunta

He generado un objeto ATL COM usando VS2008 y el código contiene referencias a una definición llamada _MERGE_PROXYSTUB (porque elegí la opción 'Combinar proxy / código auxiliar' cuando ejecuté inicialmente el asistente).

¿Cuál es el punto de un proxy / stub? Si no selecciono la opción de combinación, en su lugar obtengo un MyControlPS.DLL separado. ¿Cuándo se utilizará?

FWIW el control parece registrarse y funciona bien si elimino todo el código rodeado por el _MERGE_PROXYSTUB define. Una compilación de depuración ni siquiera define _MERGE_PROXYSTUB y aún funciona bien.

Entonces, ¿puedo prescindir de un proxy / stub?

¿Fue útil?

Solución

Necesita un proxy / código auxiliar si desea que se llame a su objeto COM desde una aplicación que utiliza un modelo de subprocesamiento diferente al de su objeto COM.

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

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

Si no marca la opción fusionar proxy / stub, entonces Visual Studio produce un proyecto separado para el proxy / stubs que se integran en un dll separado. Esto hace que las cosas sean más difíciles de implementar si son necesarias, pero básicamente puedes ignorarlas si no te afectan los problemas del modelo de subprocesos.

Entonces puede prescindir de proxy / stubs si la aplicación que llama al objeto COM está usando el mismo modelo de subprocesos que su objeto

Larry Osterman ofrece una introducción legible a modelos de subprocesos en su blog.

Otros consejos

Además, si sus interfaces contienen solo tipos compatibles con la biblioteca de tipos (BSTR, VARIANT, etc.) y aparecen en el bloque de la biblioteca de su IDL, puede optar por tenerlos "tipo de biblioteca ordenada". lo que significa que un proxy / stub proporcionado por el sistema 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 VERDADERO a XxxModule :: DllRegisterServer, si recuerdo correctamente) sus interfaces serán ordenadas por el sistema, si es necesario, según lo descrito por John Sibly.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top