Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este exemplo demonstra como passar uma estrutura que contém uma estrutura em segundo lugar, incorporada para uma função não gerenciada.Ele também demonstra como usar o MarshalAsAttribute atributo para declarar uma matriz de tamanho fixo dentro da estrutura. Neste exemplo, os elementos de estrutura incorporados são adicionados à estrutura pai.Para obter uma amostra de uma estrutura incorporada que não é nivelada, consulte Exemplo de estruturas.
O exemplo FindFile utiliza a seguinte função não gerenciada, mostrada com sua declaração de função original:
FindFirstFile exportados de 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, a 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 caractere original, a classe substitui as seqüências de caractere.MarshalAsAttribute sets the UnmanagedType enumeração para ByValTStr, que é usado para identificar o embutido comprimento fixo, matrizes que aparecem dentro de estruturas não-gerenciadas de caractere.
The LibWrap classe contém um protótipo do gerenciado de FindFirstFile método, que passa a FindData classe sistema autônomo um parâmetro. O parâmetro deve ser declarado com o InAttribute e OutAttribute atributos sistema autônomo referência a classes, que são tipos, são passados sistema autônomo in parâmetros por padrão.
O código-fonte para os exemplos de código a seguir é fornecido pelo.NET estrutura Invocação de plataforma Tecnologia Exemplo.
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 := 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 );
}
Chamando funções
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 );
}
}
Consulte também
Conceitos
marshaling de classes, estruturas e uniões