2013-05-10 153 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