看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題: (題意請描述清楚) 我有一個廠商提供的sdk,這裡面包含六個.h跟兩個.dll。 目前我只是嘗試要使用它,用動態連結載入.dll然後呼叫其中 一個函數。結果.dll載入成功,GetProcAddress也有抓到。可 是程式一執行我所需要使用的函數時,就出現了錯誤訊息。 程式跑出來的錯誤結果: in error handling proc EXCEPTION: Unhandled page fault on read access to 0xbe2d67e3 ! EXCEPTION Address 0x10015649 numParms 0x00000002 ExceptionInformationArr [000000000][be2d67e300000000] [Build Date: Mar 17 2010 - 19:14:48] . . . 開發平台:Dev-C++ 有問題的code: (請善用置底文標色功能) /*header file*/ #include "XXXType.h" #if defined(_WIN32) || defined(_WIN64) #ifdef XXX_EXPORTS #define XXX_API __declspec(dllexport) #else #define XXX_API __declspec(dllimport) #endif #else #define XXX_API #endif #ifdef __cplusplus extern "C" { #endif XXX_API_RET XXX_API XXXOpenCommonAPI( XXX_API_DEVICE_ID_P pDeviceId ); #ifdef __cplusplus } #endif #endif /*XXX cpp*/ #include <windows.h> #include "XXXAPI.h" typedef XXX_API XXX_API_RET (*Detect)(XXX_API_DEVICE_ID_P); using namespace std; int main (void) { HINSTANCE hDLL = NULL; hDLL = LoadLibrary("XXXSDK.dll"); Dectet commonAPI = NULL; commonAPI = (Detect)GetproAddress(hDLL,"XXXOpenCommonAPI"); XXX_API_RET state; XXX_API_DEVICE_ID_P pDID; state = commonAPI(pDID); //執行到這裡就死掉了 FreeLibrary(hDLL); return 0; } 補充說明: 另外想請教一下,我這個程式在XP、Vista都可以載入.dll ,可是在windows 7卻沒辦法。我有確定過檔案跟路徑都存在, 而且都一樣。不知道有人能幫忙解說嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.241.189
VictorTom:關於載入dll失敗這點, 在載入失敗後用GetLassError()去 05/04 14:06
freesamael:有需要runtime才能自己載入dll的需求嗎? 05/04 14:06
VictorTom:取得error code, 然後在去MSDN去查code代表的理由:) 05/04 14:07
freesamael:因為不是直接用dynamic link比較容易嗎@@? 05/04 14:07
VictorTom:delayed load也是有點好處的, 至少可以等需要才load吧@@ 05/04 14:08
Dforce:我不太懂2F的解說...... 05/04 14:11
Dforce:至於VictorTom說得需要......我這個程式一直都很需要那dll 05/04 14:12
tomnelson:"很需要"那dll...第一次聽到這個說法...有點想笑怎麼辦? 05/04 14:41
freesamael:我同意delayed load有好處,只是想說如果不熟悉的話, 05/04 14:53
freesamael:不妨就直接連結就好了,因為SDK聽起來就像是程式一執行 05/04 14:54
freesamael:就會用到的東西 05/04 14:54
freesamael:只是我不知道在devc++怎麼設定,我都直接用gcc = =a 05/04 14:57
※ 編輯: Dforce 來自: 122.116.241.189 (05/04 15:10)
VictorTom:DevC++直接link .lib/.a, 要有開專案, 然後專案選項裡, 05/04 16:27
VictorTom:參數->連結器 那邊就可以自己加了; 另外照原po這樣說, 05/04 16:28
VictorTom:感覺的確掛lib直接link讓AP自動load .dll比較省事@_@" 05/04 16:28
Dforce:可是廠商沒給 就只有dll 05/04 16:47
VictorTom:好吧, 這個case也只有直接用LoadLibrary了....~_~ 05/04 16:50
VictorTom:build好的話.lib只有一堆symbol, 不知道為什麼不provide 05/04 16:51
VictorTom:.lib一起呢...Orz 05/04 16:51
Dforce:因為他是陰險大公司......我已經幹醮很久了 05/04 16:53
Dforce:load進來 卻沒辦法用 實在是很頭痛 05/04 16:54
tomnelson:很多3rd party的東西都是用DLL方式做,所以很多廠商就丟 05/04 17:03
tomnelson:一個DLL給你,加上一個.h的方式,要你delayed load(使用 05/04 17:03
tomnelson:LoadLibrary)來用他們的東西,雖然很不方便,但也沒辦法, 05/04 17:04
tomnelson:因為公司是人家開的,程式是人家寫的!另外delayed load方 05/04 17:05
tomnelson:式需要自己去處理找不到DLL載入時的問題,不像直接link 05/04 17:06
tomnelson:.lib或.a檔案時,如果找不到DLL會有popup訊息並結束程式. 05/04 17:06
tomnelson:其實說真的,我看不出delayed load的好處在哪 ?+_+? 05/04 17:08
VictorTom:其實, load不到.dll時可以有其他的處理而不是直接被迫中 05/04 17:16
VictorTom:斷掉就是一個好處啊; 另外, 自己LoadLibrary可以依需要 05/04 17:16
VictorTom:Load不同的.dll進來, 或者不同version的.dll進來, 只是 05/04 17:16
VictorTom:handle就變成PG的責任了就是:) 05/04 17:17
Dforce:雖然上面討論得很熱烈.....但是我很想知道這對我有幫助嗎? 05/04 17:34
pico2k:傳遞給函數的參數都沒填東西進去... 05/04 18:30
netio:參數pDID沒初始化 05/04 19:11
Dforce:根據樓上兩樓 我終於抓到問題了......就是那pDID 05/05 09:17