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, cdecl, pascal.

于 2013-05-10T01:51:03.247 回答