Pregunta

Tengo una DLL de Windows que escribí, escrita en C/C++ (todas las funciones exportadas son 'C').La DLL me funciona bien en VC++.Le di la DLL a otra empresa que realiza todo su desarrollo en VB.Parecen tener problemas para vincularse con las funciones.Hace diez años que no uso VB y ni siquiera lo tengo instalado.¿Cual podría ser el problema?

He declarado todas mis funciones públicas de la siguiente manera:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

¿Algunas ideas?


Finalmente volví a esto hoy y lo tengo funcionando.Las respuestas me pusieron en el camino correcto, pero esto me resultó muy útil:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

Además, tuve algunos problemas al pasar cadenas a las funciones DLL, esto me resultó útil:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


¿Fue útil?

Solución

Mediante el uso __declspec para exportar, el nombre de la función se exportará destrozado, es decir.contienen información de tipo para ayudar al compilador de C++ a resolver sobrecargas.

VB6 no puede manejar nombres alterados.Como solución alternativa, hay que desmantelar los nombres.La solución más sencilla es vincular el archivo DLL mediante un definición de exportación archivo en VC++.El archivo de definición de exportación es muy simple y solo contiene el nombre de la DLL y una lista de funciones exportadas:

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

Además hay que especificar el stdcall convención de llamadas porque esa es la única convención de llamadas que VB6 puede manejar.Hay un proyecto que utiliza la inyección de ensamblado para manejar llamadas C, pero supongo que no querrás utilizar este método difícil y propenso a errores.

Otros consejos

Intente agregar __stdcall al final

#define MYDCC_API __declspec(dllexport) __stdcall

Tenemos algunos archivos DLL de C++ que interactúan con nuestras antiguas aplicaciones VB6 y todos lo tienen al final.

Una DLL VB6 es siempre una DLL COM.Describiré un ejemplo en la menor cantidad de palabras posible.Supongamos que tiene un proyecto DLL ActiveX en VB6 con una clase llamada CTest que contiene un método como se muestra a continuación

Función pública vbconcat (byval a as string, byval b como string) como string vbconcat = a & b final función

y ha establecido el nombre del proyecto como VBTestlib en las propiedades del proyecto VB6 y ha compilado el proyecto como F: Proj VB6 ActiveXDll VBTestdll.dll

Debe registrar el DLL utilizando el comando Windows RegSvr32 F: Proj vb6 ActiveXDLL vBtestdll.dll

ahora tu código C++:

#Import "F: Proj vb6 ActiveXDll vBtestdll.dll" usando el espacio de nombres vBtestlib;

void cdialogTestdlg :: onButton1 () {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

Eso es todo lo que hay que hacer, empezar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top