Compartilhar via


Como: Marshal ANSI Strings usando interoperabilidade de C++

Este tópico demonstra como seqüências de caracteres ANSI podem ser passados usando interoperabilidade de C++, mas o.NET Framework String representa cadeias de caracteres no formato Unicode, conversão de ANSI é uma etapa extra.Para interoperar com outros tipos de cadeia de caracteres, consulte os seguintes tópicos:

O código a seguir exemplos de uso de gerenciado, não gerenciado diretivas # pragma para implementar e gerenciados funções no mesmo arquivo, mas essas funções interoperam da mesma maneira se definidas em arquivos separados.Porque os arquivos que contêm somente funções não gerenciadas não precisará ser compilado com /CLR (common Language Runtime Compilation), eles podem manter suas características de desempenho.

Exemplo

O exemplo demonstra passando uma seqüência ANSI de um gerenciado para uma função não gerenciada usando StringToHGlobalAnsi.Este método aloca memória heap não gerenciada e retorna o endereço depois de executar a conversão.Isso significa que não é necessária nenhuma fixação (porque a memória no heap GC não está sendo passada para a função não gerenciada) e o IntPtr retornado de StringToHGlobalAnsi deve ser explicitamente liberado ou um resultados de perda 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 );
}

O exemplo a seguir demonstra o empacotamento de dados necessários para acessar uma seqüência ANSI em uma função gerenciada que é chamada de uma função não gerenciada.A função gerenciada, ao receber a seqüência de caracteres nativa, pode usá-lo diretamente ou convertê-la em uma string 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();
}

Consulte também

Referência

Usando interoperabilidade C++ (PInvoke implícita)