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 Utilisation de l’interopérabilité C++ (PInvoke implicite).
Les exemples de code suivants utilisent les directives de #pragma managées non managées 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 si elles sont définies dans des fichiers distincts. Les fichiers contenant uniquement les fonctions non managées n’ont pas besoin d’être compilés avec /clr (Compilation 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 vice versa. Pour interagir avec d’autres types de chaînes, consultez les rubriques suivantes :
Guide pratique pour marshaler des chaînes ANSI à l’aide de l’interopérabilité C++
Guide pratique pour marshaler des chaînes COM à l’aide de l’interopérabilité C++
Exemple : Passer une chaîne Unicode d’une fonction managée à une fonction non managée
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. Étant donné que 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 le déplacement des données de chaîne, si un cycle de garbage collection a lieu pendant l’exécution de 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 );
}
Exemple : Marshaling de données requis pour accéder à la chaîne Unicode
L’exemple suivant illustre le marshaling de données requis 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 PtrToStringUni méthode.
// 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();
}