人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

第10章 動態鏈接庫編程(二)

第10章 動態鏈接庫編程(二)

更新時間:2022-07-12 文章作者:未知 信息來源:網絡 閱讀次數:

10.3.2.2 服務器程序的編寫 

  服務器程序必須包含對DLL的調用代碼,如: 

  function GetGlobalMem: THandle; far; external 'c:\dlls\glbmem';

  通過調用該函數,服務器可以獲得全局內存塊的句柄。

  在寫入數據前,服務器必須鎖定全局內存,以避免在寫入過程中Windows移動該內存塊的位置。

  函數GlobalLock鎖定全局內存并返回指向該內存塊的指針: 

  pMem := GlobalLock(hMem);

  對pMem的任何修改都會反映到全局內存塊中。

  對內存塊進行操作后,調用GlobalUnLock進行解鎖。內存塊操作之后盡早解鎖,有利于Windows充分利用內存資源。

  服務器寫入數據的實現代碼如下。 

  var

  hMem: THandle;

  pMem: PChar;

  begin

  hMem := GetGlobalMem; {獲得全局內存塊的句柄}

  if hMem <> 0 then

  begin

  pMem := GlobalLock(hMem); {加鎖全局內存塊}

  if pMem <> nil then

  begin

  StrPCopy(pMem,Memo1.text); {向全局內存塊寫入數據}

  GlobalUnlock(hMem); {解鎖全局內存塊}

  end

  else

  MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0);

  end; 

  10.3.2.3 客戶程序的編寫 

  客戶程序幾乎是服務器程序的翻版。唯一的區別在于一個是寫入數據,一個是下載數據。

  下面是客戶從全局內存塊下載數據的程序清單。 

  var

  hMem: THandle;

  pMem: PChar;

  begin

  hMem := GetGlobalMem; {獲得全局內存塊的句柄}

  if hMem <> 0 then

  begin

  pMem := GlobalLock(hMem); {加鎖全局內存塊}

  if pMem <> nil then

  begin

  Memo1.text := StrPas(pMem); {從全局內存塊讀取數據}

  GlobalUnlock(hMem); {解鎖全局內存塊}

  end

  else

  MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0);

  end;

  10.4 利用DLLs實現窗體重用 

  實現窗體重用是Delphi DLLs功能中一個引人注目的特色。當你創建了一個令自己滿意的通用窗體并希望能在不同應用程序中使用,特別是希望能在非Delphi 應用程序中使用時,把窗體做進一個動態鏈接庫中是最適當的。這樣即使用其它工具開發的應用程序,如C++、Visual Basic等,也都可以去調用它。

  包含窗體的DLLs有100K左右的部件庫(Component Library)開銷。可以通過把幾個窗體編譯成一個DLLs來最小化這筆開銷。DLl中的不同窗體可以共享部件庫。 

  

  10.4.1 利用DLLs實現窗體重用的一般步驟 

  利用DLLs實現窗體重用的步驟是:

  1.在集成開發環境(IDE)中,按自己的需要設計一個窗體;

  2.編寫一個用于輸出的函數或過程。在該函數或過程中,設計的窗體被實例化;

  3.重復步驟1、2,直到完成所有重用窗體的設計;

  4.打開工程文件,進行修改,以適應生成 .dll文件的需要:

  (1).把保留字program設為library;

  (2).從uses子句中去掉Forms單元;

  (3).移去begin,end之間的所有代碼;

  (4).在uses子句下,begin…end塊之前,添加保留字exprots。exports 后是輸出函數名或過程名。

  5.編譯生成DLLs文件;

  6.在其它應用程序中調用重用窗體。

  重用窗體的調用同一般DLLs函數或過程的調用完全一致,不再贅述。讀者可參看下面的例子。 

  10.4.2 窗體重用實例 

  下面我們通過一個具體的實例來說明窗體重用的設計過程。我們在一個名為passform.dll 的文件中儲存了一個口令設置窗口和一個口令檢查窗口。而后在一個Delphi 編寫的程序和一個VB編寫的程序中進行調用。事實證明這種方法是完全可行的。

  10.4.2.1 窗體重用DLLs的設計 

  窗體重用DLLs的設計依照(10.4.1)中介紹的步驟進行。DLLs中的兩個窗體 SetPassWordForm和GetPassWordForm分別用于設置和檢查口令。它們的設計界面如圖所示。

  窗體類TSetPassWordForm定義了兩個數據成員Verified和PassWord,用于記錄口令確認狀態和設置的口令。TSetPassWordForm的定義如下:

  type

  TSetPassWordForm = class(TForm)

  Label1: TLabel;

  Edit1: TEdit;

  OKBtn: TBitBtn;

  CancelBtn: TBitBtn;

  procedure FormCreate(Sender: TObject);

  procedure Edit1KeyPress(Sender: TObject; var Key: Char);

  private

  { Private declarations }

  Verified: Boolean;

  public

  { Public declarations }

  PassWord: PChar;

  end;

  窗口生成時,對數據成員和部件狀態進行初始化: 

  procedure TSetPassWordForm.FormCreate(Sender: TObject);

  begin

  Verified := False;

  PassWord := StrAlloc(40);

  OKBtn.Enabled := False;

  Label1.Caption := 'Please Input PassWord:';

  end;

  按鈕OKBtn在程序啟動時Enabled屬性設置為False,直到口令被正確設置后Enabled屬性才恢復為True。這樣就保證了只有口令被正確設置后,口令設置窗口才能正常關閉。否則只能按Cancel按鈕取消。

  在口令設置代碼單元中定義了一個輸出函數SetPassWord,用于生成口令設置窗口并返回設置的口令: 

  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;

  口令成功設置,把PassWord的值拷貝給PWord輸出,并返回True。應該注意的是由于 PWord本身就是指針類型,指向一個字符串的地址,因而雖然PWord用于輸出,但在參數表中仍為傳值參數,而不是傳址參數。另外調用函數StrCopy,要求PWord在傳入前已分配內存,否則會導致一個一般保護錯。try...finally用于保護窗口所占用內存資源在任何情況下都能正常釋放,讀者可參看第十二章。

[1] [2]  下一頁

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
主站蜘蛛池模板: 双城市| 车致| 台安县| 惠水县| 当雄县| 搜索| 秦安县| 巩义市| 塔河县| 阜新市| 鞍山市| 永川市| 沐川县| 江达县| 额济纳旗| 玛多县| 澄迈县| 凭祥市| 安徽省| 苍南县| 新绛县| 汝阳县| 景德镇市| 哈巴河县| 河间市| 南昌市| 甘肃省| 阿合奇县| 新干县| 塘沽区| 大连市| 大渡口区| 大港区| 曲松县| 卢湾区| 青岛市| 万宁市| 宜章县| 兴隆县| 房山区| 任丘市|