Sdílet prostřednictvím


Postupy: Zařazování řetězců ANSI pomocí interoperability C++

Toto téma ukazuje, jak mohou být řetězce ANSI předány pomocí interoperability C++, ale String rozhraní .NET Framework představuje řetězce ve formátu Unicode, takže převod na ANSI je krok navíc. Pro informace o spolupráci s jinými typy řetězců si prohlédněte následující témata:

Následující příklady kódu používají managed, unmanaged direktivy #pragma k implementaci spravovaných a nespravovaných funkcí ve stejném souboru, ale tyto funkce spolupracují stejným způsobem, pokud jsou definovány v samostatných souborech. Protože soubory obsahující pouze nespravované funkce nemusí být kompilovány s /clr (Common Language Runtime Compilation), mohou si zachovat jejich charakteristiky výkonu.

Příklad

Příklad ukazuje předávání řetězce ANSI ze spravované do nespravované funkce pomocí StringToHGlobalAnsi. Tato metoda přiděluje paměť na nespravované haldě a vrací adresu po provedení převodu. To znamená, že není nutné žádné přidržení, (protože paměť na haldě uvolňování paměti nebyla předána nespravované funkci) a že IntPtr, vrácený z StringToHGlobalAnsi, musí být explicitně uvolněn nebo nastane únik 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 );
}

Následující příklad znázorňuje zařazování dat, potřebné k přístupu k řetězci ANSI ve spravované funkci, která je volána nespravovanou funkcí. Po obdržení nativního řetězce jej spravovaná funkce může buď přímo použít nebo jej převést na spravovaný řetězec pomocí metody PtrToStringAnsi, jak je uvedeno.

// 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é

Odkaz

Použití interoperability C++ (implicitně PInvoke)