【问题标题】:C# program passes an uint[] which contains a string pointer to a C++ dllC# 程序传递一个包含指向 C++ dll 的字符串指针的 uint[]
【发布时间】:2012-05-31 00:41:27
【问题描述】:

我知道有很多关于将指针从 C# 程序传递到第三方 C++ dll 的讨论。但我的情况很特殊。

我有一个第三方 C++ DLL,我在其中调用了一个函数:

[DllImport(@"ThirdParty.DLL", EntryPoint = "?ThirdPartyEntryPoint", CallingConvention = CallingConvention.Cdecl)]
public static extern Int16 ThirdParty_command(uint p1, ushort p2, uint[] data);

现在棘手的是,“uint[] data”中的元素之一是一个字符串指针,它指向 C++ 中的一个字符串(类型:unsigned char)。我试过了,但它不起作用:

String name = "myName";
fixed (char* nameAddress = name)
{
    uint[] data = { 0x00, 0x01, 0x02,(uint) nameAddress };
    Int16 result = ThirdParty_command(0, 0, data);
}

【问题讨论】:

  • “不起作用”是什么意思?不会编译?例外?请通过发布您收到的任何错误消息来具体说明。
  • 您将Int16(内部名称)与uint(简写名称)混合在一起。为什么? public static extern short ...
  • 这肯定是一个结构而不是一个 uint[]?
  • 它会编译。 ThirdParty.DLL 给出错误“参数过多”
  • 抱歉,在我的第一个问题中,C++ 指针是“char*”,而不是“unsigned char”

标签: c# string pointers


【解决方案1】:

可能是因为unsigned char* 通常是byte[],而不是uint[]。检查 C 端预期的字符串类型,您可能需要将 UTF-16(C# 字符串)转换为其他编码,如 UTF-8。

【讨论】:

  • 是的,你是对的。正如我上面提到的,C++ 指针是一个“char*”
  • 我创建了一个小型 C# 和一个 C++ 项目来测试传递一个包含指向字符串的指针的 uint 数组。我使用“IntPtr ptr = Marshal.StringToCoTaskMemAnsi(myString)”来获取指针并将其存储在数组中。 C++ 端可以毫无问题地检索字符串。所以可能是第三方dll问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多