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