2013-05-10 88 views
0

我使用下面的代码来访问dll文件中的方法,从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文件的参数?它检查我是否正在获取参数类型?从属性检查器显示该方法存在,但我无法确定参数类型?

更新:

我仍然得到错误

第一次机会异常在0x0040356c中的test.exe:0000005: 访问冲突写入位置0x42080000。 0x0040356c在Cexperiment.exe中未处理的异常:0xC0000005:写入 位置0x42080000的访问冲突。

我也相信,这个问题可能不会涉及到调用约定。其原因我认为是因为我没有得到从VS2010指出调用约定可能是cause.I得到了消息的错误消息当我尝试使用其他的DLL。因此,如果调用约定或参数不是问题(您获得相同的调用约定消息,则在参数不同的情况下),那么它可能是别的。有什么我可以尝试的建议吗?

+0

在你的另一个问题中,你说它需要9个花车。这里你传递了9个非浮点数。 – huskerchad 2013-05-10 01:49:12

+0

是的。我认为这个涵盖是隐含的。我已经尝试过传递花车,并得到相同的答案 – MistyD 2013-05-10 01:51:33

+0

不要担心,代替花车的整数很好。 – chris 2013-05-10 01:52:06

回答

2

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

+0

'fastcall','thiscall' :) – chris 2013-05-10 01:51:26

+0

@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 2013-05-10 02:00:39

+0

@MistyD,是的,它取决于它在DLL中的内容。 – chris 2013-05-10 02:01:34