访问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
类型。调用约定的可能值为: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
。
是的,我正在阅读详细信息msdn.microsoft.com/en-us/library/984x0h58%28v=vs.71%29.aspx以上是关于访问dll方法时访问冲突读取位置的主要内容,如果未能解决你的问题,请参考以下文章
DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250
错误“访问冲突读取位置 0x00000008”与 SetWindowSubclass 内的 msftedit.dll RichEdit 控件
0x5746723c (msvcr100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0xccccccc8 时发生访问冲突