RE:Referenciar DLL desarrollada en visual desde C+
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.