带有char *参数的DLLImport。只传递一个角色

时间:2011-09-02 13:02:54

标签: 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。

1 个答案:

答案 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 ++代码接受宽字符串。