ZZ From: http://blog.csdn.net/tomcui/archive/2008/01/22/2058502.aspx
Windows 控制台編程
說明:本文章為本人在做項目時查閱相關文章而寫成,如有不當之處,請指出。
mail: tomcui60000520@163.com
關鍵字:
控制台,控制台應用程式,
一、 什麼是控制台
開啟Windows的控制台會看到類似的映像
圖一
雙擊其中的一個表徵圖,會顯示對話方塊,讓使用者來完成相應的軟硬體設定工作。這就是我們看到的控制台。那麼如何開發控制台程式呢。帶著疑問在MSDN和google裡搜尋索引鍵“Control Panel”,就會找到相關的技術文章。這是我工作的方法:借鑒已有的資源。但實際情況是那樣嗎。我們可以跟著MSDN的講述來一步一步深入下去。
經過挖掘,發現並不是exe檔案(Windows Vista下支援exe的控制台應用程式,並且微軟建議做成exe檔案),而是有著cpl尾碼名的檔案,在windows->system32下可以找到這樣的檔案。如果藉助工具,Dependency Walker for Win32 (x86) 或dumpbin等就可以看到該檔案匯出了一些函數。
圖二
多觀察幾個這樣的檔案,發現匯出的函數雖有差異,但其中都有CPLApplet函數被匯出。這些特徵與DLL的特徵吻合。去MSDN上查閱CPLApplet函數的說明證明我們的猜測是正確的。可以說控制台應該程式就是以CPL為尾碼名並且一定要匯出CPLApplet函數的dll檔案。
對於具體的描述可以參考:
http://msdn2.microsoft.com/en-us/library/bb776838(VS.85).aspx
二、 明確幾個概念
l 控制台管理程式:用於管理控制台的程式,在案頭windows版本是CONTROL.EXE,在windows CE版本是CTLPNL.EXE,它們負責管理控制台裡的控制台條目。簡單的說,我們開啟控制台時,這些管理程式就在運行了。只不過我們看到的是掛上了Shell外觀而已(註:這是我的猜測,還沒有找到依據)。
l 控制台條目(Control Panel Item):在控制台裡看到的每個表徵圖所對應的就是一個控制台條目。
l 控制台應用程式(Control Panel Application):就是最終看到的CPL檔案,一個控制台應用程式可以實現幾個控制台條目。
三、 控制台應用程式的編寫
編寫控制台應用程式,就是編寫dll檔案,在該檔案中實現控制所需要的功能。這就涉及到一個不得不說的函數,沒有它就無法完成控制台程式的實現。該函數為CPLApplet。下面就該函數的參數等知識做些介紹。
函數:LONG CPLApplet(HWND hwndCPl,UINT msg, LPARAM lParam1, LPARAM lParam2)
函數CPLApplet是控制台應用程式(Control Panel application)的進入點,它被控制台管理程式(control.exe 或Ctlpnl.exe)自動調用,它是個回呼函數(Callback),注意:CPL檔案一定要把函數CPLApplet匯出,這樣控制台才能找到程式的進入點。
當啟動控制台時,它會搜尋Windows或System32或註冊表的相應條目目錄下的檔案,並把以CPL作為副檔名的檔案載入,它調用CPL檔案的匯出函數CPLApplet(),發送訊息給該函數。所以,控制台應用程式要處理控制台發送過來的訊息,即在函數CPLApplet中進行處理,該函數沒有預設的行為。如果一個CPL檔案中實現了多個控制台程式,那麼只會有一個CPLApplet函數,它負責所有的控制台應用程式。
參數說明:
hwndCPl:控制台管理程式或稱為控制台的視窗控制代碼,即為control.exe的視窗控制代碼。如果控制台應用程式或其它視窗需要傳遞父視窗控制代碼,可以使用該參數。
Msg:發送到控制台應用程式的訊息,由控制台管理程式發送。
lParam1:訊息參數
lParam2:訊息參數
函數的傳回值依據訊息的不同而不同。
應用程式要使用該函數需要包含標頭檔:cpl.h
訊息名稱 |
描述 |
CPL_INIT |
控制台應用程式收到的第一個訊息,通常在此處理全域初始化和記憶體配置。成功返回非0,否則返回0,此時控制台管理程式終止和該應用程式的通訊,並釋放相應的CPL檔案。 |
CPL_GETCOUNT |
該訊息緊接在CPL_INIT訊息之後被發送,它返回控制台管理程式所能看到該CPL檔案中所包含的控制台組件的數目,即該CPL檔案可以出現在控制台中的表徵圖的數目。 |
CPL_INQUIRE |
於CPL_GETCOUNT之後被發送,為指定的控制台條目提供資訊。 |
CPL_NEWINQUIRE |
於CPL_GETCOUNT之後被發送,與訊息CPL_INQUIRE完成的功能類似,只不過其實現要求TNewCPLInfo結構指標,所包含的資源不提供緩衝,所以控制台啟動的較慢,一般不建議處理該訊息,除非特別必要,如要根據一定的條件動態改變控制台條目的表徵圖、字串等。 |
CPL_DBLCLK |
表明使用者選定了一個控制台條目,程式應該顯示相應的對話方塊以便使用者完成相應的任務。成功返回0,否則,返回非0. |
CPL_STOP |
控制台管理程式關閉時被發送,控制台應用程式在此時處理記憶體釋放等動作。成功處理,返回0. |
CPL_SELECT |
|