Compartir a través de


Ejemplo FindFile

Actualización: noviembre 2007

En este ejemplo se demuestra cómo pasar a una función no administrada una estructura que contiene una segunda estructura incrustada. También se muestra cómo utilizar el atributo MarshalAsAttribute para declarar una matriz de longitud fija dentro de la estructura. En este ejemplo, los elementos de la estructura incrustada se agregan a la estructura principal. Para obtener un ejemplo de una estructura incrustada que no esté simplificada, vea Ejemplo Structs.

En el ejemplo FindFile, se utiliza la siguiente función no administrada, que se muestra con su declaración de función original:

  • FindFirstFile exportada desde Kernel32.dll.

    HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);
    

La estructura original pasada a la función contiene los elementos siguientes:

typedef struct _WIN32_FIND_DATA 
{
  DWORD    dwFileAttributes; 
  FILETIME ftCreationTime; 
  FILETIME ftLastAccessTime; 
  FILETIME ftLastWriteTime; 
  DWORD    nFileSizeHigh; 
  DWORD    nFileSizeLow; 
  DWORD    dwReserved0; 
  DWORD    dwReserved1; 
  TCHAR    cFileName[ MAX_PATH ]; 
  TCHAR    cAlternateFileName[ 14 ]; 
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

En este ejemplo, la clase FindData contiene un miembro de datos correspondiente a cada elemento de la estructura original y la estructura incrustada. La clase sustituye dos búferes de caracteres originales por cadenas. MarshalAsAttribute establece la enumeración UnmanagedType en ByValTStr, que se utiliza para identificar las matrices de caracteres de longitud fija insertadas que aparecen en las estructuras no administradas.

La clase LibWrap contiene un prototipo administrado del método FindFirstFile, que pasa la clase FindData como parámetro. 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.

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, CharSet := CharSet.Auto )> _
Public Class FindData
   Public fileAttributes As Integer = 0
   ' creationTime was a by-value FILETIME structure.
   Public creationTime_lowDateTime As Integer = 0
   Public creationTime_highDateTime As Integer = 0
   ' lastAccessTime was a by-value FILETIME structure.
   Public lastAccessTime_lowDateTime As Integer = 0
   Public lastAccessTime_highDateTime As Integer = 0
   ' lastWriteTime was a by-value FILETIME structure.
   Public lastWriteTime_lowDateTime As Integer = 0
   Public lastWriteTime_highDateTime As Integer = 0
   Public nFileSizeHigh As Integer = 0
   Public nFileSizeLow As Integer = 0
   Public dwReserved0 As Integer = 0
   Public dwReserved1 As Integer = 0
   < MarshalAs( UnmanagedType.ByValTStr, SizeConst := 256 )> _
   Public fileName As String = Nothing
   < MarshalAs( UnmanagedType.ByValTStr, SizeConst := 14 )> _
   Public alternateFileName As String = Nothing
End Class 'FindData

Public Class LibWrap
   ' Declares a managed prototype for the unmanaged function.
   Declare Auto Function FindFirstFile Lib "Kernel32.dll" _
      ( ByVal fileName As String, <[In], Out> ByVal findFileData As _
      FindData ) As IntPtr
End Class 'LibWrap
// Declares a class member for structure element.
[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Auto )]
public class FindData 
{
   public int  fileAttributes = 0;
   // creationTime was an embedded FILETIME structure.
   public int  creationTime_lowDateTime = 0 ;
   public int  creationTime_highDateTime = 0;
   // lastAccessTime was an embedded FILETIME structure.
   public int  lastAccessTime_lowDateTime = 0;
   public int  lastAccessTime_highDateTime = 0;
   // lastWriteTime was an embedded FILETIME structure.
   public int  lastWriteTime_lowDateTime = 0;
   public int  lastWriteTime_highDateTime = 0;
   public int  nFileSizeHigh = 0;
   public int  nFileSizeLow = 0;
   public int  dwReserved0 = 0;
   public int  dwReserved1 = 0;
   [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=256 )]
   public String  fileName = null;
   [ MarshalAs( UnmanagedType.ByValTStr, SizeConst=14 )]
   public String  alternateFileName = null;
}

public class LibWrap
{
// Declares a managed prototype for the unmanaged function.
   [DllImport( "Kernel32.dll", CharSet=CharSet.Auto )]
   public static extern IntPtr FindFirstFile( String fileName, [ In, Out ] 
   FindData findFileData );
}

Llamadas a funciones

Public Class App
   Public Shared Sub Main()
   
      Dim fd As New FindData()
      LibWrap.FindFirstFile( "C:\*", fd )
      Console.WriteLine( "The first file: {0}", fd.fileName )
      
   End Sub 'Main
End Class 'App
public class App
{
   public static void Main()
   {
      FindData fd = new FindData();
      IntPtr handle = LibWrap.FindFirstFile( "C:\\*.*", fd );
      Console.WriteLine( "The first file: {0}", fd.fileName );
   }
}

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