我编写了一个带有以下函数导出的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。
答案 0 :(得分:9)
唯一有意义的是你的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 ++代码接受宽字符串。