Comment : marshaler des chaînes Unicode à l'aide de l'interopérabilité C++
Cette rubrique illustre une facette de l'interopérabilité Visual C++.Pour plus d'informations, consultez l' Utilisation de l'interopérabilité C++ (PInvoke implicite).
Les exemples de code suivants utilisent les directives #pragma de managed, unmanaged pour implémenter des fonctions managées et non managées dans le même fichier, mais ces fonctions interagissent de la même manière qu'elles soient définies dans des fichiers séparés.Les fichiers qui contiennent uniquement des fonctions non managées ne doivent pas être compilés avec /clr (Compilation pour le Common Language Runtime).
Cette rubrique montre comment les chaînes Unicode peuvent être passées d'une fonction managée à une fonction non managée, et inversement.Pour interagir avec d'autres types de chaînes, consultez les rubriques suivantes :
Exemple
Pour passer une chaîne Unicode d'une fonction managée à une fonction non managée, la fonction PtrToStringChars (déclarée dans Vcclr.h) peut être utilisée pour accéder à la mémoire où la chaîne managée est stockée.Comme cette adresse est passée à une fonction native, il est important que la mémoire soit épinglée avec pin_ptr (C++/CLI) pour empêcher les données de type chaîne d'être déplacé, doit un cycle de garbage collection se produirait pendant que la fonction non managée.
// 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 );
}
L'exemple suivant illustre le marshaling de données nécessaire pour accéder à une chaîne Unicode dans une fonction managée appelée par une fonction non managée.La fonction managée, lors de la réception de la chaîne Unicode native, la convertit en chaîne managée à l'aide de la méthode d' 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();
}