Ver programación
Hablemos de llamar a DLL desarrollado por VC en VB
Autor: desconocido Fuente: Moonlight Software Station
Recientemente desarrollé un programa que utiliza una biblioteca de enlaces dinámicos. Encontré algunos problemas al llamar en VB. Después de verificar cierta información y leer artículos sobre CSDN, siento que estos artículos no son lo suficientemente detallados como para llamar a la DLL desarrollada por VC en VB. Entonces, una vez resuelto mi problema, escribo este artículo especialmente para amigos que son nuevos en DLL.
La solución de convención de llamadas de este artículo también es adecuada para resolver problemas de compatibilidad de llamadas DLL entre otros lenguajes de programación.
① Acerca de la creación y llamada de DLL
Simplemente use el asistente de VC. La operación específica es la siguiente: Abra el menú "Archivo\Nuevo" → seleccione "Proyecto\Biblioteca de vínculos dinámicos win32" → seleccione "Un proyecto DLL simple". En este momento, el sistema generará automáticamente tres archivos: *. cpp, stdafx.cpp y stdafx.h
Después de eso, complete la función de entrada DLLMain() y luego agregue el código de su función personalizada. Si tiene muchas funciones personalizadas, puede escribir la parte de declaración de estas funciones en un archivo de encabezado. Luego introduzca este archivo de encabezado, en. archivo cpp. Tenga en cuenta que se debe agregar "__declspec(dllexport)" antes de la declaración de la función.
(Si elige el tercer tipo (agregar código de muestra) al crear la DLL, debe agregar la macro definida por el sistema "*_API" antes de la declaración y definición de la función).
Utilice la siguiente declaración para declarar en VB: "Nombre de función de declaración Lib" ruta completa\nombre de archivo. dll "[Alias "Alias de función"] (la variable ByVal 1 es de tipo 1, la variable ByVal 2 es de tipo 2,...) es de tipo 3", que es similar a llamar a una función API.
Nota: Si se usa en la parte "general" del código del formulario, agregue "privado" antes de "declaración"; si lo usa en un módulo, agregue "público" antes de "declaración". Si coloca el archivo DLL en el directorio "\Windows\System" o "\WinNT\System32", simplemente escriba el nombre del archivo principal DLL después de "Lib".
Consulte ④ para ver un código de muestra específico (modificado y que se puede ejecutar directamente).
②Acerca del punto de entrada
Cipher.dll está escrito como se indica arriba. Después de ejecutarlo, aparece el mensaje de error "Punto de entrada DLL no encontrado (error 53)". El motivo de este error es que el compilador de C modificó el nombre de la función Encrypt durante la compilación. Abra el programa de vista rápida (d:\win nt\system32\viewers\quik view .exe), arrastre Cipher.dll a la ventana de visualización, busque el campo "? Encryption@@YAHHH@Z" y busque el nombre de la función. se ha agregado con un carácter de cadena.
Hay dos soluciones. Primero, coloque directamente "?Encrypt@@Y AHHH@Z" como alias después de "alias" y segundo, en el código Cipher.dll, la declaración "_ _ declspec(dll export)int _ _ stdcall encrypt(int p, int k);" Agregue "C" externa delante, verifique con QuikView después de la compilación, cambie el nombre de la función a "_Encrypt" y luego realice los ajustes correspondientes en la declaración VB
(Para aquellos usando macros, simplemente cambie el valor de reemplazo de la macro "Cipher_API" en la declaración "#define")
③Después del cambio, el programa ya no puede encontrar el punto de entrada. Lo verifiqué con QuikView. Se descubre que el nombre de la función se ha cambiado a "_Encrypt@8". Hay una solución. Agregue un archivo de texto llamado "Cipher.def" al proyecto Cipher.def y agregue el código que se muestra en ④.
Después de la compilación, verifiqué con QuikView. El nombre de la función se cambió nuevamente a "Cifrar" y se llamé en VB. Se ejecutó normalmente.
③Acerca de la convención de llamada
Al utilizar la segunda solución en ②, aparecerá el mensaje de error "Error de convención de llamada de DLL (error 49)" durante el tiempo de ejecución. La razón es que * * * hay cuatro métodos de llamada: __fastcall, __pascal, __stdcall y __cdecl. El método de llamada predeterminado de VC es __cdecl, mientras que el método de llamada predeterminado de VB es __stdcall. La solución es cambiar el código de la siguiente manera (restringir el método de llamada):
extern " C " _ _ declspec(dll export)int _ _ stdcall Encrypt(int p, int k
…………
int __stdcall Encrypt(int p, int k)
{
int c = p k;
Devolver c;
}
④Código fuente
Cipher.dll:
Cipher.cpp
// Introducir archivos de encabezado precompilados
#Include " stdafx.h "
//Declarar mi función
extern " C " _ _ declspec(exportación dll) int _ _ stdcall Encrypt(int p, int k);
//función de entrada de DLL
BOOL APIENTRY DllMain (procesando hModule,
Motivo de la llamada ,
LPVOID lpReserved
)
{
Cambiar (ul_reason_for_call)
{
Caso DLL_PROCESS_ATTACH:
Caso DLL_THREAD_ATTACH:
Caso DLL_THREAD_DETACH:
Caso DLL_PROCESS_DETACH:
Rotura;
}
Devolver VERDADERO
}
//Mi función
int __stdcall Encrypt (int p, int k)
{
int c = p k;
Devolver c;
}
Contraseña def:
Contraseña de biblioteca
Exportar cifrado
Después de la compilación, copie Cipher.dll al directorio "D:\WINNT\System32".
Llamar a VB:
Opción explícita
"Contraseña" de la biblioteca de cifrado de función de declaración privada
(ByVal p tiene la misma longitud, ByVal k tiene la misma longitud)
Private subform_Load()
Dim c tiene la misma longitud
c = Encrypt(24, 8)
p>Texto1. Texto = c
Conector final