Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt gedemonstreerd hoe een BSTR (de basistekenreeksindeling die wordt gebruikt in COM-programmering) kan worden doorgegeven van een beheerde functie naar een onbeheerde functie en omgekeerd. Zie de volgende onderwerpen voor samenwerking met andere tekenreekstypen:
In de volgende codevoorbeelden worden de beheerde, onbeheerde #pragma instructies gebruikt om beheerde en onbeheerde functies in hetzelfde bestand te implementeren, maar deze functies werken op dezelfde manier als deze zijn gedefinieerd in afzonderlijke bestanden. Bestanden met alleen niet-beheerde functies hoeven niet te worden gecompileerd met /clr (Common Language Runtime Compilation).
Voorbeeld: BSTR doorgeven van beheerde naar niet-beheerde functie
In het volgende voorbeeld ziet u hoe een BSTR (een tekenreeksindeling die wordt gebruikt in COM-programmering) kan worden doorgegeven van een beheerde functie naar een onbeheerde functie. De aanroepende beheerde functie gebruikt StringToBSTR om het adres van een BSTR-weergave van de .NET System.String-inhoud te verkrijgen. Deze aanwijzer wordt vastgemaakt met behulp van pin_ptr (C++/CLI) om ervoor te zorgen dat het fysieke adres niet wordt gewijzigd tijdens een garbage-collection cyclus terwijl de niet-beheerde functie wordt uitgevoerd. De garbagecollector kan het geheugen niet verplaatsen totdat de pin_ptr (C++/CLI) buiten scope raakt.
// 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);
}
Voorbeeld: BSTR doorgeven van niet-beheerde naar beheerde functie
In het volgende voorbeeld ziet u hoe een BSTR kan worden doorgegeven van een niet-beheerde naar een beheerde functie. De ontvangende beheerde functie kan de tekenreeks gebruiken als een BSTR of gebruiken PtrToStringBSTR om deze te converteren naar een String voor gebruik met andere beheerde functies. Omdat het geheugen dat de BSTR vertegenwoordigt wordt toegewezen op de onbeheerde heap, is er geen pinning nodig, omdat er geen garbage-collection is op de onbeheerde heap.
// 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();
}