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.
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. –
Puede consultar el siguiente enlace http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=88625 – Vinay