带有char *参数的DLLImport.只传递一个字符

本文关键字:字符 一个 char 参数 DLLImport 带有 | 更新日期: 2023-09-27 18:07:15

我写了一个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。

带有char *参数的DLLImport.只传递一个字符

唯一有意义的是你的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++代码接受宽字符串。