全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2766
推到 Plurk!
推到 Facebook!

關于釋放掉加載dll句柄的問題

缺席
flowermarsh
一般會員


發表:8
回覆:9
積分:8
註冊:2007-05-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-20 10:40:17 IP:202.108.xxx.xxx 訂閱
我在一個過程中動態的加載了一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-20 11:46:35 IP:220.135.xxx.xxx 未訂閱
卸載之前先檢查一下Handle避免錯誤:
if (m_hLib<>0) then
FreeLibrary(m_hLib);
編輯記錄
AJ 重新編輯於 2007-06-20 11:47:21, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1183
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-20 17:55:30 IP:61.222.xxx.xxx 訂閱
通常會有這種情形。
依據我的經驗,是表示再撰寫DLL函數時,未使用標準DLL申明變數規範。
即未使用StdCall。
flowermarsh
一般會員


發表:8
回覆:9
積分:8
註冊:2007-05-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-21 10:08:39 IP:202.108.xxx.xxx 訂閱
stdCall關鍵字是使用了的,應該不是這個問題。我亦做了像樓上所說的非零檢查。
我也百思不得其解,如果在其他過程中freelibrary的時候,一定出錯access violation 應該是內存訪問錯誤。
我不做釋放的動作,程序也運行無誤,但覺得這樣很不穩妥。

===================引 用 wameng 文 章===================
通常會有這種情形。
依據我的經驗,是表示再撰寫DLL函數時,未使用標準DLL申明變數規範。
即未使用StdCall。
wameng
版主


發表:31
回覆:1336
積分:1183
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-21 19:31:04 IP:61.222.xxx.xxx 訂閱
不是加了Stdcall 就了事。盡量避免使用String 變數改用Pchar 或者...

如果DLL 中Freelibrary 並無申明 DLLProc 的動作
那麼就表示 內存是有錯亂或誤用指針的問題。

相信我,沒有別的竅門。
請耐心的重新檢查一遍。

Kingron
中階會員


發表:1
回覆:51
積分:60
註冊:2005-09-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-15 03:37:43 IP:125.89.xxx.xxx 訂閱
很明显,你的代码有Bug。

如果是stdcall的问题,那么一般会在调用的时候就出现错误,而不会等待到FreeLibrary的时候!因为Call的时候需要参数压入堆栈的,如果入栈顺序错误,那么func/proc里面根本就无法正确使用参数!当然,如果是简单的Integer,可能不会出现AV错误之类,但程序的逻辑功能肯定不正确。

同样,如果是String的话,有类似的问题。

我怀疑你的模块里面,可能对某些变量释放了两次。
你的LoadLibrary和FreeLibrary本身没有什么大的问题的,即使加了if m_dll <> 0 判断也一样,因为API本身可以处理这个,不会报错。

还是检查程序其他地方比较稳妥。
------
超级猛料:http://kingron.delphibbs.com
系統時間:2017-10-17 15:38:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!