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

新手上路,请多包涵

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

原文由 Jame 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 508
2 个回答

我会用 BSTR 因为这意味着您不必为每个字符串调用原生两次,一次获取长度,然后一次获取内容。

使用 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*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;
}

That’s the hardest one out of the way, and now it’s easy to add other wrappers to convert to BSTR from LPWSTR , std::string , std::wstring 等等。

原文由 David Heffernan 发布,翻译遵循 CC BY-SA 3.0 许可协议

是一个讨论字符串编组的主题。

需要用属性标记参数

[MarshalAs(UnmanagedType.LPSTR)]

原文由 Disposer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题