關于釋放掉加載dll句柄的問題 |
缺席
|
flowermarsh
一般會員 發表:8 回覆:9 積分:8 註冊:2007-05-25 發送簡訊給我 |
我在一個過程中動態的加載了一個DLL文件(m_hLib:=LoadLibrary),而不又不希望在這個過程中釋放掉它(FreeLibrary(m_hLib)),我使用了一個模塊變量(m_hLib)用來保存加載模塊的句柄。可是當我使用FreeLibrary想在其他過程中釋放這個句柄的時候,确報告釋放失敗,應該是內存錯誤。
var m_hLib: THandle procedure LoadDllFile; begin m_hLib:=LoadLibrary(sFilename); end; procedure FreeDllFile; begin FreeLibrary(m_hLib); <--------在這個地方報錯,而在LoadDllFile過程中釋放就沒有問題。 end; 我所知是FreeLibrary只是一個計數的功能。 整個問題的原因是什麽,我該怎樣解决呢? |
AJ
一般會員 發表:9 回覆:19 積分:20 註冊:2003-06-27 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
flowermarsh
一般會員 發表:8 回覆:9 積分:8 註冊:2007-05-25 發送簡訊給我 |
stdCall關鍵字是使用了的,應該不是這個問題。我亦做了像樓上所說的非零檢查。
我也百思不得其解,如果在其他過程中freelibrary的時候,一定出錯access violation 應該是內存訪問錯誤。 我不做釋放的動作,程序也運行無誤,但覺得這樣很不穩妥。 ===================引 用 wameng 文 章=================== 通常會有這種情形。 依據我的經驗,是表示再撰寫DLL函數時,未使用標準DLL申明變數規範。 即未使用StdCall。 |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
Kingron
中階會員 發表:1 回覆:51 積分:60 註冊:2005-09-14 發送簡訊給我 |
很明显,你的代码有Bug。
如果是stdcall的问题,那么一般会在调用的时候就出现错误,而不会等待到FreeLibrary的时候!因为Call的时候需要参数压入堆栈的,如果入栈顺序错误,那么func/proc里面根本就无法正确使用参数!当然,如果是简单的Integer,可能不会出现AV错误之类,但程序的逻辑功能肯定不正确。 同样,如果是String的话,有类似的问题。 我怀疑你的模块里面,可能对某些变量释放了两次。 你的LoadLibrary和FreeLibrary本身没有什么大的问题的,即使加了if m_dll <> 0 判断也一样,因为API本身可以处理这个,不会报错。 还是检查程序其他地方比较稳妥。
------
超级猛料:http://kingron.delphibbs.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |