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