3

所以在我的 c++.dll 文件中,我得到了以下函数:

    DLL void GetUserPass(char* &userName, char* &passWord)
{
    userName = "ceva";
    passWord = "altceva";
}

现在我想从 c# 调用它,但它给了我一个错误:

[DllImport("myDLL.dll")]
private static extern void GetUserPass(ref string userName, ref string passWord);

static void f()
{
        string userName ="";
        string passWord ="";

        GetUserPass(ref userName, ref passWord);
}

错误是:

调用 PInvoke 函数“下载 FTP 存档!Download_FTP_Archive.Program::GetUserPass”使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

我应该在 C++ dll 文件中尝试类似:

using std::string;
 DLL void GetUserPass(string &userName, string &passWord)
{
    userName = "ceva";
    passWord = "altceva";
}
4

2 回答 2

3

尝试以下操作:

DLL void __stdcall GetUserPass(char* &userName, char* &passWord)
{
    userName = "ceva";
    passWord = "altceva";
}



[DllImport("myDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
private static extern void GetUserPass(ref IntPtr userName, ref IntPtr passWord);
static void f()
{
        IntPtr userNamePtr = new IntPtr();
        IntPtr passWordPtr = new IntPtr();
        GetUserPass(ref userNamePtr, ref passWordPtr);
        string userName = Marshal.PtrToStringAnsi( userNamePtr );
        string passWord = Marshal.PtrToStringAnsi( passWordPtr );
}
于 2012-05-21T08:58:35.573 回答
0

我不是 C++ 开发人员,但我对 C++ 语义有点熟悉。这char* &userName对我来说毫无意义。也许我错了,但试着char* userName看看它是否适合你。

于 2012-05-21T08:39:18.217 回答