【问题标题】:DLLImport with char * arguments. Only one character being passed带有 char * 参数的 DLLImport。仅传递一个字符
【发布时间】:2011-11-09 04:11:30
【问题描述】:

我编写了一个 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# c++ string char dllimport


    【解决方案1】:

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

    【讨论】:

    • 啊!我忘了在 WinCE 上提及我。我所做的只是将我的 C++ 函数更改为接受 wchar_t,然后将其转换为 ANSI std::string,现在一切正常 - 谢谢!
    • 同意。或 [MarshalAs]。未复制/粘贴具有“mydll.dll”的 sn-p。啧啧啧,心理调试+1。
    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多