Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör a Visual C++ együttműködés egyik aspektusát mutatja be. További információ: C++ Interop (Implicit PInvoke) használata.
Az alábbi példakódok a felügyelt, nem felügyelt #pragma irányelveket használják a felügyelt és nem felügyelt függvények ugyanazon fájlban való implementálásához, de ezek a függvények ugyanúgy működnek együtt, ha külön fájlokban vannak definiálva. A csak nem felügyelt függvényeket tartalmazó fájlokat nem kell a /clr (Common Language Runtime Compilation) használatával lefordítani.
Ez a témakör bemutatja, hogyan továbbíthatók a Unicode-sztringek egy felügyelt függvényből egy nem felügyelt függvénybe, és fordítva. Más sztringtípusokkal való együttműködésről az alábbi témakörökben olvashat:
Útmutató: ANSI-sztringek betöltése C++ interoperabilitás segítségével
Útmutató arról, hogyan történik a COM sztringek átvitele C++ interop használatával
Példa: Unicode-sztring átadása felügyelt függvényről nem felügyelt függvényre
Ha unicode-sztringet szeretne átadni egy felügyelt függvényről egy nem felügyelt függvényre, a PtrToStringChars függvény (vcclr.h-ban deklarálva) használható a felügyelt sztring tárolására szolgáló memóriához való hozzáféréshez. Mivel ez a cím egy natív függvénynek lesz átadva, fontos, hogy a memória rögzítve legyen a pin_ptr (C++/CLI) segítségével a sztringadatok áthelyezésének megakadályozása érdekében, ha a nem felügyelt függvény végrehajtása közben szemétgyűjtési ciklus történik.
// 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 );
}
Példa: Unicode string eléréséhez szükséges adatformázás
Az alábbi példa bemutatja az adatkezelést, amely szükséges ahhoz, hogy egy nem felügyelt függvény által hívott felügyelt függvény Unicode karakterláncát elérjük. A felügyelt függvény a natív Unicode-sztring fogadásakor a metódussal PtrToStringUni felügyelt sztringgé alakítja át.
// 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();
}