Como: Cadeias de caracteres do Unicode Marshal usando a interoperabilidade de C++
Este tópico demonstra uma faceta de interoperabilidade do Visual C++. For more information, see Usar a interoperabilidade de C++ (PInvoke implícito).
O código a seguir exemplos de uso do managed, unmanaged diretivas # pragma implementar gerenciados e funções não gerenciadas no mesmo arquivo, mas essas funções interoperam da mesma maneira, se definido em arquivos separados. Arquivos contendo apenas as funções não gerenciadas não precisam ser compilado com /CLR (common Language Runtime Compilation).
Este tópico demonstra como cadeias de caracteres Unicode podem ser transmitido de um gerenciado para uma função não gerenciada e vice-versa. Para interoperar com outros tipos de cadeias de caracteres, consulte os seguintes tópicos:
Como: Seqüências de caracteres ANSI Marshal usando a interoperabilidade de C++
Como: Empacotar COM seqüências de caracteres usando a interoperabilidade de C++
Exemplo
Para passar uma seqüência de caracteres Unicode de um gerenciado para uma função não gerenciada, a função PtrToStringChars (declarada no Vcclr.h) pode ser usada para acesso na memória onde a cadeia gerenciada está armazenada. Porque esse endereço será passado para uma função nativa, é importante que a memória ser fixado com pin_ptr para impedir que os dados de seqüência de caracteres que estão sendo realocados, um ciclo de coleta de lixo acontecerá enquanto executa a função não gerenciada.
// 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 );
}
O exemplo a seguir demonstra o empacotamento de dados necessários para acessar uma seqüência de caracteres Unicode em uma função gerenciada chamada por uma função não gerenciada. A função gerenciada, ao receber a seqüência de caracteres Unicode nativa, o converte em uma string gerenciada usando o PtrToStringUni método.
// 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();
}