gpt4 book ai didi

pinvoke - P/Invoke with [Out] StringBuilder/LPTSTR 和多字节字符 : Garbled text?

转载 作者:行者123 更新时间:2023-12-05 00:43:57 25 4
gpt4 key购买 nike

我正在尝试使用 P/Invoke 从非托管 DLL 中获取字符串(除其他外),但无论我尝试什么,该字符串都是乱码。

我不是原生的 Windows 编码器,所以我不确定字符编码位。 DLL 设置为使用“多字节字符集”,我无法更改(因为这会破坏其他项目)。我正在尝试添加一个包装函数来从一些现有类中提取一些数据。有问题的字符串当前作为 CString 存在,我正在尝试将其复制到 LPTSTR,希望将其放入托管的 StringBuilder。

这是我所做的,我认为最接近正确的(显然我已经删除了不相关的部分):

// unmanaged function
DLLEXPORT void Test(LPTSTR result)
{
// eval->result is a CString
_tcscpy(result, (LPCTSTR)eval->result);
}
// in managed code
[DllImport("Test.dll", CharSet = CharSet.Auto)]
static extern void Test([Out] StringBuilder result);
// using it in managed code
StringBuilder result = new StringBuilder();
Test(result);
// contents in result garbled at this point
// just for comparison, this unmanaged consumer of the same function works
LPTSTR result = new TCHAR[100];
Test(result);

真的很感激任何提示!谢谢!!!

最佳答案

一个问题是使用 CharSet.Auto .

在基于 NT 的系统上,这将假定 native DLL 中的结果参数将使用 Unicode。将其更改为 CharSet.Ansi看看你是否得到更好的结果。

您还需要调整传入的 StringBuilder 的缓冲区大小:

StringBuilder result = new StringBuilder(100); // problem if more than 100 characters are returned

此外 - native C 代码正在使用' TCHAR ' 类型和宏 - 这意味着它可以为 Unicode 构建。如果这可能发生,它会使 CharSet 复杂化。 DllImportAtribute的情况有点 - 特别是如果你不使用 TestA()/ TestW() native 导出的命名约定。

关于pinvoke - P/Invoke with [Out] StringBuilder/LPTSTR 和多字节字符 : Garbled text?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com