2009-01-21 17 views
7

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?¿Cómo se crea una DLL COM en Visual Studio 2008?

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

Respuesta

10

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

  1. Archivo/Nuevo proyecto
  2. Visual C++/ATL/ATL Proyecto
  3. Personalizarlo ajustes y pulse acabado cuando termine

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

  1. Proyecto/Agregar clase
  2. C++/ATL/ATL simple objeto, pulse Visual añadir
  3. Dale el nombre que desea (como MiObjeto), y pulse Finalizar para añadir que

Si quiere que un objeto implementar una interfaz

  1. En la vista de clase seleccionar la clase de objeto (CMyObject)
  2. Rig t Haga clic en/Añadir/Implementar interfaz ...
  3. Puede seleccionar qué interfaz implementará
    1. Desde un archivo .idl ya estén en los proyectos de archivos
    2. Desde un .tlb/.dll /.exe que tienen una biblioteca de tipo incrustado
    3. De un objeto ya registrado
  4. Cuando pulse hecho terminar

PS: Es mucho más fácil crear un nuevo proyecto ATL con el mismo nombre en un diferente carpeta, y agregue 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 las configuraciones de los proyectos nuevos a la anterior y agrego cualquier archivo adicional que el asistente ha creado y fijado 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.

1

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

Para probar el archivo DLL crear la aplicación de ejemplo:

  1. Crear aplicación Win32 muestra. 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. Declarar un puntero de interfaz CComPtr pMyInterface = NULL; // donde se declara IMyInterface en _i.c

  4. Crea la instancia pMyInterface.CoCreateInstance (CLSID_MyClass); // CLSID_MyClass es GUID que representa la
    Coclase

  5. llamar a las API presentes en la interfaz

  6. a CoUnInitialize Call();

+0

Construí un proyecto Win32 estándar de pantano, sin ATL/MFC incluido. Necesito saber cómo configurar las configuraciones del proyecto para que se construya correctamente como un dll COM. –

+0

Puede consultar el siguiente enlace http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=88625 – Vinay

3

Debe 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 demasiado 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 sencilla, 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 regsvr32 hace es cargar la DLL, busque DllRegisterServer y llámelo.

De nuevo, ATL tiene una forma de implementar esto para usted, pero lo hace leyendo un tipo de script lleno de instrucciones de modificación de registro, 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, puede que le resulte más simple escribir algunas líneas de código para modificar el registro usted mismo. Here are the details.

Si usó 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.

+0

¿O IClassFactory2? –

Cuestiones relacionadas