c# - 带有 char * 参数的 DLLImport。只有一个字符被传递

标签 c# c++ string char dllimport

我写了一个 C++ DLL,导出了下面的函数

extern "C" BOOL WINAPI SetUserPassword(const char* u, const char* p)

当从 C# 调用它时,我使用以下代码

[DllImport("mydll.dll")]
private static extern int SetUserPassword(String user, String password);

现在当 SetUserPassword 被调用时,我只得到每个参数的第一个字母。我做了一些谷歌搜索,发现 String 可能不是最好的使用方式,所以尝试使用 IntPtr 和 Marshal.StringToBSTR() 但这也不起作用。

这应该如何正确构建?如果需要,我可以修改 C++ DLL。

最佳答案

唯一有意义的是您的 C# 代码实际上是:

[DllImport("mydll.dll", CharSet = Unicode)]
private static extern int SetUserPassword(String user, String password);

当您这样做时,您将一个基于宽字符的字符串传递给您的 C++ 代码,并且由于它需要单字节字符,因此它将前两个字节字符的后半部分中的 0 字节解释为字符串终止符。

你应该写:

[DllImport("mydll.dll", CharSet = Ansi)]
private static extern int SetUserPassword(String user, String password);

或者事实上你可以完全按照你的问题来写,因为 Ansi 是默认的。


事实上,您使用的 CE 不支持 Ansi 字符集,因此唯一合理的解决方案是让您的 C++ 代码接受宽字符串。

关于c# - 带有 char * 参数的 DLLImport。只有一个字符被传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7283820/

相关文章:

c# - try catch finally block 的点?

c# - 在静态方法中引用 "self"类型 - C#

python - 如何从 python 中的字符串中删除 ANSI 转义序列

python - 检查字符串是否符合某种格式

c# - 将价格传递给 Paypal 时出错

C# "Generator"方法

c++ - 从另一个 C++ 订购数组

c++ - 跟踪 vector 元素地址

c++ - 将参数移动到 std::thread 中?

c - 为 char 字符串的长度分配一个大值会成为问题吗?