Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här avsnittet visar en aspekt av Visual C++-samverkan. Mer information finns i Använda C++ Interop (Implicit PInvoke).
I följande kodexempel används de hanterade, ohanterade #pragma-direktiven för att implementera hanterade och ohanterade funktioner i samma fil, men dessa funktioner samverkar på samma sätt om de definieras i separata filer. Filer som endast innehåller ohanterade funktioner behöver inte kompileras med /clr (Common Language Runtime Compil).
Det här avsnittet visar hur Unicode-strängar kan skickas från en hanterad till en ohanterad funktion och vice versa. Information om hur du samverkar med andra strängtyper finns i följande avsnitt:
Exempel: Skicka Unicode-sträng från hanterad till ohanterad funktion
Om du vill skicka en Unicode-sträng från en hanterad till en ohanterad funktion kan funktionen PtrToStringChars (deklarerad i Vcclr.h) användas för att komma åt i minnet där den hanterade strängen lagras. Eftersom den här adressen skickas till en intern funktion är det viktigt att minnet fästs med pin_ptr (C++/CLI) för att förhindra att strängdata flyttas om en skräpinsamlingscykel sker medan den ohanterade funktionen körs.
// MarshalUnicode1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
#include <vcclr.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma unmanaged
void NativeTakesAString(const wchar_t* p) {
printf_s("(native) received '%S'\n", p);
}
#pragma managed
int main() {
String^ s = gcnew String("test string");
pin_ptr<const wchar_t> str = PtrToStringChars(s);
Console::WriteLine("(managed) passing string to native func...");
NativeTakesAString( str );
}
Exempel: Datamarsering krävs för åtkomst till Unicode-sträng
I följande exempel visas den datamarsering som krävs för att komma åt en Unicode-sträng i en hanterad funktion som anropas av en ohanterad funktion. Den hanterade funktionen tar emot den infödda Unicode-strängen och konverterar den till en hanterad sträng med hjälp av PtrToStringUni-metoden.
// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
void ManagedStringFunc(wchar_t* s) {
String^ ms = Marshal::PtrToStringUni((IntPtr)s);
Console::WriteLine("(managed) received '{0}'", ms);
}
#pragma unmanaged
void NativeProvidesAString() {
cout << "(unmanaged) calling managed func...\n";
ManagedStringFunc(L"test string");
}
#pragma managed
int main() {
NativeProvidesAString();
}