如何从本机 (C++) 代码返回文本

2023-12-06

我正在使用 Pinvoke 实现本机 (C++) 代码和托管 (C#) 代码之间的互操作性。我想要实现的是将本机代码中的一些文本获取到我的托管代码中。为此,我尝试了很多事情,例如通过引用传递字符串/字符串生成器、使用 [IN] 和 [OUT]、编组到 LPSTR、从函数返回字符串等。但在我的情况下没有任何效果。任何有关一些小代码的帮助将不胜感激。


我会用一个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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从本机 (C++) 代码返回文本 的相关文章

随机推荐