呼叫Dll裡的Mdi子視窗 |
答題得分者是:James
|
cubi
初階會員 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
請教前輩
小弟現在研究一範例,有些不解之處,煩請前輩們指教
範例內容是呼叫在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 發送簡訊給我 |
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 發送簡訊給我 |
因為一般建立 DLL 裡面的 FORM 物件 ,其 Application 和 EXE 檔的會有可能
是不同一個 ,因此一般我們會用兩種方式 , 你的 Sample 程式是一種 ,另一種
就是配合 Run-Time Package ,好久以前我們有一些人討論過這個問題 , 您可
以參考當時有人整理的討論文章 ,記載點空間上面... http://www25.brinkster.com/hltsai/Articles/PluginDLL/PluginDLL.htm
|
cubi
初階會員 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
感謝前輩們的回答 若把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 發送簡訊給我 |
|
cubi
初階會員 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
|
James
高階會員 發表:10 回覆:290 積分:220 註冊:2002-07-25 發送簡訊給我 |
|
cubi
初階會員 發表:56 回覆:94 積分:35 註冊:2002-04-15 發送簡訊給我 |
|
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
引言: 非常感謝前輩的指導,用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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |