visual studio strongly strong name crear c++ visual-studio-2008 com dll guid

c++ - strongly - ¿Cómo se crea una DLL COM en Visual Studio 2008?



strongly named key (3)

Han pasado años desde que escribí un COM dll. He hecho un par de clases ahora, que heredan de algunas interfaces COM, pero quiero probarlo. Sé que tengo que poner un GUID en algún lugar y luego registrarlo con regsvr32, pero ¿cuáles son los pasos involucrados?

Editar: Lo siento, olvidé mencionar que estoy usando C ++.


Cuando construyes la solución, automáticamente registra el dll. Y también crea dos archivos _i.c y .h.

Para probar el dll crea la aplicación de muestra:

  1. Crea una aplicación de muestra Win32. Incluya _i.c y .h en el archivo cpp de la aplicación win32 que tiene la función principal

  2. Llamar a CoInitialize ();

  3. Declare un puntero de interfaz CComPtr pMyInterface = NULL; // donde IMyInterface se declara en _i.c

  4. Cree la instancia pMyInterface.CoCreateInstance (CLSID_MyClass); // CLSID_MyClass es un GUID que representa el
    CoClass

  5. Llamar a las API presentes en la interfaz

  6. Llamar a CoUnInitialize ();


Para crear un nuevo proyecto COM de ATL, puede proceder de la siguiente manera:

  1. Archivo / Nuevo Proyecto
  2. Proyecto Visual C ++ / ATL / ATL
  3. Personalícela y presione finalizar cuando termine

Ha creado un nuevo dll, pero está vacío, para agregar un objeto COM puede hacer esto:

  1. Proyecto / Agregar clase
  2. Objeto simple de Visual C ++ / ATL / ATL, presione agregar
  3. Da el nombre que quieras (como MyObject), y presiona terminar para agregarlo

Si quieres que un objeto implemente una interfaz

  1. En la vista de clase, seleccione la clase de objeto (CMyObject)
  2. Haga clic con el botón derecho / Agregar / Implementar interfaz ...
  3. Puede seleccionar qué interfaz implementará
    1. Desde un archivo .idl que ya está en sus archivos de proyectos
    2. Desde un .tlb / .dll / .exe que tiene una biblioteca de tipos incrustada
    3. De un objeto ya registrado
  4. Cuando termine, presione finalizar

PD: es mucho más fácil crear un nuevo proyecto ATL con el mismo nombre en una carpeta diferente y agregar los archivos que ha personalizado. El asistente realiza varias tareas y crea varios archivos personalizados.

Para proyectos más grandes que son difíciles de agregar archivo por archivo, hago lo mismo, pero en lugar de agregar mis archivos al nuevo proyecto, comienzo a copiar la configuración de los proyectos nuevos a la anterior y agrego cualquier archivo adicional que el asistente haya creado y la fijación de encabezados como stdafx.h para fusionar la nueva configuración.

PPS: si desea que su dll sea compatible con MFC, en lugar de seleccionar ATL Project, debe seleccionar MFC / MFC Dll. Cuando agrega el objeto simple ATL, el asistente le pedirá que agregue compatibilidad ATL al proyecto.


Necesita escribir una función llamada DllGetClassObject y exportarla. Esa función es responsable de asignar una "fábrica de clases", que también debe escribir, y que a su vez es capaz de asignar instancias de su objeto COM. Tiene que implementar IClassFactory .

No es muy difícil de hacer. La alternativa es usar ATL (ver la respuesta de xhantt) que en teoría hace esto por usted, pero en la práctica es un verdadero desastre. De alguna manera logra encapsular la complejidad de COM dentro de una capa de abstracción que es aún más complicada. Buena suerte tratando de mover un objeto entre las DLL, por ejemplo.

Pero podría ejecutar el asistente de ATL solo para ver un ejemplo de cómo declarar DllGetClassObject . La implementación de IClassFactory es muy fácil, solo un método que pone al día un objeto.

Luego debe registrar su DLL, es decir, poner claves en el registro. La herramienta regsvr32 no puede hacer esto sin ayuda adicional de usted. Tienes que escribir y exportar otra función llamada DllRegisterServer , que hace todo el trabajo duro. Todo lo que hace regsvr32 es cargar la DLL, buscar DllRegisterServer y llamarlo.

Una vez más, ATL tiene una forma de implementar esto para usted, pero lo hace leyendo un tipo de script lleno de instrucciones de modificación de registros, almacenado en un archivo .rgs que se integra en los recursos de su DLL. Si coloca accidentalmente algún tipo de error de sintaxis en este archivo, el registro falla silenciosamente.

Así que de nuevo, en realidad puede encontrar más simple escribir unas líneas de código para modificar el registro usted mismo. Aquí están los detalles .

Si utilizó C # en su lugar, no tendría ninguno de estos problemas. Todo está encapsulado muy limpiamente. En realidad, funciona mucho mejor que C ++ como herramienta para desarrollar objetos COM.