Megosztás a következőn keresztül:


Hogyan kell: ANSI-sztringek kezelése a C++ Interop használatával

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:

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

Lásd még

C++ Interop használata (Implicit PInvoke)