將 Delphi 設計的窗體封裝進動態連結庫(DLL),是實現跨專案、跨語言 UI 復用的經典方案。本文系統闡述標準化開發流程,並以「密碼設定/驗證 DLL」為例完整演示從設計到編譯的全過程。
program 改為 library;uses 移除 Forms 單元;begin...end. 之間的啟動代碼;uses 下方、begin 前加入 exports 子句列出匯出函式名。TSetPassWordForm:密碼**設定**窗體,含雙重驗證邏輯。TGetPasswordForm:密碼**驗證**窗體,單純比對回傳布林值。type
TSetPassWordForm = class(TForm)
Label1: TLabel; Edit1: TEdit; OKBtn, CancelBtn: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
Verified: Boolean; // 區分「首次輸入」與「二次確認」
public
PassWord: PChar; // 供匯出函式讀取的密碼緩衝區
end;
procedure TSetPassWordForm.FormCreate(Sender: TObject);
begin
Verified := False;
PassWord := StrAlloc(40); // 預分配 40 字元緩衝區
OKBtn.Enabled := False; // 強制走完驗證流程
Label1.Caption := 'Please Input PassWord:';
end;
function SetPassWord(PWord: PChar): Boolean;
var SetPassWordForm: TSetPassWordForm;
begin
Result := False;
SetPassWordForm := TSetPassWordForm.Create(Application);
try
with SetPassWordForm do
if ShowModal = mrOK then begin
StrCopy(PWord, StrUpper(PassWord)); // 輸出大寫密碼
Result := True;
end;
finally
SetPassWordForm.Free; // 保證記憶體釋放
end;
end;
關鍵細節:
PWord 雖為輸出參數,但屬指標類型,呼叫端必須預先分配記憶體(StrAlloc),否則 StrCopy 會導致一般保護錯誤(GPF)。try...finally 確保窗體實例在任何代碼路徑下皆正確釋放,避免資源洩漏。library PassForm;
uses
GetPass in 'GETPASS.PAS' {PasswordForm},
SetPass in 'SETPASS.PAS' {SetPassWordForm};
exports
GetPassword, SetPassWord;
begin
end.
下一篇將詳細剖析 TGetPasswordForm 的驗證邏輯與 GetPassword 匯出函式的實現細節,以及 VB6 呼叫的完整代碼對照。