En términos generales, hay tres formas de programar juntos entre VB y VC: una es generar una DLL en VC y llamar a la DLL en VB; la otra es generar un control ActiveX (.ocx) en VC e insertarlo en VB; otra es crear una DLL en VC Generar servidor de automatización ActiveX en VB y llamarlo en VB. En términos relativos, el primer método tiene los requisitos más bajos para los programadores de VC, pero requiere la cooperación de sus socios. Recomiendo este método.
Hablemos primero de la programación VC++. Primero genere el proyecto DLL Win32 en VC++. Agregue varias funciones a este proyecto para que las llamen los usuarios de VB. Para que VB llame a una función en una DLL, debe cumplir dos condiciones: una es que el método de llamada sea stdcall y la otra es que debe exportarse. Para hacer el primero, simplemente agregue la palabra clave __stdcall antes de la declaración de la función. como:
muestra corta de __stdcall (nLen corta, *buffer corta)
Para hacer el segundo, necesitas agregar las siguientes líneas al archivo *.def:
EXPORTACIONES
muestra @1
El ejemplo aquí es el nombre de la función que desea llamar en VB, @1 representa el número de la función en la DLL y cada función es diferente. Tenga en cuenta que los nombres de las funciones aquí distinguen entre mayúsculas y minúsculas. En cuanto a la necesidad de transferir una gran cantidad de datos, puede hacer esto, usar una matriz para almacenar los datos en VB y luego pasar el tamaño y la dirección de la matriz a VC (en cuanto a cómo programar en VB, lo haré preséntalo a continuación). Al igual que en el ejemplo anterior, nLen es el tamaño de la matriz y el buffer es la dirección de la matriz. Con estos dos elementos, puede procesarlo como una matriz VC. En cuanto a los gráficos de salida, puede generar el formato WMF o BMP y dejar que VB lo llame. Sin embargo, creo que también se puede enviar directamente a la ventana, siempre que VB pase los identificadores de ventana hWnd y hDC y la posición de dibujo de la ventana (los sistemas de coordenadas utilizados por VB y VC deben ser consistentes) a VC. La propiedad AutoRedraw de VB debe ser False y el programa de dibujo de VC se llama en el evento Paint.
Hablemos nuevamente de la programación VB. El método para que VB llame a DLL es el mismo que el método para llamar a la API de Windows, que generalmente se presenta en los libros de VB. Para el ejemplo anterior, primero declare la función VC:
Declarar función de muestra Lib "mydll.dll" (ByVal nLen como entero, búfer como entero) como entero
Aquí mydll.dll es el nombre de su dll. Es posible que hayas notado que los dos parámetros se declaran de manera diferente, con ByVal agregado al primer parámetro. La regla es la siguiente: si un parámetro se declara como un puntero o una matriz en VC, no se agregará ByVal; de lo contrario, se agregará ByVal. Llamar a esta función en VB utiliza la siguiente sintaxis:
muestra 10, a(0)
La matriz a() aquí se usa para almacenar datos, y 10 es la longitud de la matriz. El segundo parámetro aquí no puede ser a(), pero debe ser el primero de los datos que se pasarán. Esta es la clave para la programación VB.
A continuación se detallan algunos posibles problemas que puede encontrar. Un problema es que VB puede informar que no se puede encontrar el dll. Puede colocar el dll en el directorio del sistema y asegurarse de que la declaración Declare de VB sea correcta. Otro problema es que VB informa que no puede encontrar la función requerida. Esto generalmente se debe a que el archivo *.def no está configurado en VC. La tercera situación es que VB le dice que la conversión no se puede realizar. Esto puede deberse a que la palabra clave __stdcall no se agrega en VC, o puede ser que los tipos de parámetros de VB y VC sean inconsistentes. Tenga en cuenta que int en VC es 4. bytes (equivalente a VB Long), mientras que el Integer de VB tiene solo 2 bytes. Se debe garantizar que la cantidad de parámetros en VB y VC sea la misma, y la cantidad de bytes que ocupan también sea la misma. Lo último a lo que debe prestar atención es que la matriz no debe exceder los límites en VC; de lo contrario, el programa VB fallará.
1. Ventajas de llamar a DLL
Como base del sistema operativo Windows, la biblioteca de vínculos dinámicos (DLL) tiene un rendimiento de aplicación superior:
Las DLL amplían las funciones de una aplicación. Debido a que una DLL se carga dinámicamente en el espacio de direcciones de un proceso, una aplicación puede determinar en tiempo de ejecución qué operaciones deben realizarse y luego cargar el código apropiado para realizar esas operaciones según sea necesario.
Las DLL se pueden escribir en una variedad de idiomas. Por ejemplo, VB se utiliza para escribir la interfaz del programa de aplicación y C++ se utiliza para escribir operaciones subyacentes, como algoritmos y comunicaciones.
Las DLL simplifican la gestión de proyectos de software. Si diferentes grupos de trabajo trabajan en diferentes módulos durante el desarrollo de software, el proyecto es más fácil de gestionar.
DLL ayuda a ahorrar memoria. Si dos o más aplicaciones usan la misma DLL, las páginas de la DLL solo necesitan colocarse en la RAM una vez y todas las aplicaciones pueden compartir sus páginas individuales.
DLL facilita el intercambio de recursos. Las DLL pueden contener recursos como plantillas de diálogo, cadenas, iconos y mapas de bits, y varias aplicaciones pueden usar DLL para compartir estos recursos.
DLL ayuda en la localización de aplicaciones. Por ejemplo, una aplicación que contiene solo código y ningún componente de interfaz de usuario puede cargar una DLL que contenga componentes de interfaz de usuario localizados.
Las DLL ayudan a resolver las diferencias de plataforma. Las diferentes versiones de Windows están equipadas con diferentes funciones y los desarrolladores a menudo quieren llamar a nuevas funciones. Sin embargo, si el código fuente contiene una llamada a una nueva función y la aplicación se va a ejecutar en una versión de Windows que no proporciona esa función, el cargador del sistema operativo se negará a ejecutar el proceso. Si estas nuevas funciones se guardan en una DLL, la aplicación puede cargarlas en versiones anteriores de Windows y llamar a la función con éxito.
2. Encuentre el punto de entrada de la DLL
Los usuarios que entran en contacto con archivos DLL por primera vez a menudo encuentran un problema: un archivo DLL creado en un entorno VC funciona bien en VC, pero cuando se llama en una aplicación VB, siempre aparece la entrada "error de convención de llamada" o "no encontrado". errores de punto". Esto se debe principalmente a las siguientes omisiones.
En primer lugar, cabe señalar que la declaración de función en la DLL y la declaración de función en VB deben ser exactamente iguales en términos de nombre, tipo de retorno, tipo de parámetro, número de parámetros, etc. Preste especial atención al tema de capitalización.
En segundo lugar, la función de entrada debe agregarse al archivo .def de la DLL.
Finalmente, las palabras clave externas "c" y _stdcall deben agregarse antes de la definición de la función.
Consulte el ejemplo de aplicación para conocer el formato específico.
3. Pasar parámetros de matriz en DLL
Dado que la DLL se usa a menudo para realizar algunas operaciones de bajo nivel, las aplicaciones a menudo necesitan pasar una gran cantidad de datos a la DLL. En C++, los punteros son la mejor opción para operaciones con matrices, pero no existe el concepto de punteros en VB. Normalmente esto se puede solucionar de dos formas.
Primero, al declarar una DLL en VB, use byref en lugar de byval para pasar el puntero de matriz a la DLL.
Además, al declarar la matriz como una variante, puede pasar la matriz directamente a la DLL.
4. Ejemplos de aplicación
A continuación se utiliza un ejemplo específico para ilustrar el proceso de llamar a una DLL creada en un entorno VC en VB.
Cree una DLL para el procesamiento de señales, "SigPro.dll", que contenga una función "Fourier" para cálculos de Fourier.
Declaración en VC:
Agregue el siguiente código a "SigPro.h",
Copie el código de código de la siguiente manera:
"C" externa
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
Agregue el siguiente código a "SigPro.cpp",
"C" externa
doble EXPORTACIÓN _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
ent i;
resultado doble=0.0;
si(SinOrCos==verdadero)
{
para(i=0;i<NumSam;i++)
{
resultado=resultado+*(Muestra+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
demás
{
para(i=0;i<NumSam;i++)
{
resultado=resultado+*(Muestra+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
resultado =resultado*2/NumSam;
resultado de devolución;
}
Agregue el siguiente código a "SigPro.def",
EXPORTACIONES
Fourier
Declaración de llamada en VB:
Función de declaración pública Fourier Lib "SigPro" (ByRef Sample() siempre, ByVal NumSam como entero, ByVal OvertoneOrder como entero, ByVal SinOrCos como booleano) como doble