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

标签 pinvoke stringbuilder multibyte lptstr

我正在尝试使用 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/

相关文章:

C# 没有从非托管 C++ dll 中捕获未处理的异常

php - 如何在Centos中安装mbstring扩展?

java - 如何从 Java 中的 StringBuilder 中删除 <br> 标签?

java - StringBuilder.append() 导致 java.lang.NullPointerException

java - 打印 StringBuffer JOptionPane

php - Javascript 相当于 PHP 的 md5() ,它也适用于多字节字符串?

c++ - 如何在 MFC 多字节应用程序中显示西里尔文字?

c# - 如何在 C# 中创建这个结构?

c# - 为什么 FileShare.ReadWrite 在这种情况下不起作用?

c# - 检测事件 RDP session