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

Chr*_*ris 2 c# c++ string dllimport char

我编写了一个C++ DLL,导出了以下函数

extern "C" BOOL WINAPI SetUserPassword(const char* u, const char* p)
Run Code Online (Sandbox Code Playgroud)

从C#调用它时,我使用以下代码

[DllImport("mydll.dll")]
private static extern int SetUserPassword(String user, String password);
Run Code Online (Sandbox Code Playgroud)

现在,当SetUserPassword我被调用时,我只得到每个参数的第一个字母.我做了一些谷歌搜索,发现String可能不是最好使用,所以尝试使用IntPtr,Marshal.StringToBSTR()但这也没有用.

如何正确构建?如果需要,我可以修改C ​​++ DLL.

Dav*_*nan 9

唯一有意义的是你的C#代码实际上是:

[DllImport("mydll.dll", CharSet = Unicode)]
private static extern int SetUserPassword(String user, String password);
Run Code Online (Sandbox Code Playgroud)

执行此操作时,将基于宽字符的字符串传递给C++代码,并且因为它需要单字节字符,所以它将前两个字节字符的后半部分中的0字节解释为字符串终止符.

你应该写:

[DllImport("mydll.dll", CharSet = Ansi)]
private static extern int SetUserPassword(String user, String password);
Run Code Online (Sandbox Code Playgroud)

或者实际上你可以像在你的问题中那样写它,因为Ansi它是默认的.


事实上,事实证明你在CE上不支持Ansi字符集,因此唯一合理的解决方案是让你的C++代码接受宽字符串.

  • 唉唉!我忘了在WinCE上提到我.我所做的只是将我的C++函数更改为接受`wchar_t`然后将其转换为ANSI`std :: string`,现在它全部正常工作 - 谢谢! (2认同)