首頁(yè) 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡(luò)課程 模擬考試 考友錄 實(shí)用文檔 求職招聘 論文下載
2011中考 | 2011高考 | 2012考研 | 考研培訓(xùn) | 在職研 | 自學(xué)考試 | 成人高考 | 法律碩士 | MBA考試
MPA考試 | 中科院
四六級(jí) | 職稱英語(yǔ) | 商務(wù)英語(yǔ) | 公共英語(yǔ) | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
新概念英語(yǔ) | 成人英語(yǔ)三級(jí) | 申碩英語(yǔ) | 攻碩英語(yǔ) | 職稱日語(yǔ) | 日語(yǔ)學(xué)習(xí) | 法語(yǔ) | 德語(yǔ) | 韓語(yǔ)
計(jì)算機(jī)等級(jí)考試 | 軟件水平考試 | 職稱計(jì)算機(jī) | 微軟認(rèn)證 | 思科認(rèn)證 | Oracle認(rèn)證 | Linux認(rèn)證
華為認(rèn)證 | Java認(rèn)證
公務(wù)員 | 報(bào)關(guān)員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問(wèn) | 導(dǎo)游資格
報(bào)檢員 | 教師資格 | 社會(huì)工作者 | 外銷員 | 國(guó)際商務(wù)師 | 跟單員 | 單證員 | 物流師 | 價(jià)格鑒證師
人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
駕駛員 | 網(wǎng)絡(luò)編輯
衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護(hù)士
會(huì)計(jì)從業(yè)資格考試會(huì)計(jì)證) | 經(jīng)濟(jì)師 | 會(huì)計(jì)職稱 | 注冊(cè)會(huì)計(jì)師 | 審計(jì)師 | 注冊(cè)稅務(wù)師
注冊(cè)資產(chǎn)評(píng)估師 | 高級(jí)會(huì)計(jì)師 | ACCA | 統(tǒng)計(jì)師 | 精算師 | 理財(cái)規(guī)劃師 | 國(guó)際內(nèi)審師
一級(jí)建造師 | 二級(jí)建造師 | 造價(jià)工程師 | 造價(jià)員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
質(zhì)量工程師 | 物業(yè)管理師 | 招標(biāo)師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價(jià)師 | 土地估價(jià)師 | 巖土師
設(shè)備監(jiān)理師 | 房地產(chǎn)經(jīng)紀(jì)人 | 投資項(xiàng)目管理師 | 土地登記代理人 | 環(huán)境影響評(píng)價(jià)師 | 環(huán)保工程師
城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價(jià)師 | 安全評(píng)價(jià)師 | 電氣工程師 | 注冊(cè)測(cè)繪師 | 注冊(cè)計(jì)量師
繽紛校園 | 實(shí)用文檔 | 英語(yǔ)學(xué)習(xí) | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲

2011計(jì)算機(jī)等級(jí)考試Delphi講義:動(dòng)態(tài)鏈接庫(kù)編程

本章主要介紹Windows的動(dòng)態(tài)鏈接庫(kù)原理、DLLs的編寫和調(diào)用、利用DLLs實(shí)現(xiàn)數(shù)據(jù)傳輸、利用DLLs實(shí)現(xiàn)窗體重用。

  表10.3 全局內(nèi)存塊的分配標(biāo)志

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  標(biāo) 志 意 義

  —————————————————————————————————

  gmem_DDEShare 分配可由應(yīng)用程序共享的內(nèi)存

  gmem_Discardable 分配可拋棄的內(nèi)存(只與gmem_Moveable連用)

  gmem_Fixed 分配固定內(nèi)存

  gmem_Moveable 分配可移動(dòng)的內(nèi)存

  gmem_Nocompact 該全局堆中的內(nèi)存不能被壓縮或拋棄

  gmem_Nodiscard 該全局堆中的內(nèi)存不能被拋棄

  gmem_NOT_Banked 分配不能被分段的內(nèi)存

  gmem_Notify 通知功能。當(dāng)該內(nèi)存被拋棄時(shí)調(diào)用GlobalNotify函數(shù)

  gmem_Zeroinit 將所分配內(nèi)存塊的內(nèi)容初始化為零

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  有兩個(gè)預(yù)定義的常用組合是:

  GHND = gmem_Moveable and gmem_Zeroinit

  GPTK = gmem_Fixed and gmem_Zeroinit

  第二個(gè)參數(shù)用于設(shè)置欲分配的字節(jié)數(shù)。分配的字節(jié)數(shù)必須是32的倍數(shù),因而實(shí)際分配的字節(jié)數(shù)可能比所設(shè)置的要大。

  由于用gmem_DDEShare分配的內(nèi)存在分配內(nèi)存的模塊終止時(shí)自動(dòng)拋棄,因而不必調(diào)用GlobalFree顯式釋放內(nèi)存。

  10.3.2.2 服務(wù)器程序的編寫

  服務(wù)器程序必須包含對(duì)DLL的調(diào)用代碼,如:

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

  通過(guò)調(diào)用該函數(shù),服務(wù)器可以獲得全局內(nèi)存塊的句柄。

  在寫入數(shù)據(jù)前,服務(wù)器必須鎖定全局內(nèi)存,以避免在寫入過(guò)程中Windows移動(dòng)該內(nèi)存塊的位置。

  函數(shù)GlobalLock鎖定全局內(nèi)存并返回指向該內(nèi)存塊的指針:

  pMem := GlobalLock(hMem);

  對(duì)pMem的任何修改都會(huì)反映到全局內(nèi)存塊中。

  對(duì)內(nèi)存塊進(jìn)行操作后,調(diào)用GlobalUnLock進(jìn)行解鎖。內(nèi)存塊操作之后盡早解鎖,有利于Windows充分利用內(nèi)存資源。

  服務(wù)器寫入數(shù)據(jù)的實(shí)現(xiàn)代碼如下。

  var

  hMem: THandle;

  pMem: PChar;

  begin

  hMem := GetGlobalMem; {獲得全局內(nèi)存塊的句柄}

  if hMem <> 0 then

  begin

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

  if pMem <> nil then

  begin

  StrPCopy(pMem,Memo1.text); {向全局內(nèi)存塊寫入數(shù)據(jù)}

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

  end

  else

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

  end;

  10.3.2.3 客戶程序的編寫

  客戶程序幾乎是服務(wù)器程序的翻版。唯一的區(qū)別在于一個(gè)是寫入數(shù)據(jù),一個(gè)是下載數(shù)據(jù)。

  下面是客戶從全局內(nèi)存塊下載數(shù)據(jù)的程序清單。

  var

  hMem: THandle;

  pMem: PChar;

  begin

  hMem := GetGlobalMem; {獲得全局內(nèi)存塊的句柄}

  if hMem <> 0 then

  begin

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

  if pMem <> nil then

  begin

  Memo1.text := StrPas(pMem); {從全局內(nèi)存塊讀取數(shù)據(jù)}

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

  end

  else

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

  end;

  10.4 利用DLLs實(shí)現(xiàn)窗體重用

  實(shí)現(xiàn)窗體重用是Delphi DLLs功能中一個(gè)引人注目的特色。當(dāng)你創(chuàng)建了一個(gè)令自己滿意的通用窗體并希望能在不同應(yīng)用程序中使用,特別是希望能在非Delphi 應(yīng)用程序中使用時(shí),把窗體做進(jìn)一個(gè)動(dòng)態(tài)鏈接庫(kù)中是最適當(dāng)?shù)。這樣即使用其它工具開(kāi)發(fā)的應(yīng)用程序,如C++、Visual Basic等,也都可以去調(diào)用它。

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

  10.4.1 利用DLLs實(shí)現(xiàn)窗體重用的一般步驟

  利用DLLs實(shí)現(xiàn)窗體重用的步驟是:

  1.在集成開(kāi)發(fā)環(huán)境(IDE)中,按自己的需要設(shè)計(jì)一個(gè)窗體;

  2.編寫一個(gè)用于輸出的函數(shù)或過(guò)程。在該函數(shù)或過(guò)程中,設(shè)計(jì)的窗體被實(shí)例化;

  3.重復(fù)步驟1、2,直到完成所有重用窗體的設(shè)計(jì);

  4.打開(kāi)工程文件,進(jìn)行修改,以適應(yīng)生成 .dll文件的需要:

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

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

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

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

  5.編譯生成DLLs文件;

  6.在其它應(yīng)用程序中調(diào)用重用窗體。

  重用窗體的調(diào)用同一般DLLs函數(shù)或過(guò)程的調(diào)用完全一致,不再贅述。讀者可參看下面的例子。

  10.4.2 窗體重用實(shí)例

  下面我們通過(guò)一個(gè)具體的實(shí)例來(lái)說(shuō)明窗體重用的設(shè)計(jì)過(guò)程。我們?cè)谝粋(gè)名為passform.dll 的文件中儲(chǔ)存了一個(gè)口令設(shè)置窗口和一個(gè)口令檢查窗口。而后在一個(gè)Delphi 編寫的程序和一個(gè)VB編寫的程序中進(jìn)行調(diào)用。事實(shí)證明這種方法是完全可行的。

  10.4.2.1 窗體重用DLLs的設(shè)計(jì)

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

  窗體類TSetPassWordForm定義了兩個(gè)數(shù)據(jù)成員Verified和PassWord,用于記錄口令確認(rèn)狀態(tài)和設(shè)置的口令。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;

  窗口生成時(shí),對(duì)數(shù)據(jù)成員和部件狀態(tài)進(jìn)行初始化:

  procedure TSetPassWordForm.FormCreate(Sender: TObject);

  begin

  Verified := False;

  PassWord := StrAlloc(40);

  OKBtn.Enabled := False;

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

  end;

  按鈕OKBtn在程序啟動(dòng)時(shí)Enabled屬性設(shè)置為False,直到口令被正確設(shè)置后Enabled屬性才恢復(fù)為True。這樣就保證了只有口令被正確設(shè)置后,口令設(shè)置窗口才能正常關(guān)閉。否則只能按Cancel按鈕取消。

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

  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;

  相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題
       預(yù)告:名師解析2010年9月計(jì)算機(jī)等級(jí)考試試題答案
       2010年9月計(jì)算機(jī)等級(jí)考試成績(jī)查詢時(shí)間及入口
       2010年9月計(jì)算機(jī)等考成績(jī)查詢短信免費(fèi)提醒開(kāi)通
文章搜索
版權(quán)聲明:如果計(jì)算機(jī)等級(jí)考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本計(jì)算機(jī)等級(jí)考試網(wǎng)內(nèi)容,請(qǐng)注明出處。