La Web del Programador: Comunidad de Programadores
 
    Pregunta:  22464 - LLAMAR A UN ACTIVE X DLL DE VISUAL BASIC DESDE UNA DLL EN C
Autor:  Miguel Angel Cortes Diaz
Hola a tod@s! Tengo una Dll Acive X desarrollada con Visual Basic 6.0 a la que necesitan acceder desde un programa C consola, de tal manera, que no permite instanciar controles Active X, pero sí hacer llamadas a Dll's.
Había pensado montar una Dll Windows32 (no Dll MFC) que instancie el control, llame a los métodos de este, y retorne el resultado a través del punto de entrada de la Dll.
Quisiera saber si esto es posible, y de ser así, como hacerlo. Porque lo que he conseguido hacer es una Dll MFC y utilizar el Wizard para instanciar el control, pero esto me da luego problemas al compilar el programa y creo que es porque la Dll tiene que ser Windows32 y no MFC.
Gracias anticipadas.!!!

  Respuesta:  Javier Muñoz
Hola Miguel.
Es totalmente posible acceder una libreria ActiveX desde un programa consola, solo que necesitas usar un poco de C++ y las librerias COM.
Los objetos ActiveX son un subset de las librerias COM de windows (con COM me refiero a las tecnologias DCOM y COM+ tambien).
Me imagino que estas usando Visual C++ (por tus comentarios acerca de MFC) lo que hace muy facil el trabajo. Lo que tienes que hacer es utilizar el la directiva de preprocesador propietaria de Microsoft "#import"
busca en google para que sepas como se usa (ejem: #import "c:\WINDOWS\system32\WINHTTP5.DLL"). Añades tus cabezeras "windows.h" y preparate a usar COM.
La directiva #import creara por ti los archivos de cabezera necesarios para usar la libreria (a partir de los Typelibs), por lo que luego puedes incluirlas directamente y eliminar la directiva #import si quieres desligar la estructura de directorio (el C:\Windows... etc..)

Lo primero que debes hacer para usar COM es iniciar la libreria con la funcion, ::CoInitialize();
Luego creas instancias de los objetos llamado la funcion:
::CoCreateInstance(...);
Y terminas el programa con una llamada a:
::CoUnintialize();
.. para limpiar todo.

te recomiendo que busques tutoriales y/o informacion acerca del COM. Es muy util saber esto sobre todo cuando usas VB para programar. Es muy util para crear librerias COM en C++ para las cosas de bajo nivel y utilizarlas desde VB para el UI y demas operaciones comunes.

Otro dato importante es que trates siempre de utilizar SmartPointers (lo veras en los tutoriales de COM, es casi el standart-de-facto) y maneja todo tu codigo COM dentro de una estructura de manejo de Excepciones tipo try-catch (mucho mas facil que el manejo tipo C de los ejemplos M$).

Hay 2 libros muy buenos sobre la materia, uno es "C++ for VB Programmers" por Jonathan Morrison (ISBN 1-893115-76-3) excelente para todos los aspectos de la integracion entre VB y C++, y el otro el "INSIDE COM" por Microsoft Press, que considero como la Biblia del COM.

Mucha suerte. Javier