다음을 통해 공유


Buffers 샘플

업데이트: 2007년 11월

이 샘플에서는 함수 매개 변수로 문자열(LPSTR)을 필요로 하는 관리되지 않는 함수에 In/Out 매개 변수를 통해 문자열을 전달하는 방법을 보여 줍니다. 또한, 호출자가 문자열에 할당된 메모리를 해제하지 않는 특수한 경우에 관리되지 않는 메서드에서 반환된 문자열을 사용하는 방법도 보여 줍니다.

이 샘플 플랫폼에서는 Kernel32.dll에서 내보낸 두 개의 네이티브 Win32 함수를 호출합니다.

  • GetSystemDirectory

    시스템 디렉터리의 경로를 검색합니다.

  • GetCommandLine

    현재 프로세스의 명령줄 문자열을 검색합니다.

LibWrap 클래스에는 콘솔 응용 프로그램의 Main에서 호출되는 관리되지 않는 함수를 위한 관리되는 프로토타입이 있습니다. CharSet 필드는 플랫폼 호출에서 런타임에 대상 플랫폼에 따라 ANSI 및 유니코드 중 하나를 선택할 수 있도록 설정되어 있습니다. 이 필드에 대한 자세한 내용은 문자 집합 지정을 참조하십시오.

GetSystemDirectory 프로토타입 메서드는 관리되지 않는 LPSTR 형식을 StringBuilder 버퍼로 대체합니다. 버퍼 크기는 고정된 상태로 있습니다. 원래 함수의 요구 사항에 맞도록 GetSystemDirectory는 버퍼 크기 변수를 두 번째 인수로 전달합니다. 선언에서는 문자열 대신 StringBuilder 버퍼가 LPTSTR 형식을 대체합니다. 변경할 수 없는 문자열과 달리 StringBuilder 버퍼는 변경할 수 있습니다.

네이티브 GetCommandLine 함수는 운영 체제에 의해 할당되고 소유되는 버퍼에 대한 포인터를 반환합니다. 문자열을 반환 형식으로 마샬링할 때 interop 마샬러에서는 함수를 통해 원래의 LPTSTR 형식이 가리킨 메모리를 해제해야 하는 것으로 가정합니다. 마샬러에서 이 메모리를 자동으로 회수하지 않도록 하기 위해, 관리되는 GetCommandLine 프로토타입에서는 문자열 대신 IntPtr 형식을 반환합니다. PtrToStringAuto 메서드에서는 필요하면 문자 형식을 확장하여 관리되지 않는 LPSTR 형식을 관리되는 문자열 개체로 복사합니다.

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

프로토타입 선언

Public Class LibWrap
   Declare Auto Sub GetSystemDirectory Lib "Kernel32.dll" _
      ( ByVal sysDirBuffer As StringBuilder, ByVal buffSize As Integer )
   Declare Auto Function GetCommandLine Lib "Kernel32.dll" () As IntPtr
End Class
public class LibWrap
{
   [ DllImport( "Kernel32.dll", CharSet=CharSet.Auto )]
   public static extern int GetSystemDirectory( StringBuilder 
      sysDirBuffer, int size );
   [ DllImport( "Kernel32.dll", CharSet=CharSet.Auto )] 
   public static extern IntPtr GetCommandLine();   
}

함수 호출

Public Class App
   Public Shared Sub Main()
      ' Call GetSystemDirectory.
      Dim sysDirBuffer As New StringBuilder( 256 )
      LibWrap.GetSystemDirectory( sysDirBuffer, sysDirBuffer.Capacity )
      …
      ' Call GetCommandLine.
      Dim cmdLineStr As IntPtr = LibWrap.GetCommandLine()
      Dim commandLine As String = Marshal.PtrToStringAuto( cmdLineStr )
   End Sub
End Class
public class App
{
   public static void Main()
   {
      // Call GetSystemDirectory.
      StringBuilder sysDirBuffer = new StringBuilder( 256 );
      LibWrap.GetSystemDirectory( sysDirBuffer, sysDirBuffer.Capacity );
      …
      // Call GetCommandLine.
      IntPtr cmdLineStr = LibWrap.GetCommandLine();
      String commandLine = Marshal.PtrToStringAuto( cmdLineStr );
   }
}

참고 항목

작업

Platform Invoke 기술 샘플

개념

문자열 마샬링

플랫폼 호출 데이터 형식

문자열에 대한 기본 마샬링

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