Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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();
}