C/Visual C - Referenciar DLL desarrollada en visual desde C++

 
Vista:

Referenciar DLL desarrollada en visual desde C++

Publicado por PepeGrillo (2 intervenciones) el 04/07/2005 21:18:49
Hola a todos necesito si alguien sabe referenciar objetos realizados en VB desde C++.

El escenario es el siguiente

Tengo un componente DLL desarrollado en Visual Basic 6.0 ya esta compilado.
Lo que necesito ahora es desde una aplicacion c++ referenciar al componente realizado en Visual Basic para reutilizar todo los objetos que estan en ese componente.

Espero ser claro muchas gracias por sus respuestas.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Referenciar DLL desarrollada en visual desde C+

Publicado por fernando.gomez (1603 intervenciones) el 04/07/2005 22:22:22
Es un proceso muy complicado si no sabes COM. Primero debes obtener el ID de interfase (IID). Este es un número de 32 bits estructurado, y generalmente lo puedes encontrar en el registry de Windows. Segundo, necesitas el ID de clase del componente que implementa dicha interfase (CLSID). Así, puedes llamar a CoCreateInstance para obtener la interfase a IUnknown, IDispatch o bien la interfaz que estás buscando:

IMiInterfase* pCmpVB;

CoInitialize(NULL);
CoCreateInstance(
clsidComponente, // ID de clase que implementa el componente
NULL, // usualmente no necesitarás agregación
CLSCTX_INPROC_SERVER, // para que corra dentro de la DLL
iidInterfase, // ID de la interfase
(void**)&pCmpVB // finalmente la dirección del objeto donde guardarás
// el componente creado
);

A partir de aquí, ya puedes emplear pCmpVB:

pCmpVB->Metodo1();
pCmpVB->Metodo2(5);

etc. Ahora, como usualmente tendrás que trabajar con IDispatch --ya que VB implementa IDispatch-- entonces te convendría obtener un puntero a IDispatch, sobre todo si el componente implementa varias interfases:

IDispatch* pDisp;
CoInitialize(NULL)
CoCreateInstance(clsidComponente, NULL, CLSCTX_INPROC_SERVER,
IID_IDispatch, (void*)&pDisp);

y ahora podrás emplear IDispatch para obtener las interfases que implemente el componente. Supongamos que implementa IInterfase1 e IInterfase2. Entonces, después de lo anterior:

IInterfase1* p1;
IInterfase2* p2;

pDisp->QueryInterface(IID_IInterfase1, (void*)&p1);
pDisp->QueryInterface(IID_IInterfase1, (void*)&p2);
// emplea sus métidos...
p1->Metodo1();
p2->get_Propiedad1();

Como comentario final, he de deciros que VB implementa las cadenas de texto con terminación de doble nulo, en lugar de un simple nulo como en C/C++. Microsoft creó el tipo de dato BSTR, la clase _bstr_t y las funciones SysAllocString y SysFreeString para ayudar en la manipulación de BSTR. Además, cuenta con las funciones OLE2T y T2OLE para ayudar a convertir de cadenas C a cadenas COM, que son las que emplea VB.

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Referenciar DLL desarrollada en visual desde C+

Publicado por PepeGrillo (2 intervenciones) el 04/07/2005 22:34:18
ante todo muchas gracias por responder.

Lei por ahi tambien la utilizacion de #import
lo saque de un ejemplo de la utilizacion de ADO dentro de C++ que para mi caso es el mismo reemplazaria ADO Por mi componente y listo.

en el codigo parecia mas sencillo ya que solo hacia el #import "C:\myDll"
y listo

que metodo te parece mas correcto?

saludos...
gracias nuevamente.


Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Referenciar DLL desarrollada en visual desde C+

Publicado por fernando.gomez (1603 intervenciones) el 04/07/2005 22:50:08
Ok, el #import es una extensión de Visual C++. Lo que hace es que te genera un archivo de encabezado con la definición de las interfases del componente, así como sus IDs, a partir de la librería de tipos (LIB). Esto es para cuando no tienes el código fuente (p.e. no sabes cómo está definida la interfase). Por ejemplo, te genera el código de las llamadas a IDispatch::Invoke et. al. para que ya no lo hagas manual.

Sin embargo, el proceso es el mismo que expliqué.

Hay una opción por ahí, y es que puedes emplear ATL. Esta es una librería de plantillas que encapsula un poquito de la funcionalidad descrita anteriormente. El archivo que generará el #import contiene algunas definiciones para emplear los punteros inteligentes de ATL. La desventaja es que tienes que emplear un resto de extensiones del compilador, como __uuidof, etcétera. Tu código se hace un despapaye tremendo (al menos en mi opinión). Pero definitivamente tienes que saber COM antes. Curiosamente, hoy en día ATL se usa más por sus clases parametrizadas alrededor de HWND (CWindow), a partir de la cuál se construyó la Windows Template Library, que parece reemplazará a MFC en mediano plazo. ATL fué diseñado para facilitar el desarrollo de ActiveX.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar