다음을 통해 공유


FindFile 샘플

업데이트: 2007년 11월

이 샘플에서는 또 다른 포함된 구조체가 있는 구조체를 관리되지 않는 함수에 전달하는 방법을 보여 줍니다. 또한 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 클래스에는 원래 구조체 및 포함된 구조체의 각 요소에 해당하는 데이터 멤버가 포함되어 있습니다. 이 클래스는 두 개의 원래 문자 버퍼 대신 문자열로 대체합니다. MarshalAsAttributeUnmanagedType 열거형을 ByValTStr로 설정합니다. ByValTStr은 관리되지 않는 구조체 내에 나타나는 고정 길이의 인라인 문자 배열을 식별하는 데 사용됩니다.

LibWrap 클래스에는 FindData 클래스를 매개 변수를 통해 전달하는 FindFirstFile 메서드의 관리되는 프로토타입이 포함되어 있습니다. 참조 형식인 클래스는 기본적으로 In 매개 변수로 전달되므로 이 매개 변수는 InAttributeOutAttribute 특성과 함께 선언되어야 합니다.

다음 코드 예제의 소스 코드는 .NET Framework Platform Invoke 기술 샘플을 통해 제공됩니다.

프로토타입 선언

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

참고 항목

개념

클래스, 구조체 및 공용 구조체 마샬링

플랫폼 호출 데이터 형식

관리 코드에서 프로토타입 만들기