兩組dll要共用一個pas, 該如何設計? |
答題得分者是:jow
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 我目前遇到一個問題, 程式大致如下
unit U_Print; interface uses Windows, SysUtils, StdCtrls, Forms, Controls, UT_SYS, U_VarDef, ini; const // MYLib = 'drv2000.dll'; MYlib = 'drvweb.dll'; ... // EZ的函式 procedure openport(port:PChar); stdcall; external Mylib ; procedure setup(a, b, c, d, e, f:Integer); stdcall; external Mylib; procedure beginjob(a, b, c, d, e, f:Integer); stdcall; external Mylib; 其中, openport 分屬 drv2000.dll 及 drvweb.ell setup 只有 drv2000.dll 有 beginjob 只有 drvweb.dll 有 程式有一個參數可以設定本程式是要引用 drv2000.dll 或者 drvweb.dll 我希望是如果當初參數設定(參數是存在ini檔中)指定使用 drv2000.dll 則 const 可以指定為 MYlib = 'drv2000.dll', 反之則是指定 MYlib = 'drvweb.dll', 但我又不希望程式可以同時涵括 drv2000 及 drvweb 兩支 dll檔, 因為這兩支 dll檔要分別安裝不同的package到user端, 會造成干擾 所以請教各位, 如何才能在同一支 pas 中可以做到這樣的設計? 謝謝! ps. dll 檔不是我開發的, 是廠商提供的介面發表人 - P.D. 於 2005/12/04 11:28:57 |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
var openport: procedure(port:PChar); stdcall; setup: procedure(a, b, c, d, e, f:Integer); stdcall; beginjob: procedure(a, b, c, d, e, f:Integer); stdcall; implementation var hDLL: THandle = 0; procedure TForm1.FREE_DLL; begin @openport := nil; @setup := nil; @beginjob := nil; if hDLL <> 0 then begin FreeLibrary(hDLL); hDLL := 0; end; end; procedure TForm1.LOAD_DLL; begin FREE_DLL; if IsLoadDrv2000 then hDLL := LoadLibrary('drv2000.dll') else hDLL := LoadLibrary('drvweb.dll'); if hDLL <> 0 then begin @openport := GetProcAddress(hDLL, 'openport'); @setup := GetProcAddress(hDLL, 'setup'); @beginjob := GetProcAddress(hDLL, 'beginjob'); end; end; |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言:感謝jow兄提供的做法, 我按上法修正後果然可以正確的選擇適用的DLL來執行var openport: procedure(port:PChar); stdcall; setup: procedure(a, b, c, d, e, f:Integer); stdcall; beginjob: procedure(a, b, c, d, e, f:Integer); stdcall; implementation var hDLL: THandle = 0; procedure TForm1.FREE_DLL; begin @openport := nil; @setup := nil; @beginjob := nil; if hDLL <> 0 then begin FreeLibrary(hDLL); hDLL := 0; end; end; procedure TForm1.LOAD_DLL; begin FREE_DLL; if IsLoadDrv2000 then hDLL := LoadLibrary('drv2000.dll') else hDLL := LoadLibrary('drvweb.dll'); if hDLL <> 0 then begin @openport := GetProcAddress(hDLL, 'openport'); @setup := GetProcAddress(hDLL, 'setup'); @beginjob := GetProcAddress(hDLL, 'beginjob'); end; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |