0

次のコードを使用して dll ファイルのメソッドにアクセスしていますがAccess violation reading location 0x41100000、dll メソッドからメソッドを呼び出すとエラーが発生します。

アクセスしようとしているメソッドは、次のプロトタイプです

 int dstoch(float,float,float,float,float,float,float,float,float);

これは私のコードです

typedef int (*LPMyfunct)(float,float,float,float,float,float,float,float,float);
HINSTANCE hDLL = NULL;
LPMyfunct lpdstoch = NULL;

hDLL = LoadLibrary("c:\\myfile.dll");

if(hDLL!=NULL)
{
    std::cout << "Library loaded \n";
    lpdstoch = (LPMyfunct)GetProcAddress((HMODULE)hDLL, "dstoch");

    int res = 0;
    if(lpdstoch != NULL)
    {
        try
        {
            res = lpdstoch(1.1,2.2,3.3,4.4,5.4,6.4,7.4,8.8,9.9); //Gives the error
        }
        catch (std::exception &e)
        {
            std::cout << e.what();
        }   
    }
}

理由は何ですか?dllファイルにエラーがある可能性はありますか? dll ファイルのパラメータを読み取る方法はありますか? それを分析して、パラメーターの型が正しいかどうかを確認しますか? 依存性チェッカーはメソッドが存在することを示していますが、引数の型を確認できませんか?

アップデート:

私はまだエラーが発生しています

test.exe の 0x0040356c での初回例外: 0xC0000005: アクセス違反書き込み場所 0x42080000。Cexperiment.exe の 0x0040356c で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 0x42080000。

また、この問題は呼び出し規約に関連していない可能性があると考えています.VS2010から、呼び出し規約が原因である可能性があるというエラーメッセージが表示されないためです.他のものを使用しようとしたときにそのメッセージが表示されました. dll. したがって、呼び出し規則またはパラメーターが問題でない場合 (パラメーターが異なる場合、同じ呼び出し規則メッセージが表示されます)、それは別のものである可能性があります。私が試すことができることについて何か提案はありますか?

4

1 に答える 1

2

dll 関数の呼び出し規約を確認し、それに応じて型を宣言する必要がありますLPMyfunct。呼び出し規則の可能な値は次のとおりstdcallです。cdeclpascal

于 2013-05-10T01:51:03.247 に答える