Compartilhar via


Como: realizar realizar marshaling o Unicode Strings usando interoperabilidade C++

Este tópico demonstra um Faceta de interoperabilidade do Visual C++.Para obter mais informações, consulte Usando a interoperabilidade de C++ (PInvoke implícita).

Os exemplos de código a seguir usam o gerenciado, não gerenciado para implementar as diretivas # pragma gerenciado e funções não gerenciadas no mesmo arquivo, mas essas funções interoperam da mesma forma se definidas em arquivos separados. Arquivos que contêm somente funções não gerenciadas não precisam ser compilado com o CLR (ComComummon Idioma Tempo de execução ComComumpilation).

Este tópico demonstra como cadeias de caracteres Unicode podem ser passado de um gerenciado para uma função não gerenciada e vice-versa.Para interoperar com outros tipos de cadeias de caracteres, consulte os tópicos a seguir:

Exemplo

Para passar uma cadeia 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 seqüência de caracteres gerenciada está armazenada.Porque esse endereço será passado para um nativo função, é importante que a memória ser fixados com pin_ptr Para impedir que os dados de seqüência de caracteres realocados, deve um ciclo de coleta de lixo ocorrer 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) recieved '%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 marshaling de dados necessários para acessar uma seqüência de caracteres Unicode em um gerenciado função chamada por um un gerenciado função.A função gerenciada, em receber a seqüência nativo Unicode, converte em uma seqüência de caracteres 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) recieved '{0}'", ms);
}

#pragma unmanaged

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

#pragma managed

int main() {
   NativeProvidesAString();
}

Consulte também

Referência

Usando a interoperabilidade de C++ (PInvoke implícita)