访问dll方法时访问冲突读取位置

时间:2013-05-10 01:45:52

标签: c++ dll getprocaddress

我使用以下代码访问dll文件中的方法,当从dll方法调用方法时,我得到Access violation reading location 0x41100000

我尝试访问的方法是以下原型

 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。因此,如果调用约定或参数不是问题(如果参数不同,则会获得相同的调用约定消息),那么它可能是其他内容。关于我可以尝试的任何建议?

1 个答案:

答案 0 :(得分:2)

您需要检查dll函数的调用约定并相应地声明LPMyfunct类型。调用约定的可能值包括:stdcallcdeclpascal