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

兩組dll要共用一個pas, 該如何設計?

答題得分者是:jow
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-04 11:27:06 IP:61.71.xxx.xxx 未訂閱
請問各位!    我目前遇到一個問題, 程式大致如下    
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-05 11:04:55 IP:220.130.xxx.xxx 未訂閱
 
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-05 23:04:04 IP:61.71.xxx.xxx 未訂閱
引言:
 
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;    
感謝jow兄提供的做法, 我按上法修正後果然可以正確的選擇適用的DLL來執行
系統時間:2024-04-20 22:54:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!