我会用一个BSTR
因为这意味着您不必为每个字符串调用本机两次,一次获取长度,一次获取内容。
With a BSTR
编组器将负责取消分配BSTR
使用正确的内存管理器,以便您可以安全地将其从 C++ 代码中传递出去。
C++
#include <comutil.h>
BSTR GetSomeText()
{
return ::SysAllocString(L"Greetings from the native world!");
}
C#
[DllImport(@"test.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string GetSomeText();
该方法有一个小缺点BSTR
,即它携带 UTF-16 有效负载,但您的源数据很可能是char*
.
为了克服这个问题,您可以完成以下转换:char*
to BSTR
像这样:
BSTR ANSItoBSTR(const char* input)
{
BSTR result = NULL;
int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW > 0)
{
result = ::SysAllocStringLen(0, lenW);
::MultiByteToWideChar(CP_ACP, 0, input, lenA, result, lenW);
}
return result;
}
这是最难解决的问题,现在很容易添加其他包装器来转换为BSTR
from LPWSTR
, std::string
, std::wstring
etc.