This topic demonstrates how a BSTR (the basic string format favored in COM programming) can be passed from a managed to an unmanaged function, and vice versa. For interoperating with other strings types, see the following topics:
The following code examples use the
Example
The following example demonstrates how a BSTR (a string format used in COM programming) can be passed from a managed to an unmanaged function. The calling managed function uses
В | ![]() |
---|---|
// 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); } |
The following example demonstrates how a BSTR can be passed from an unmanaged to an unmanaged function. The receiving managed function can either use the string in as a BSTR or use
В | ![]() |
---|---|
// 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(); } |