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

Posted

技术标签:

【中文标题】访问dll方法时访问冲突读取位置【英文标题】:Access violation reading location when accessing a dll method 【发布时间】:2013-05-10 01:45:52 【问题描述】:

我正在使用以下代码访问 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。因此,如果调用约定或参数不是问题(如果参数不同,您会得到相同的调用约定消息),那么它可能是其他问题。关于我可以尝试什么的任何建议?

【问题讨论】:

在你的另一个问题中,你说它需要 9 个浮点数。在这里,您传递了 9 个非浮点数。 是的。我认为覆盖将是隐含的。我试过传递花车,我得到了同样的答案 别担心,用整数代替浮点数就可以了。 如果签名正确,转换将是隐式的。你没有在这里显示LPMyfunct 是什么,也没有显示 dstoch 的实际原型是什么。调用约定仔细检查也是相关的。 抱歉刚刚更新了帖子 【参考方案1】:

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

【讨论】:

@igor 您是否建议 typedef int (*LPMyfunct)(float,float,float,float,float,float,float,float,float); 可能是 typedef int (_stdcall *LPMyfunct)(float,float,float,float,float,float,float,float,float); 或您提到的类型? @MistyD,是的,这取决于它在 DLL 中的内容。 我目前正在尝试其中的每一个。顺便说一句,__stdcall_stdcall 之间有区别吗? 我不知道“单下划线”标准调用。除非在某处定义为 __stdcall 是的,我正在阅读详细信息msdn.microsoft.com/en-us/library/984x0h58%28v=vs.71%29.aspx

以上是关于访问dll方法时访问冲突读取位置的主要内容,如果未能解决你的问题,请参考以下文章

DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250

错误“访问冲突读取位置 0x00000008”与 SetWindowSubclass 内的 msftedit.dll RichEdit 控件

异常错误:访问冲突读取位置 0xDDDDDDDD

0x5746723c (msvcr100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0xccccccc8 时发生访问冲突

选择PixelFormat 访问冲突读取位置

C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突