Ejemplo de tecnología de invocación de plataformas
Actualización: noviembre 2007
Este ejemplo muestra las técnicas empleadas para llamar a las funciones exportadas de una biblioteca no administrada. Muestra cómo:
Declarar tipos diferentes.
Utilizar los atributos disponibles para modificar el comportamiento predeterminado.
Utilizar métodos del tipo Marshal.
Determinar qué aspectos de la recolección de elementos no utilizados y del subprocesamiento pueden afectar a los resultados.
Algunos de los ejemplos utilizan funciones exportadas de las bibliotecas de Windows y otros utilizan funciones exportadas de una biblioteca personalizada. Ciertos ejemplos utilizan bibliotecas que no están disponibles en todas las plataformas de Windows o utilizan funciones no admitidas en todas ellas. Sin embargo, esto no le impedirá entender las reglas de invocación específicas de la plataforma utilizadas en cada ejemplo.
Estos ejemplos contienen la siguiente estructura de directorios:
Directorio |
Contenido |
---|---|
WinAPIs |
Invocación de plataformas mostrada utilizando las funciones exportadas de las bibliotecas de Windows |
WinAPIs\CS |
Código fuente escrito en C# |
WinAPIs\VB |
Código fuente escrito en Visual Basic |
Custom |
Invocación de plataformas mostrada utilizando las funciones exportadas de una biblioteca de tipos personalizada |
Custom\CS |
Código fuente escrito en C# |
Custom\LIB |
Código fuente de la biblioteca de tipos personalizada |
Custom\VB |
Código fuente escrito en VB |
Para obtener información sobre el uso de los ejemplos, consulte los temas siguientes:
Para generar los ejemplos desde el símbolo del sistema:
Abra una ventana del símbolo del sistema y navegue hasta el subdirectorio específico de uno de los lenguajes.
Escriba msbuild [nombre de archivo].sln en la línea de comandos.
Nota: Los ejemplos de invocación de plataforma personalizados sólo se pueden generar con Visual Studio.
Para generar los ejemplos mediante Visual Studio:
Abra el Explorador de Windows y navegue hasta el subdirectorio específico de uno de los lenguajes.
Haga doble clic en el icono de [nombre de archivo].sln para abrir el archivo en Visual Studio.
En el menú Generar, seleccione Generar solución.
Para ejecutar los ejemplos:
Navegue hasta el subdirectorio específico de uno de los lenguajes bajo el directorio WinAPIs o Custom, que contiene los archivos ejecutables generados.
Escriba el nombre del archivo ejecutable en la línea de comandos.
Nota: Este ejemplo genera aplicaciones de consola. Para poder ver el resultado, debe iniciar cada una de ellas desde la línea de comandos.
Requisitos
En estos ejemplos, son necesarios los encabezados de Windows, que estarán disponibles para el proyecto si realizó la compilación con Microsoft Visual Studio 2005, el símbolo del sistema de Visual Studio 2005, o si tiene instalado Platform SDK y está especificado en una ruta de acceso de inclusión.
Comentarios
Las tablas siguientes resumen los temas mostrados por estos ejemplos y muestran las ubicaciones de los archivos de código fuente para el ejemplo o los ejemplos relacionados con cada tema.
Cómo utilizar los atributos de invocación de plataformas
Atributo |
Descripción |
Código de |
---|---|---|
EntryPoint |
Cambia el nombre de una función para su uso en el código administrado. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CharSet |
Elige la forma de calcular las referencias a las cadenas; también afecta al criterio de búsqueda de nombres de funciones. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
ExactSpelling |
Indica si el nombre del punto de entrada del archivo DLL no administrado se debe modificar para que se corresponda con el valor de CharSet. |
WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb |
CallingConvention |
Llama a las funciones con varargs. |
WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb |
PreserveSig |
Modifica las funciones que devuelven HRESULTs. |
WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb |
SetLastError |
Garantiza que el código de error se guarde tras la llamada a una función. |
WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb |
Cómo calcular las referencias a las estructuras y uniones
Tipo |
Descripción |
Código de |
---|---|---|
Estructura ByVal |
Pasa una estructura como parámetro In. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Estructura ByRef |
Pasa una estructura como parámetro In/Out. |
WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb |
Clase ByVal |
Pasa una clase sólo con miembros enteros como parámetro In/Out. |
WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb |
Estructura con estructuras anidadas (simplificada) |
Genera una clase que representa una estructura con estructuras anidadas en la parte no administrada. La estructura se simplifica en una gran estructura en la parte administrada. |
WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb |
Estructura con estructuras anidadas (no simplificada) |
Pasa una estructura con una estructura incrustada. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Estructura que contiene el puntero a otra estructura |
Pasa una estructura que contiene un puntero a otra estructura como miembro. |
Custom\CS\Structs.cs Custom\VB\Structs.vb |
Matriz de estructuras que contienen sólo números enteros ByVal |
Pasa como parámetro In/Out una matriz de estructuras que sólo contienen enteros. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Matriz de estructuras que contienen enteros y cadenas ByRef |
Pasa una matriz de estructuras que contienen enteros y cadenas como parámetro Out. El destinatario asigna la memoria para la matriz. |
Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb |
Uniones con tipos de valor |
Pasa una unión con tipos de valor (entero y doble). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Uniones con tipos mixtos |
Pasa una unión con tipos mixtos (entero y cadena). |
Custom\CS\Unions.cs Custom\VB\Unions.vb |
Cómo calcular las referencias a las matrices
Matriz |
Descripción |
Código de |
---|---|---|
Matriz de enteros ByVal |
Pasa una matriz de enteros como parámetro In/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Matriz de enteros ByRef |
Pasa una matriz de enteros como parámetro In/Out. La matriz se puede cambiar de tamaño. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Matriz 2D de enteros ByVal |
Pasa una matriz de enteros como parámetro In/Out. |
Custom\CS\Arrays.cs Custom\VB\Arrays.vb |
Varios
Tipo de elemento |
Descripción |
Código de |
---|---|---|
HandleRef |
Presenta un caso cuando se necesita utilizar HandleRef para impedir la recolección de elementos no utilizados. |
WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb |
Punteros a función |
Pasa un delegado a una función no administrada que espera recibir un puntero a función. |
Custom\CS\Callback.cs Custom\VB\Callback.vb |
void* |
Llama a una función que tiene void* como parámetro. |
Custom\CS\Void.cs Custom\VB\Void.vb |
LPARAM |
Utiliza GCHandle para pasar un objeto administrado a una función no administrada que espera LPARAM. |
WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb |
Apartamento de un único subproceso (STA) / Apartamento multiproceso (MTA) |
Cambia la configuración de apartamento predeterminada cuando una función no administrada llama a CoInitialize. |
WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb |
Para obtener más información sobre la invocación de plataformas, lea los comentarios de los archivos de código fuente.
Vea también
Conceptos
Consumir funciones DLL no administradas
Ejemplos de invocación de plataforma