This topic demonstrates how ANSI strings can be passed using C++ Interop, but the .NET Framework
The following code examples use the
Example
The example demonstrates passing an ANSI string from a managed to an unmanaged function using
В | ![]() |
---|---|
// 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 ); } |
The following example demonstrates the data marshaling required to access an ANSI string in a managed function that is called by an unmanaged function. The managed function, on receiving the native string, can either use it directly or convert it to a managed string using the
В | ![]() |
---|---|
// 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(); } |