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 :

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();
}

Voir aussi

Utilisation de l’interopérabilité C++ (PInvoke implicite)