【问题标题】:Access violation reading location when accessing a dll method访问dll方法时访问冲突读取位置
【发布时间】: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 的实际原型是什么。调用约定仔细检查也是相关的。
  • 抱歉刚刚更新了帖子

标签: c++ dll getprocaddress


【解决方案1】:

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

【讨论】:

  • @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。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2016-05-28
  • 2017-01-09
  • 2014-11-09
  • 1970-01-01
相关资源
最近更新 更多