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関数'DownloadFTP Archive!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 に答える