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 bemutatja, hogyan továbbíthatók az ANSI-sztringek a C++ Interop használatával, de a .NET-keretrendszer String Unicode formátumú sztringeket jelöl, ezért az ANSI-né való átalakítás további lépés. Más sztringtípusokkal való együttműködésről az alábbi témakörökben olvashat:
Útmutató: Unicode karakterláncok kezelése C++ interop technológia használatával
Útmutató arról, hogyan történik a COM sztringek átvitele C++ interop használatával
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. Mivel a csak nem felügyelt függvényeket tartalmazó fájlokat nem kell a /clr (Common Language Runtime Compilation) használatával lefordítani, megtarthatják a teljesítményjellemzőket.
Példa: ANSI-sztring átadása
A példa bemutatja, hogy egy ANSI-sztringet egy felügyelt függvényből egy nem felügyelt függvénybe ad át.StringToHGlobalAnsi Ez az eljárás lefoglalja a memóriát a nem felügyelt halomban, és visszaadja a címet a konvertálás végrehajtása után. Ez azt jelenti, hogy nincs szükség rögzítésre (mivel a GC-halom memóriáját nem adják át a nem felügyelt függvénynek), és a StringToHGlobalAnsi által visszaadott IntPtr-t explicit módon ki kell szabadítani, különben memóriaszivárgás lép fel.
// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma unmanaged
void NativeTakesAString(const char* p) {
printf_s("(native) received '%s'\n", p);
}
#pragma managed
int main() {
String^ s = gcnew String("sample string");
IntPtr ip = Marshal::StringToHGlobalAnsi(s);
const char* str = static_cast<const char*>(ip.ToPointer());
Console::WriteLine("(managed) passing string...");
NativeTakesAString( str );
Marshal::FreeHGlobal( ip );
}
Példa: Az ANSI karakterlánc eléréséhez szükséges adatkezelés
Az alábbi példa egy nem felügyelt függvény által hívott felügyelt függvény ANSI-sztringjének eléréséhez szükséges adatmegfelelősítést mutatja be. A felügyelt függvény a natív sztring fogadásakor közvetlenül is használhatja, vagy a PtrToStringAnsi metódus használatával felügyelt sztringgé alakíthatja, amint az látható.
// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
void ManagedStringFunc(char* s) {
String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
Console::WriteLine("(managed): received '{0}'", ms);
}
#pragma unmanaged
void NativeProvidesAString() {
cout << "(native) calling managed func...\n";
ManagedStringFunc("test string");
}
#pragma managed
int main() {
NativeProvidesAString();
}