c++ - usar - crear dll vb net
Llamar a las funciones DLL desde VB6 (3)
Tengo una DLL de Windows que escribí, escrita en C / C ++ (todas las funciones exportadas son ''C''). La DLL funciona bien para mí en VC ++. Le di el DLL a otra compañía que hace todo su desarrollo en VB. Parece que tienen problemas para vincularse con las funciones. No he usado VB en diez años 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 pareció muy útil:
http://www.codeproject.com/KB/DLL/XDllPt2.aspx
Además, tuve algunos problemas para pasar cadenas a las funciones de DLL, encontré esto útil:
http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml
Al usar __declspec
para exportar, el nombre de la función se exportará destrozado , es decir, contendrá información de tipo para ayudar al compilador de C ++ a resolver las sobrecargas.
VB6 no puede manejar nombres destrozados. Como solución alternativa, debe eliminar los nombres. La solución más fácil es vincular el archivo DLL utilizando un archivo de definición de exportación 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, debe especificar la convención de llamadas stdcall
porque esa es la única convención de llamadas que puede manejar VB6. Hay un proyecto que usa inyección de ensamblaje para manejar llamadas C, pero supongo que no desea utilizar este método difícil y propenso a errores.
Intenta agregar __stdcall al final
#define MYDCC_API __declspec(dllexport) __stdcall
Tenemos algunos dlls C ++ que interactúan con nuestras antiguas aplicaciones VB6 y todos tienen eso al final.
Una DLL VB6 siempre es un dll COM. Describiré un ejemplo en la menor cantidad de palabras posible. Supongamos que tiene un proyecto de ActiveX DLL 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 As String) As String vbConcat = a & b End Function
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 usando el comando de Windows regsvr32 F: / proj / VB6 / ActiveXDLL / VBTestDLL.dll
ahora tu código C ++:
#import "F: / proj / VB6 / ActiveXDLL / VBTestDLL.dll" utilizando 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, para empezar.