Como realizar marshaling de cadeias de caracteres Unicode usando interop C++
Este tópico demonstra uma faceta da interoperabilidade do Visual C++. Para obter mais informações, confira Usando a interoperabilidade do C++ (PInvoke Implícito).
Os exemplos de código a seguir usam as diretivas de #pragma managed, unmanaged 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. Os arquivos que contêm apenas funções não gerenciadas não precisam ser compilados com /clr (compilação do Common Language Runtime).
Este tópico demonstra como as cadeias de caracteres Unicode podem ser passadas de uma função gerenciada para uma função não gerenciada e vice-versa. Para interoperar com outros tipos de cadeias de caracteres, confira os seguintes tópicos:
Como realizar marshaling de cadeias de caracteres ANSI usando interop do C++
Como realizar marshaling de cadeias de caracteres COM usando interop do C++
Exemplo: passar uma cadeia de caracteres Unicode da função gerenciada para não gerenciada
Para passar uma cadeia de caracteres Unicode de uma função gerenciada para uma não gerenciada, a função PtrToStringChars (declarada em Vcclr.h) pode ser usada para acessar na memória em que a cadeia de caracteres gerenciada está armazenada. Como esse endereço será passado para uma função nativa, é importante que a memória seja fixada com pin_ptr (C++/CLI) para impedir que os dados de cadeia de caracteres sejam realocados, caso um ciclo de coleta de lixo ocorra enquanto a função não gerenciada for executada.
// MarshalUnicode1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
#include <vcclr.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma unmanaged
void NativeTakesAString(const wchar_t* p) {
printf_s("(native) received '%S'\n", p);
}
#pragma managed
int main() {
String^ s = gcnew String("test string");
pin_ptr<const wchar_t> str = PtrToStringChars(s);
Console::WriteLine("(managed) passing string to native func...");
NativeTakesAString( str );
}
Exemplo: marshaling de dados necessário para acessar a cadeia de caracteres Unicode
O exemplo a seguir demonstra o marshaling de dados necessário para acessar uma cadeia de caracteres Unicode em uma função gerenciada chamada por uma função não gerenciada. A função gerenciada, ao receber a cadeia de caracteres Unicode nativa, converte-a em uma cadeia de caracteres gerenciada usando o método PtrToStringUni.
// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
void ManagedStringFunc(wchar_t* s) {
String^ ms = Marshal::PtrToStringUni((IntPtr)s);
Console::WriteLine("(managed) received '{0}'", ms);
}
#pragma unmanaged
void NativeProvidesAString() {
cout << "(unmanaged) calling managed func...\n";
ManagedStringFunc(L"test string");
}
#pragma managed
int main() {
NativeProvidesAString();
}