Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo llamar a un archivo DLL en VB? Este archivo DLL lo escribí yo mismo en VB y lo coloqué en una carpeta del programa principal. Busqué muchos métodos en Internet pero fallé.

¿Cómo llamar a un archivo DLL en VB? Este archivo DLL lo escribí yo mismo en VB y lo coloqué en una carpeta del programa principal. Busqué muchos métodos en Internet pero fallé.

Hay un artículo en Internet que puede resultarle útil

Habla sobre cómo llamar a una DLL desarrollada por VC en VB

Autor: Fuente desconocida: Moonlight Software Station

Recientemente, desarrollé un programa que usaba una biblioteca de enlaces dinámicos y encontré algunos problemas al llamarlo en VB. Revisé cierta información y leí artículos de CSDN. Siento que estos artículos no son lo suficientemente detallados sobre el tema de que VB llame a VC para desarrollar DLL. Por lo tanto, después de que se resolvió mi problema, escribí este artículo especialmente para amigos que entran en contacto con DLL por primera vez.

La solución a la convención de llamadas en este artículo también es aplicable para resolver problemas de compatibilidad de llamadas de DLL entre otros lenguajes de programación.

① Acerca de la creación y llamada de DLL

Utilice el asistente de VC. La operación específica es la siguiente: Abra el menú "Archivo \ Nuevo" → seleccione "Proyectos \ 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 completar la función de entrada DLLMain(), agregue el código de su función personalizada. Si tiene muchas funciones personalizadas, puede escribir las declaraciones de estas funciones en un archivo de encabezado. Luego use la declaración "#include" al comienzo del archivo .cpp para introducir el archivo de encabezado. Tenga en cuenta que se debe agregar "__declspec(dllexport)" antes de la declaración de la función.

(Si está creando un tercer tipo de DLL (agregue código de muestra), debe anteponer las declaraciones y definiciones de funciones con la macro definida por el sistema "*_API").

Utilice la siguiente declaración en VB: "Declarar función Nombre de función Lib "Ruta completa \ Nombre de archivo.dll" [Alias ​​​​"Alias ​​de función"] (ByVal Variable 1 como Tipo 1, ByVal Variable 2 como Tipo 2, ...) Como Tipo 3", similar a llamar a funciones API.

Nota: Si se usa en la sección "General" del código de la tabla, se debe agregar "Privado" antes de "Declarar"; si se usa en Moudle, se debe agregar "Privado" antes de "Declarar"; usado en Moudle, se debe agregar "Privado" antes de "Declarar"; si se usa en Moudle, se debe agregar "Privado" antes de "Declarar". Si se usa en Moudle, se debe agregar "Público" antes de "Declarar". Si coloca el archivo DLL en el directorio "\Windows\System" o "\WinNT\System32", simplemente escriba el nombre del archivo DLL principal después de "Lib". Lib", simplemente escriba el nombre del archivo DLL principal después de "Lib".

El código de muestra específico se muestra en ④ (corregido y se puede ejecutar directamente).

② Acerca de el punto de entrada

Si escribe Cipher.dll de acuerdo con el método anterior y lo ejecuta, aparecerá el mensaje de error "Punto de entrada DLL no encontrado (error 53)". El motivo de este error es C. compilador. El nombre de la función Encrypt se cambió durante la compilación.

Abra el programa QuikView (D:\WINNT\System32\Viewers\QuikView.exe), arrastre Cipher.dll a la ventana del visor, busque el campo "?Encrypt@@YAHH@Z" y descubra que se agrega una cadena de caracteres. al nombre de la función.

Hay dos soluciones. Primero, coloque directamente "?Encrypt@@Y AHHH@Z" como alias después de "alias" en la declaración de VB; segundo, coloque la declaración "?__declspec(dllexport) int __stdcall Encrypt en el código Cipher.dll (int p, int k); agregue "extern" C "" antes de ", use QuikView para verlo después de la compilación, el nombre de la función se convertirá en "_Encrypt" y luego realice los ajustes correspondientes en la declaración de VB.

(Para archivos DLL que usan macros, cambie el valor de reemplazo de la macro "Cipher_API" en la instrucción "#define").

Después de realizar cambios en ③, el programa no puede encontrar el punto de entrada nuevamente. Verifiqué nuevamente con QuikVie w y descubrí que el nombre de la función cambió a "_Encrypt@8". Hay una solución. Agregue un archivo de texto llamado "Cipher.def" al proyecto Cipher.dll y agregue el código como ④. Después de la compilación, use QuikView para ver el nombre de la función. El nombre de la función vuelve a cambiar a "Encriptar" y se llama en VB. Se ejecuta normalmente.

③ Acerca de la convención de llamada

Al utilizar la segunda solución en ②, aparece 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 existen cuatro convenciones 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 (limitar el método de llamada):

extern "C" __declspec(dllexport) int __stdcall Encrypt(int p, int k

. .... .... ...

int __stdcall Encrypt(int p, int k)

{

int c = p k

p>

return c;

}

4 Código fuente

Cipher.dll:

Cipher.cpp:

/// Introducir archivos de encabezado precompilados

#include "stdafx.h"

// Declarar mi función

extern "C " __declspec (dllexport) int __stdcall Encrypt( int p, int k);

//función de entrada DLL

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

p>

LPVOID lpReserved

)

{

cambiar( ul_reason_for_call )

{

caso DLL_PROCESS_ATTACH:

caso DLL_THREAD_ATTACH:

caso DLL_THREAD_DETACH:

caso DLL_PROCESS_DETACH:

romper; p>

}

return TRUE

}

//Mi función

int __stdcall Encrypt (int p, int k)

{

int c = p k ;

return c ;

}

Cipher.def :

LIBRARY Cipher

EXPORTS Encrypt

Una vez completada la compilación, copie Cipher.dll al directorio "D:\WINNT\System32".

Llamar a VB:

Opción explícita

Función de declaración privada Cifrar Lib "Cipher" _

(ByVal p As Long, ByVal k Mientras) Como ByVal k Mientras) Mientras

Private Sub Form_Load()

Dim c Mientras

c = Encrypt(24, 8 )

Texto1.