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

開發DLL中,可以使用 explicit load 的方式使用其他的dll function嗎

答題得分者是:aftcast
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-28 16:03:36 IP:219.87.xxx.xxx 訂閱
 最近在開發一個Component...但是裡面有用到一些即有的dll/lib function…

因為一些原因,想試看看在開發中的Component中使用 explicit load的方式使用這些function...

因為explicit load是在run time時才會載入,這樣對Component來說,不知道會不會有什麼影響…

thk...
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-28 16:43:03 IP:210.64.xxx.xxx 訂閱
不會
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-02-09 14:01:24 IP:219.87.xxx.xxx 訂閱
 感謝af大的回答…

那在請問一下一般的程式 使用 loadlibrary都是在 程式的一開始…

不知道開發component時,要在哪個時機點使用 loadlibrary的動作…

建構子裡面可以嗎!?
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-02-09 14:10:18 IP:210.64.xxx.xxx 訂閱
既然你想用explicit load的方式,就應該不要在程式一開始的時候就load,無論是component或是一般的程式。

否則explicit的優勢就沒了,不是嗎?

結論: 必要用之前一刻再load即可。換句話說,某些時候可能完全都沒load到,程式就結束了,因為沒有使用到dll裡的一些功能時。
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-02-09 17:46:40 IP:220.128.xxx.xxx 訂閱
謝謝af大……我大概了解了…
因為那些function幾乎都會用到…所以才想說在建構子 使用GetProcAddress一次即可…

不過剛剛在試做時發現一個問題…

在使用GetProcAddress 得到 A Function 的 Pointer後,

第一次呼叫 A Funcion所得到的結果是錯的…但是第二次呼叫後就都正常了…

這個是原本dll的問題嗎!?

感謝...

aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-02-09 17:51:49 IP:210.64.xxx.xxx 訂閱
你說的這個問題太神奇了…

第一次與第二次都是一樣的條件下? 或是連著很快速的第一次、第二次?

或是該function裡的參數與記憶體的配置有關? 即要先配好之類的?

===================引 用 ychch0819 文 章===================


第一次呼叫 A Funcion所得到的結果是錯的…但是第二次呼叫後就都正常了…


------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-02-09 18:03:19 IP:219.87.xxx.xxx 訂閱
 嗯…都是一樣的條件…

因為這個component是類似對話框的元件…

所以function主要是在"execute" 的 method中呼叫…

第一次對話框出來的結果是錯的…

第二次 執行execute method後,就都正常了…

真的很怪…我把GetProcAddress放在呼叫 函式之前 才使用也是一樣…

我目前只想到是否是提供的dll本身的問題…
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-02-09 18:20:11 IP:210.64.xxx.xxx 訂閱
1/ 該函式的參數是什麼?
2/ 在你可以呼叫該函式前,是否要先呼叫另一個函式?

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-02-09 22:10:00 IP:114.37.xxx.xxx 訂閱
因為還在測試…所以我選最簡單,單純的函式來測驗…

所以
1. 函式是不需要參數的…只是單純的傳回一個值…
2. 不需要另外呼叫另一個函式…


ps:我的測式方式是繼續使用原本靜態的方式呼叫此函式…所以並未把lib從專案移除…
先呼叫一次動態連結得到的函式 指-->印出結果…
再呼叫一次靜態的函式-->印出結果…
來比較

不知道這樣會不會有問題!?
===================引 用 aftcast 文 章===================
1/ 該函式的參數是什麼?
2/ 在你可以呼叫該函式前,是否要先呼叫另一個函式?

aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-02-10 03:14:28 IP:220.135.xxx.xxx 訂閱
理論上會有問題。我覺得這樣的測式沒有必要性。

若要使用lib來處理就單純用lib,若要動態來load就該動態load。除非二個是不同的東西。若lib與dll是同一個,我覺得取得的指標位址會出亂子!

建議選其一來測!
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-02-10 17:04:32 IP:220.128.xxx.xxx 訂閱
af大…
今天把lib從元件專案移除,單純的只用Function Pointer來呼叫函式…
開另一個專案使用此元件來測試…結果反而是沒有一次的值是正確的…

之後開另一個專案…也是用動態load 此 dll Function,沒有透過元件,直接呼叫…結果卻是正確的…
所以有點在懷疑是不是component就無法使用explicit load...@@


===================引 用 aftcast 文 章===================
理論上會有問題。我覺得這樣的測式沒有必要性。

若要使用lib來處理就單純用lib,若要動態來load就該動態load。除非二個是不同的東西。若lib與dll是同一個,我覺得取得的指標位址會出亂子!

建議選其一來測!
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-02-10 17:12:33 IP:210.64.xxx.xxx 訂閱
謝謝你的實作分享,再請教一下,是否可以把load lib 的動作不要放在 建構式之類的時候,而改在使用的前幾行才load,然後再試一下?

===================引 用 ychch0819 文 章===================

之後開另一個專案…也是用動態load 此 dll Function,沒有透過元件,直接呼叫…結果卻是正確的…
所以有點在懷疑是不是component就無法使用explicit load...@@

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-02-10 17:46:23 IP:210.64.xxx.xxx 訂閱
此外,試著用 SafeLoadLibrary這個函式來loadlibaray,不用windows裡的loadlibrary這個api。

delphi的例子

HInst := SafeLoadLibrary (DllName);
  if HInst > 0 then
  try
    FPointer := GetProcAddress (.......)

------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#14 引用回覆 回覆 發表時間:2011-02-11 14:18:42 IP:219.87.xxx.xxx 訂閱
感謝af大的指導…

剛剛在測試後,已發現應該是lib/dll的問題造成的…
所以證明af大是正確的…
在元件中也可以使用動態連結dll...


===================引 用 aftcast 文 章===================
此外,試著用 SafeLoadLibrary這個函式來loadlibaray,不用windows裡的loadlibrary這個api。

delphi的例子

HInst := SafeLoadLibrary (DllName);
  if HInst > 0 then
  try
    FPointer := GetProcAddress (.......)

系統時間:2017-12-12 16:28:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!