Postupy: Zařazování řetězců v kódu ANSI pomocí zprostředkovatele komunikace C++
Toto téma ukazuje, jak lze předávat řetězce ANSI pomocí zprostředkovatele komunikace C++, ale rozhraní .NET Framework String představuje řetězce ve formátu Unicode, takže převod na ANSI je dodatečný krok. Pokud chcete spolupracovat s jinými typy řetězců, projděte si následující témata:
Postupy: Zařazování řetězců v kódu Unicode pomocí zprostředkovatele komunikace C++
Postupy: Zařazování řetězců modelu COM pomocí zprostředkovatele komunikace C++
Následující příklady kódu používají spravované, nespravované direktivy #pragma k implementaci spravovaných a nespravovaných funkcí ve stejném souboru, ale tyto funkce vzájemně fungují stejným způsobem, pokud jsou definovány v samostatných souborech. Vzhledem k tomu, že soubory obsahující pouze nespravované funkce nemusí být kompilovány pomocí /clr (Common Language Runtime Compilation), mohou zachovat své charakteristiky výkonu.
Příklad: Předání řetězce ANSI
Příklad ukazuje předání řetězce ANSI ze spravované do nespravované funkce pomocí StringToHGlobalAnsi. Tato metoda přidělí paměť na nespravované haldě a vrátí adresu po provedení převodu. To znamená, že není nutné nic připnout (protože paměť na haldě uvolňování paměti není předána nespravované funkci) a že intPtr vrácený z StringToHGlobalAnsi musí být explicitně uvolněn nebo výsledky nevracení paměti.
// 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říklad: Zařazování dat vyžadované pro přístup k řetězci ANSI
Následující příklad ukazuje zařazování dat vyžadované pro přístup k řetězci ANSI ve spravované funkci, která je volána nespravovanou funkcí. Spravovaná funkce při příjmu nativního řetězce ji může buď použít přímo, nebo ji pomocí metody převést na spravovaný řetězec PtrToStringAnsi , jak je znázorněno.
// 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();
}
Viz také
Použití zprostředkovatele komunikace C++ (implicitní služba PInvoke)