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


Hogyan: Marshal COM-karakterláncok használata C++ interop segítségével

Ez a témakör bemutatja, hogyan továbbítható egy BSTR (a COM-programozásban előnyben részesített alapsztringformátum) 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:

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.

Példa: BSTR átadása felügyeltről nem felügyelt függvényre

Az alábbi példa bemutatja, hogyan továbbítható egy BSTR (a COM-programozásban használt sztringformátum) egy felügyelt függvényből egy nem felügyelt függvénynek. A hívó felügyelt függvény StringToBSTR segítségével kéri le a .NET System.String tartalmának BSTR-reprezentációjának címét. Ez a mutató a pin_ptr (C++/CLI) használatával van rögzítve, hogy a fizikai címe ne változzon a szemétgyűjtési ciklus során, miközben a nem felügyelt függvény fut. A szemétgyűjtő nem mozgathatja a memóriát, amíg a pin_ptr (C++/CLI) ki nem lép a hatókörből.

// MarshalBSTR1.cpp
// compile with: /clr
#define WINVER 0x0502
#define _AFXDLL
#include <afxwin.h>

#include <iostream>
using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(BSTR bstr) {
   printf_s("%S", bstr);
}

#pragma managed

int main() {
   String^ s = "test string";

   IntPtr ip = Marshal::StringToBSTR(s);
   BSTR bs = static_cast<BSTR>(ip.ToPointer());
   pin_ptr<BSTR> b = &bs;

   NativeTakesAString( bs );
   Marshal::FreeBSTR(ip);
}

Példa: BSTR továbbítása nem felügyelt függvényről felügyelt függvényre

Az alábbi példa bemutatja, hogyan továbbítható egy BSTR egy nem felügyelt függvényből egy felügyelt függvénynek. A fogadó felügyelt függvény használhatja a karaktersorozatot BSTR-ként, vagy PtrToStringBSTR használatával átalakíthatja azt String-ké, hogy más felügyelt függvényekkel használható legyen. Mivel a BSTR-t képviselő memória a nem felügyelt halomra van lefoglalva, nincs szükség rögzítésre, mert a nem felügyelt halomon nincs szemétgyűjtés.

// MarshalBSTR2.cpp
// compile with: /clr
#define WINVER 0x0502
#define _AFXDLL
#include <afxwin.h>

#include <iostream>
using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedTakesAString(BSTR bstr) {
   String^ s = Marshal::PtrToStringBSTR(static_cast<IntPtr>(bstr));
   Console::WriteLine("(managed) convered BSTR to String: '{0}'", s);
}

#pragma unmanaged

void UnManagedFunc() {
   BSTR bs = SysAllocString(L"test string");
   printf_s("(unmanaged) passing BSTR to managed func...\n");
   ManagedTakesAString(bs);
}

#pragma managed

int main() {
   UnManagedFunc();
}

Lásd még

C++ Interop használata (Implicit PInvoke)