Red de conocimiento informático - Material del sitio web - Cómo definir una función API WIN32

Cómo definir una función API WIN32

Visual C#, al igual que otras herramientas de desarrollo, también puede llamar a las funciones API de la biblioteca de enlaces dinámicos. El propio marco .NET proporciona un servicio que permite que el código gobernado llame a funciones no reguladas implementadas en bibliotecas de enlaces dinámicos, incluidas las funciones API de Windows proporcionadas por el sistema operativo. Puede localizar y llamar funciones de salida y organizar sus diversos parámetros (enteros, tipos de cadenas, matrices, estructuras, etc.) a través de límites de interoperabilidad según sea necesario.

A continuación se utiliza C# como ejemplo para presentar brevemente el proceso básico de llamada a la API:

Declaración de funciones de biblioteca de vínculos dinámicos

Las funciones de biblioteca de vínculos dinámicos deben declararse antes de su uso, relativo En comparación con VB, la declaración de función de C# es más detallada. La primera se puede usar directamente después de pegarla a través del visor API, mientras que la segunda requiere algunos cambios adicionales en los parámetros.

La parte de declaración de función de la biblioteca de enlaces dinámicos generalmente consta de las dos partes siguientes, una es el nombre de la función o el número de índice y la otra es el nombre del archivo de la biblioteca de enlaces dinámicos.

Por ejemplo, si desea llamar a la función del cuadro de mensajes en user32.dll, debemos especificar el nombre de la función messageboxa o messageboxw y el nombre de la biblioteca user32.dll. Sabemos que la API de Win32 admite todas. función que involucra cadenas y caracteres Las funciones generalmente existen en dos versiones, la versión ansi para caracteres de un solo byte y la versión Unicode para caracteres de doble byte.

El siguiente es un ejemplo de cómo llamar a una función API:

[dllimport("kernel32.dll", Entrypoint="movefilew", setlasterror=true, charset=charset.unicode, ortografía exacta = true, callingconvention = callingconvention.stdcall)] publicstaticexternbool movefile (string src, string dst); el punto de entrada identifica la posición de entrada de la función en la biblioteca de vínculos dinámicos, el nombre original y el número de serie de. el punto de entrada de la función objetivo no solo identifica una función que cruza los límites de interoperabilidad. Además, también puede asignar este punto de entrada a un nombre diferente, es decir, cambiar el nombre de la función. Cambiar el nombre puede brindar comodidad al llamar a funciones. Al cambiar el nombre, no tenemos que preocuparnos por las mayúsculas de las funciones. Al mismo tiempo, también puede garantizar la coherencia con las reglas de nomenclatura existentes y permitir funciones con diferentes tipos de parámetros. y, lo que es más importante, simplifica la llamada a las versiones ansi y unicode. charset se usa para identificar si la llamada a la función usa la versión Unicode o ansi exactaspelling=false le indicará al compilador que decida usar la versión Unicode o ansi. Para conocer otros parámetros, consulte la ayuda en línea de msdn.

En C#, puede declarar una función de biblioteca de vínculos dinámicos a través del nombre y el número de serie en el campo de punto de entrada, si el nombre de la función utilizada en la definición del método es Lo mismo que el punto de entrada dll, no es necesario declarar explícitamente la función en el campo del punto de entrada. En caso contrario, deberá indicar un nombre y número de secuencia utilizando el siguiente formato de atributo.

[dllimport("dllname", Entrypoint="functionname")] [dllimport("dllname", Entrypoint="#123")] Vale la pena señalar que debes agregar "#" antes del número. ”

El siguiente es un ejemplo de cómo reemplazar el nombre del cuadro de mensaje con msgbox:

usando system.runtime.interopservices; publicclass win32 { [dllimport("user32.dll", Entrypoint=. "messagebox" )] publicstaticexternint msgbox(int ​​hwnd, string text, string caption, uint type); } Muchas funciones de biblioteca de vínculos dinámicos gobernadas esperan que usted pase un tipo de parámetro complejo a la función, como un tipo de estructura definido por el usuario. miembro o gobernado Un miembro de clase definido por código, luego debe proporcionar información adicional para formatear este tipo para mantener el diseño original y la alineación de los parámetros.

C# proporciona una clase structlayoutattribute a través de la cual puede definir su propio tipo de formato. En el código gobernado, el tipo de formato es una estructura o miembro de clase descrito con structlayoutattribute, a través del cual puede garantizar que se cumpla la información de diseño esperada. miembros internos. Hay tres opciones de diseño: Descripción de la opción de diseño layoutkind.automatic

Para mejorar la eficiencia, el estado de tiempo de ejecución puede reordenar los miembros de tipo.

Nota: Nunca utilices esta opción para llamar a funciones de biblioteca de enlaces dinámicos no reguladas.

layoutkind.explicit

Para cada campo, ordene los miembros de tipo según el atributo fieldoffset

layoutkind.sequential

Las ocurrencias de pares son Los miembros de tipo ahora gobernados se ordenan en la memoria no administrada donde se define el tipo.

Pasar miembros de la estructura

El prototipo no regulado de una función se declara de la siguiente manera: