FindFile のサンプル

このサンプルでは、第 2 の埋め込み構造体を含む構造体を、アンマネージ関数に渡す方法を示します。また、MarshalAsAttribute 属性を使用して、構造体の中で固定長配列を宣言する方法も示します。このサンプルでは、埋め込み構造体の要素を親の構造体に追加します。平坦化されない埋め込み構造体のサンプルについては、「構造体のサンプル」を参照してください。

FindFile のサンプルで使用するアンマネージ関数とその関数宣言を次に示します。

  • Kernel32.dll からエクスポートされる FindFirstFile

    HANDLE FindFirstFile(LPCTSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData);
    

関数に渡された元の構造体には、次に示す要素が含まれています。

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;

このサンプルでは、FindData クラスには元の構造体および埋め込み構造体の各要素と対応するデータ メンバが含まれます。2 つの元の文字バッファの代わりに、クラスは文字列を使用します。MarshalAsAttributeUnmanagedType 列挙体に ByValTStr を設定します。ByValTStr は、アンマネージ構造体の中に現れるインラインの固定長文字配列を識別するために使用されます。

LibWrap クラスには、FindFirstFile メソッドのマネージ プロトタイプが含まれます。このメソッドは FindData クラスをパラメータとして渡します。クラスは参照型であり、既定ではクラスが In パラメータとして渡されるため、パラメータの宣言時には InAttribute 属性と OutAttribute 属性を使用する必要があります。

次のコード例のソース コードは、.NET Framework「プラットフォーム呼び出しの技術サンプル」で提供されています。

プロトタイプの宣言

' 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 );
}

関数の呼び出し

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 );
   }
}

参照

概念

クラス、構造体、および共用体のマーシャリング
プラットフォーム呼び出しのデータ型
マネージ コードでのプロトタイプの作成