Partilhar via


Como manipular strings ANSI usando interoperabilidade C++

Este tópico demonstra como as cadeias de caracteres ANSI podem ser passadas usando a Interoperabilidade C++, mas o .NET Framework String representa cadeias de caracteres no formato Unicode, portanto, a conversão para ANSI é uma etapa extra. Para interoperar com outros tipos de cadeia de caracteres, consulte os seguintes tópicos:

Os exemplos de código a seguir usam as diretivas de #pragma gerenciadas e não gerenciadas para implementar funções gerenciadas e não gerenciadas no mesmo arquivo, mas essas funções interoperam da mesma maneira se definidas em arquivos separados. Como os arquivos que contêm apenas funções não gerenciadas não precisam ser compilados com /clr (Common Language Runtime Compilation), eles podem manter suas características de desempenho.

Exemplo: Passar cadeia de caracteres ANSI

O exemplo demonstra a passagem de uma cadeia de caracteres ANSI de uma função gerenciada para uma função não gerenciada usando StringToHGlobalAnsi. Esse método aloca memória no heap não gerenciado e retorna o endereço depois de executar a conversão. Isso significa que nenhuma fixação é necessária (porque a memória na pilha GC não está sendo passada para a função não gerenciada) e que o IntPtr retornado de StringToHGlobalAnsi deve ser explicitamente liberado ou pode resultar em um vazamento de memória.

// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const char* p) {
   printf_s("(native) received '%s'\n", p);
}

#pragma managed

int main() {
   String^ s = gcnew String("sample string");
   IntPtr ip = Marshal::StringToHGlobalAnsi(s);
   const char* str = static_cast<const char*>(ip.ToPointer());

   Console::WriteLine("(managed) passing string...");
   NativeTakesAString( str );

   Marshal::FreeHGlobal( ip );
}

Exemplo: Gestão de dados necessária para aceder à sequência de caracteres ANSI

O exemplo a seguir demonstra o empacotamento de dados necessário para acessar uma cadeia de caracteres ANSI em uma função gerenciada que é chamada por uma função não gerenciada. A função gerenciada, ao receber a cadeia de caracteres nativa, pode usá-la diretamente ou convertê-la em uma cadeia de caracteres gerenciada usando o PtrToStringAnsi método, conforme mostrado.

// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(char* s) {
   String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
   Console::WriteLine("(managed): received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(native) calling managed func...\n";
   ManagedStringFunc("test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

Ver também

Usando Interoperabilidade C++ (PInvoke implícito)