Partilhar via


Amostra de FindFile

Este exemplo demonstra como passar uma estrutura que contém uma estrutura de segunda, incorporada para uma função não gerenciada. Ele também demonstra como usar o MarshalAsAttribute atributo para declarar uma matriz de comprimento fixo dentro da estrutura. Neste exemplo, os elementos de estrutura incorporado são adicionados à estrutura de pai. Para obter um exemplo de uma estrutura de incorporado que não é nivelado, consulte O exemplo de estruturas.

O exemplo de FindFile usa a seguinte função não gerenciada, mostrada com sua declaração de função original:

  • FindFirstFile exportados do Kernel32. dll.

    HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);
    

A estrutura original passada para a função contém os seguintes elementos:

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;

Neste exemplo, o FindData classe contém um membro de dados correspondente para cada elemento da estrutura original e a estrutura incorporada. Em vez de dois buffers de caracteres original, a classe substitui seqüências de caracteres. MarshalAsAttribute define o UnmanagedType enumeração para ByValTStr, que é usado para identificar o embutido, conjuntos de caracteres de comprimento fixo que aparecem dentro de estruturas de não gerenciadas.

O LibWrap classe contém um protótipo gerenciado da FindFirstFile método, que passa a FindData a classe como um parâmetro. O parâmetro deve ser declarado com o InAttribute e OutAttribute atributos como classes, que são tipos de referência são passados como parâmetros, por padrão.

A declaração de protótipos

' 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 := 260)> _
    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
// Declares a class member for each 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=260)]
    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);
}
// Declares a class member for each structure element.
[StructLayout(LayoutKind::Sequential, CharSet=CharSet::Auto)]
public ref class FindData
{
public:
    int  fileAttributes;
    // creationTime was an embedded FILETIME structure.
    int  creationTime_lowDateTime;
    int  creationTime_highDateTime;
    // lastAccessTime was an embedded FILETIME structure.
    int  lastAccessTime_lowDateTime;
    int  lastAccessTime_highDateTime;
    // lastWriteTime was an embedded FILETIME structure.
    int  lastWriteTime_lowDateTime;
    int  lastWriteTime_highDateTime;
    int  nFileSizeHigh;
    int  nFileSizeLow;
    int  dwReserved0;
    int  dwReserved1;
    [MarshalAs(UnmanagedType::ByValTStr, SizeConst=260)]
    String^  fileName;
    [MarshalAs(UnmanagedType::ByValTStr, SizeConst=14)]
    String^  alternateFileName;
};

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

Chamando funções

Public Class App
    Public Shared Sub Main()
        Dim fd As New FindData()
        Dim handle As IntPtr = LibWrap.FindFirstFile("C:\*.*", fd)
        Console.WriteLine("The first file: {0}", fd.fileName)
    End Sub
End Class
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);
    }
}
public ref class App
{
public:
    static void Main()
    {
        FindData^ fd = gcnew FindData();
        IntPtr handle = LibWrap::FindFirstFile("C:\\*.*", fd);
        Console::WriteLine("The first file: {0}", fd->fileName);
    }
};

Consulte também

Conceitos

O empacotamento de Classes, estruturas e uniões

Tipos de dados de invocação de plataforma

A criação de protótipos em código gerenciado