Buffers de amostra

Este exemplo mostra sistema autônomo passar cadeias de caracteres sistema autônomo in/out parâmetros para funções não gerenciadas que esperam uma string (LPSTR) sistema autônomo um parâmetro de função. Além disso, ele mostra como usar uma seqüência de caracteres retornada de um método não gerenciado no caso especial em que o chamador não deve disponível memória alocada para a seqüência de caracteres.

Essa plataforma exemplo chama duas funções nativas do Win32 exportadas do Kernel32.dll:

  • GetSystemDirectory

    Recupera o caminho do diretório do sistema.

  • GetCommandLine

    Recupera a seqüência de linha de comando para o processo corrente.

The LibWrap classe contém um gerenciado protótipos para as funções não gerenciados, que são chamados de Main no aplicativo de console. The CharSet campo é definido para invocação de plataforma que pode escolher entre ANSI e Unicode formatos em time de execução, com base em plataforma de destino. Para obter mais informações sobre esse campo, consulte Especificando um conjunto de caracteres.

The GetSystemDirectory método protótipo substitui um StringBuilder buffer para o não-gerenciado LPSTR Digite. O dimensionar do buffer permanece fixa.Para acomodar sistema autônomo requisitos da função original, GetSystemDirectory passa a variável de dimensionar de buffer sistema autônomo o segundo argumento. A StringBuilder buffer, em vez de uma seqüência de caracteres, substitui o LPTSTR Digite na declaração. Ao contrário das seqüências de caracteres, que são imutáveis, StringBuilder buffers podem ser alterados.

O nativoGetCommandLine função retorna um ponteiro para um buffer alocado e pertence ao sistema operacional. Quando cadeias de caracteres sistema autônomo tipos de retorno de marshaling interop marshaler pressupõe que ele deve liberar a memória que o original LPTSTR tipo apontada pela função. Para impedir que o marshaler recuperar automaticamente essa memória, o gerenciado GetCommandLine protótipo retorna uma IntPtr Digite em vez de uma seqüência de caracteres. The PtrToStringAuto método copia o não-gerenciado LPSTR Digite a um objeto de cadeia gerenciada, ampliando a formatação de caractere, se necessário.

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

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

Chamando funções

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

Consulte também

Tarefas

Invocação de plataforma Tecnologia Exemplo

Conceitos

marshaling de strings

Tipos de dados de invocação de plataforma

Padrão de marshaling de strings

Criando protótipos em código gerenciado