[問題] 呼叫DLL內的函數 出現in error handlin …

看板C_and_CPP作者 (VF-17)時間15年前 (2010/05/04 05:58), 編輯推噓5(5031)
留言36則, 6人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 我有一個廠商提供的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

05/04 14:06, , 1F
關於載入dll失敗這點, 在載入失敗後用GetLassError()去
05/04 14:06, 1F

05/04 14:06, , 2F
有需要runtime才能自己載入dll的需求嗎?
05/04 14:06, 2F

05/04 14:07, , 3F
取得error code, 然後在去MSDN去查code代表的理由:)
05/04 14:07, 3F

05/04 14:07, , 4F
因為不是直接用dynamic link比較容易嗎@@?
05/04 14:07, 4F

05/04 14:08, , 5F
delayed load也是有點好處的, 至少可以等需要才load吧@@
05/04 14:08, 5F

05/04 14:11, , 6F
我不太懂2F的解說......
05/04 14:11, 6F

05/04 14:12, , 7F
至於VictorTom說得需要......我這個程式一直都很需要那dll
05/04 14:12, 7F

05/04 14:41, , 8F
"很需要"那dll...第一次聽到這個說法...有點想笑怎麼辦?
05/04 14:41, 8F

05/04 14:53, , 9F
我同意delayed load有好處,只是想說如果不熟悉的話,
05/04 14:53, 9F

05/04 14:54, , 10F
不妨就直接連結就好了,因為SDK聽起來就像是程式一執行
05/04 14:54, 10F

05/04 14:54, , 11F
就會用到的東西
05/04 14:54, 11F

05/04 14:57, , 12F
只是我不知道在devc++怎麼設定,我都直接用gcc = =a
05/04 14:57, 12F
※ 編輯: Dforce 來自: 122.116.241.189 (05/04 15:10)

05/04 16:27, , 13F
DevC++直接link .lib/.a, 要有開專案, 然後專案選項裡,
05/04 16:27, 13F

05/04 16:28, , 14F
參數->連結器 那邊就可以自己加了; 另外照原po這樣說,
05/04 16:28, 14F

05/04 16:28, , 15F
感覺的確掛lib直接link讓AP自動load .dll比較省事@_@"
05/04 16:28, 15F

05/04 16:47, , 16F
可是廠商沒給 就只有dll
05/04 16:47, 16F

05/04 16:50, , 17F
好吧, 這個case也只有直接用LoadLibrary了....~_~
05/04 16:50, 17F

05/04 16:51, , 18F
build好的話.lib只有一堆symbol, 不知道為什麼不provide
05/04 16:51, 18F

05/04 16:51, , 19F
.lib一起呢...Orz
05/04 16:51, 19F

05/04 16:53, , 20F
因為他是陰險大公司......我已經幹醮很久了
05/04 16:53, 20F

05/04 16:54, , 21F
load進來 卻沒辦法用 實在是很頭痛
05/04 16:54, 21F

05/04 17:03, , 22F
很多3rd party的東西都是用DLL方式做,所以很多廠商就丟
05/04 17:03, 22F

05/04 17:03, , 23F
一個DLL給你,加上一個.h的方式,要你delayed load(使用
05/04 17:03, 23F

05/04 17:04, , 24F
LoadLibrary)來用他們的東西,雖然很不方便,但也沒辦法,
05/04 17:04, 24F

05/04 17:05, , 25F
因為公司是人家開的,程式是人家寫的!另外delayed load方
05/04 17:05, 25F

05/04 17:06, , 26F
式需要自己去處理找不到DLL載入時的問題,不像直接link
05/04 17:06, 26F

05/04 17:06, , 27F
.lib或.a檔案時,如果找不到DLL會有popup訊息並結束程式.
05/04 17:06, 27F

05/04 17:08, , 28F
其實說真的,我看不出delayed load的好處在哪 ?+_+?
05/04 17:08, 28F

05/04 17:16, , 29F
其實, load不到.dll時可以有其他的處理而不是直接被迫中
05/04 17:16, 29F

05/04 17:16, , 30F
斷掉就是一個好處啊; 另外, 自己LoadLibrary可以依需要
05/04 17:16, 30F

05/04 17:16, , 31F
Load不同的.dll進來, 或者不同version的.dll進來, 只是
05/04 17:16, 31F

05/04 17:17, , 32F
handle就變成PG的責任了就是:)
05/04 17:17, 32F

05/04 17:34, , 33F
雖然上面討論得很熱烈.....但是我很想知道這對我有幫助嗎?
05/04 17:34, 33F

05/04 18:30, , 34F
傳遞給函數的參數都沒填東西進去...
05/04 18:30, 34F

05/04 19:11, , 35F
參數pDID沒初始化
05/04 19:11, 35F

05/05 09:17, , 36F
根據樓上兩樓 我終於抓到問題了......就是那pDID
05/05 09:17, 36F
文章代碼(AID): #1BtxU8tX (C_and_CPP)