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

呼叫Dll裡的Mdi子視窗

答題得分者是:James
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-23 10:40:55 IP:61.58.xxx.xxx 未訂閱
請教前輩   小弟現在研究一範例,有些不解之處,煩請前輩們指教 範例內容是呼叫在Dll裡的Mdi子視窗
一、主程式為一Exe,FormStyle為fsMDIForm,且放上一MainMenu,
    在MenuItem按下後有如下程式碼    
procedure TfrmMain.New1Click(Sender: TObject);
var
  pProc: TFarProc;
  hInst: THandle;
  ShowForm: TShowForm;
begin
  hInst := SafeLoadLibrary('Dll.dll');
  if hInst = 0 then Exit;
  pProc := GetProcAddress(hInst, 'ShowForm');
  if pProc <> Nil then
  begin
    ShowForm := TShowForm(pProc);
    ShowForm(Application, Self);
  end;
end;    二、Dll.dll檔內容如下    library Dll;    uses
  SysUtils,
  Classes,
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {Form1};    {$R *.res}    procedure ShowForm(MyApplication: TApplication; FormParent: TForm); stdcall;
var
  Form1: TForm1;
  DllProc: Pointer;
begin
  Application := MyApplication;
  Form1 := TForm1.Create(FormParent);
  Form1.Show;
end;    
procedure DLLUnloadProc(Reason: Integer); register;
begin
  if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;    exports ShowForm;    begin      DllApplication:=Application;
  DLLProc := @DLLUnloadProc;    end.
---------------------------------------------------------------------
以下為Mdi子視窗    unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;    type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
  end;    var
   DllApplication: TApplication;    implementation    {$R *.dfm}    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;    end.

請教前輩,紅色部份是作什麼用的呢,謝謝
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-23 22:00:17 IP:203.217.xxx.xxx 未訂閱
procedure DLLUnloadProc(Reason: Integer); register;
begin
  if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;

//  detach時還原application參數    end;    exports ShowForm;    begin
  DllApplication:=Application;     //  DllApplication 為自行宣告之參數用來存DLL原來所屬之application      DLLProc := @DLLUnloadProc;    //DllProc為一指向procedure之指標, 此程序在每次DLL之entry被呼叫時均會執行,詳細可參考SDK之說明
//@DLLUnloadProc為procedure DLLUnloadProc之address, 即dll被呼叫時均會執行此procedure    end.
[說明]DLL 本身並無Enviroment space,必須載入到呼叫者之環境中執行, 所有global變數也均在呼叫者之環境中. 故若DLL中宣告global變數,兩個EXE同時呼叫此DLL時, 此global變數在兩個AP中各有一份 Dll被呼叫時,其 application變數所指本就是呼叫者之AP, 我看不出紅色部分如此做有何實際意義
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-08-24 05:46:38 IP:61.227.xxx.xxx 未訂閱
因為一般建立 DLL 裡面的 FORM 物件 ,其 Application 和 EXE 檔的會有可能 是不同一個 ,因此一般我們會用兩種方式 , 你的 Sample 程式是一種 ,另一種 就是配合 Run-Time Package  ,好久以前我們有一些人討論過這個問題 , 您可 以參考當時有人整理的討論文章 ,記載點空間上面...    http://www25.brinkster.com/hltsai/Articles/PluginDLL/PluginDLL.htm
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-08-24 10:04:31 IP:61.58.xxx.xxx 未訂閱
感謝前輩們的回答
若把DllProc := @DllUnLoadProc這行拿掉,
那程式關閉後,不會把控制權還給Dlphi,因
為程式好像沒有釋放掉
小弟有另外問題請教前輩    1. 小弟想將所有子程式寫成Dll,且為MDI方式,
   那要如何將所以的子程式都共用主程式的
   TDataBase或TADOConnection呢
2. 在http://www.geocities.com/huanlin_tsai/
   裡有一"DLL 應用 - 設計可抽換的模組"
   的文章提到若以DLL方式設計會4k的漏洞,
   也有介紹兩篇解決方法,但經小弟努力 @_@| 的研讀過,
   還是不太懂(書到用時方恨少,只因上課在睡覺),請教前輩們都是如何解決呢    小弟之前都將所有程式都擠在一起,實在是
又肥又大又笨重,小弟現知可以Package或
DLL方式來切割專案,而小弟現在想先現DLL
方向試看看,再玩Package,再評估用何種方式    不好意思,寫的較囉嗦,煩請前輩們指導,謝謝
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-08-26 10:53:18 IP:61.227.xxx.xxx 未訂閱
主程式貼上 TDatabase , 各 DLL 中的物件使用 Alias Name 去對應 , 配合 Run-Time Package 就可以了... 至於 ADO 可能要用傳遞物件或者是用 RTTI 的方式
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-08-26 11:17:45 IP:61.58.xxx.xxx 未訂閱
不好意思,小弟才疏學淺,什麼是RTTI呀 ^_^| ??
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-08-26 18:06:58 IP:61.227.xxx.xxx 未訂閱
ㄟ..... 要不然介紹你一個簡單的方法 , 你再主程式放入一個 TADOConnection , 假設叫做 adcMaster , 那你在 DLL 中就用 Application.MainForm.FindComponent( 'adcMaster' ) as TAdoConnection 就可以找到那個 TADOConnection 的元件了....
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-08-27 12:02:08 IP:61.58.xxx.xxx 未訂閱
引言: 主程式貼上 TDatabase , 各 DLL 中的物件使用 Alias Name 去對應 , 配合 Run-Time Package 就可以了... 至於 ADO 可能要用傳遞物件或者是用 RTTI 的方式
非常感謝前輩的指導,用FindComponent方式,小弟已試成功了,謝謝 致於您說的RTTI方式是否就是用FindComponent方法呢 再次感謝前輩
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-08-27 14:40:11 IP:210.200.xxx.xxx 未訂閱
引言: 非常感謝前輩的指導,用FindComponent方式,小弟已試成功了,謝謝 致於您說的RTTI方式是否就是用FindComponent方法呢 再次感謝前輩
FindComponent 和 RTTI (Run Time Type Information) 是不同的東西. 基本上只有宣告在 published 區段中的 property & Events 才有 RTTI 資料. 您可以參考: Delphi 元件設計初步(一) 有提到一點 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=18222 Borland Delphi x Developer's Guide 有蠻清楚的說明
------
將問題盡快結案也是一種禮貌!
天外來客
初階會員


發表:22
回覆:199
積分:44
註冊:2001-11-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-08-28 19:05:41 IP:61.58.xxx.xxx 未訂閱
非常感謝版主的指導, 不好意思,再請教一個問題 在DLL裡的子視窗如何主動 取得MDI主程式裡的公用變 數呢?? 謝謝
系統時間:2024-04-26 3:54:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!