ZZ Windows 控制台編程__編程

來源:互聯網
上載者:User

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

二、             明確幾個概念

控制台管理程式:用於管理控制台的程式,在案頭windows版本是CONTROL.EXE,在windows CE版本是CTLPNL.EXE,它們負責管理控制台裡的控制台條目。簡單的說,我們開啟控制台時,這些管理程式就在運行了。只不過我們看到的是掛上了Shell外觀而已(註:這是我的猜測,還沒有找到依據)。

控制台條目(Control Panel Item):在控制台裡看到的每個表徵圖所對應的就是一個控制台條目。

控制台應用程式(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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.