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ó 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:
Útmutató: Unicode karakterláncok kezelése C++ interop technológia használatával
Útmutató: ANSI-sztringek betöltése C++ interoperabilitás segítségével
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();
}