Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este ejemplo se demuestra cómo pasar una clase que contiene enteros a una función no administrada que espera recibir un puntero a una estructura.
En el ejemplo SysTime se utiliza la siguiente función no administrada, que se muestra con su declaración de función original:
GetSystemTime exportada desde Kernel32.dll.
VOID GetSystemTime(LPSYSTEMTIME lpSystemTime);
La estructura original pasada a la función contiene los elementos siguientes:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
En este ejemplo, la clase SystemTime contiene los elementos de la estructura original representados como miembros de clase. El atributo StructLayoutAttribute se establece para asegurar que los miembros se organizan en la memoria de forma secuencial, en el orden en que aparecen.
La clase LibWrap contiene un prototipo administrado del método GetSystemTime, que pasa la clase SystemTime como parámetro In/Out de forma predeterminada. El parámetro se debe declarar con los atributos InAttribute y OutAttribute porque las clases, que son tipos de referencia, se pasan como parámetros In de forma predeterminada. Para que el llamador reciba los resultados, los atributos direccionales se deben aplicar de forma explícita. La clase App crea una nueva instancia de la clase SystemTime y obtiene acceso a sus campos de datos.
El código fuente de los ejemplos de código siguientes lo proporciona el Ejemplo de tecnología de invocación de plataformas de .NET Framework.
Declaración de prototipos
' Declares a class member for each structure element.
< StructLayout(LayoutKind.Sequential )> _
Public Class SystemTime
Public year As Short
…
Public milliseconds As Short
End Class 'SystemTime
Public Class LibWrap
' Declares a managed prototype for the unmanaged function.
Declare Sub GetSystemTime Lib "Kernel32.dll" ( <[In], Out> ByVal st _
As SystemTime )
End Class 'LibWrap
// Declares a class member for each structure element.
[ StructLayout( LayoutKind.Sequential )]
public class SystemTime
{
public ushort year;
…
public ushort milliseconds;
}
public class LibWrap
{
// Declares a managed prototype for the unmanaged function.
[ DllImport( "Kernel32.dll" )]
public static extern void GetSystemTime( [In,Out] SystemTime st );
}
Llamadas a funciones
Public Class App
Public Shared Sub Main()
Dim st As New SystemTime()
LibWrap.GetSystemTime( st )
Console.Write( "The Date and Time is: " )
…
End Sub 'Main
End Class 'App
public class App
{
public static void Main()
{
SystemTime st = new SystemTime();
LibWrap.GetSystemTime( st );
Console.Write( "The Date and Time is: " );
…
}
}
Vea también
Conceptos
Calcular referencias de clases, estructuras y uniones
Tipos de datos de invocación de plataforma
Crear prototipos en código administrado