摘要:本文介紹了一種有別於通常的windows外殼程式設計方法。採用com技術,通過windows提供的外殼介面實現對其的程式設計。
一、 引言
都是執行於windows
作業系統
之下的。在
程式開發過程中也經常要在自己的應用程式中加入一些windows系統本身就有的功能,比如檔案的拷貝、刪除、查詢以及執行程式等等。
而這些功能在windows作業系統下都是具備的,顯然如果能直接從系統中呼叫這些功能將不僅僅減少程式的大小和開發人員的工作量,而且由於是直接通過作業系統來完成這些功能,將會大大減小這部分程式出現異常錯誤的概率。
二、 windows外殼程式設計
前面所說的直接使用windows作業系統部分功能的程式設計方法就是針對windows作業系統外殼的程式設計,可以通過對作業系統提供的幾個程式設計介面對作業系統的部分功能進行呼叫,甚至可以按照自己的意圖在應用程式中對部分功能進行修改、擴充套件。
下面就以乙個比較簡單的外殼操作--拷貝檔案進行舉例說明:
……shfileopstruct fileop;//外殼的檔案操作結構
fileop.hwnd=m_hwnd; //設定控制代碼
上述**實現起來雖然效果還是不錯的,但然實現起來卻是比較麻煩的,這僅僅是乙個比較簡單的外殼操作,對於一些比較複雜的外殼操作比如系統托盤、任務條等等的程式設計,更是尤為嚴重,而且象此類程式設計,mfc裡並沒有提供封裝好的程式類庫,提供的只有系統的winapi 應用程式介面,因此在程式開發過程中往往會有一種在進行sdk程式設計的感覺。
三、 com技術在windows外殼程式設計中的應用
com (component object model,元件物件模型)是microsoft建立的一種二進位制和網路標準,也是microsoft大力推廣並已取得廣泛認可的一種元件標準。
在com標準中,com物件被很好的封裝起來,客戶無法訪問物件的實現細節,提供給使用者的唯一的訪問途徑是通過com介面來訪問。
對於com介面有兩方面的含義:首先它是一組可供呼叫的函式,由此客戶可以讓該物件做某些事情;
其次,也是更為重要的,介面是元件及其客戶程式之間的協議。
也就是說介面不但定義了可用什麼函式,也定義了當呼叫這些函式時物件要做什麼。windows作業系統本身作為乙個大的com元件物件,也提供了一些必要的com介面給客戶程式,因此我們可以通過這些com介面來直接對windows外殼進行程式設計。
在程式進行正式編寫設計之前有一點是肯定的:程式裡需要用到com介面,要對com物件進行操作。因此首先要加入初始化com和終止com的**。一般是在應用程式類的initinstance()函式的開始處和返回前新增初始化com和終止com**的: ……
coinitialize(null); //初始化com
……couninitialize(); //終止com**
……以上兩個函式在mfc程式和非mfc程式中都可以很好的使用。
另外,如果程式框架是以mfc為基礎的,那麼只需簡單的呼叫afxoleinit()函式就可以達到同樣的目的。而且不必顯式呼叫終止com的**。
在com標準中,訪問com物件的唯一途徑是com介面,因此在編寫操縱windows 系統外殼程式首先要得到其提供的com介面。所用的com介面是ishelldispatch,它是從idispatch介面派生來的,在vc安裝目錄的vc98\include\exdisp.h標頭檔案中有定義,下面節選了一些將要用到的介面定義: ……
extern_c const iid iid_ishelldispatch;
#if defined(__cplusplus) && !defined(cinte***ce)
inte***ce declspec_uuid("d8f015c0-c278-11ce-a49e-444553540000")
ishelldispatch : public idispatch;……
該介面在cocreateinstance()函式建立com物件時將會得到指向其的指標,通過這個函式客戶程式可以避免顯式同類廠打交道,其實該函式內部也呼叫了cogetclassobject()函式來獲取com物件的類廠,只不過它把通過類廠建立物件的過程封裝起來了,
只需使用者指定物件類的clsid和待輸出的介面指標及介面id,顯然這樣直接建立com物件是非常便捷的,在獲取到com物件指標之後就可以通過這個指標去訪問呼叫com物件裡的方法來實現windows 外殼的種種功能呼叫了,下面是實現該功能的部分關鍵**: ……
hresult sc;//返回結果
ishelldispatch *pshelldisp = null; //初始化介面指標
//直接建立com物件
sc = cocreateinstance( clsid_shell,//指定待建立的com物件識別符號
null, //指定被聚合時的外部物件的介面指標
clsctx_server, //指定元件類別,可以指定程序內元件程序外元件或者程序內控制物件。
iid_idispatch, //指定介面id,需要注意的是這裡指的是待
//建立的com物件的介面id,而非類廠物件的介面識別符號
(lpvoid *) &pshelldisp );//存放函式返回的物件的介面指標
/* 在上述**中,cocreateinstance首先呼叫cogetclassobject函式建立類廠物件,然後用得到的類廠物件的介面指標建立真正的com物件,最後把類廠物件釋放並返回,這樣就很好的把類廠遮蔽起來,使使用者用起來更為簡單。*/
if( failed(sc) )//必須用failed 或succecced來判斷com物件是否建立成功
return;
pshelldisp->findfiles(); //呼叫com物件裡的方法
pshelldisp->release(); //釋放申請到的介面指標
…… 在這裡通過pshelldisp介面指標呼叫了com物件的findfiles()方法去進行查詢檔案的系統外殼操作。同樣,可以根據實際需要靈活呼叫響應的方法來執行相應的外殼操作,主要有以下幾個方法:
minimizeall 所有視窗最小化
undominimizeall 恢復視窗最小化
filerun 開始選單的"執行…"
cascadewindows 層疊視窗
tilevertically 垂直平鋪
tilehorizontally 水平平鋪
shutdownwindows 關閉windows
suspend 掛起計算機
settime 設定時間
trayproperties 工作列屬性
help windows幫助
findfiles 查詢檔案
findcomputer 查詢計算機
……這些介面均在vc安裝目錄的vc98\include\exdisp.h標頭檔案中有定義,可以通過對該檔案的檢視來編寫響應的外殼操作**。
小結:本文介紹了一種利用com技術實現windows系統外殼程式的簡便實用的方法,對windows系統外殼的程式設計和com程式設計的方法和思想做了闡述。
在掌握了本文程式設計的中心思想前提下,不僅可以對windows系統外殼進行程式設計,而且對於其他一些提供com介面的應用程式進行程式設計,比如可以在自己的應用程式中用類似的方法加入對office
辦公套件的支援等等。
投光燈外殼 LED投光燈外殼特性
在對led燈具關注的過程中,led燈具本身在節能性方面是很好的一種狀態,而在關注led投光燈製作完成的產品外殼的過程中,大家則能夠了解到led投光燈產品在使用的多個部分效果是很不錯的。戶外大型投光燈要達到一定的照明要求,基本都是大功率led晶元。所以led投光燈的防水防塵及散熱三項效能是決定其品質和...
使用外殼變數
就像其它的任何高階語言一樣,在外殼指令碼中使用變數也是十分重要的。1.給變數賦值 在pdksh和bash中,給變數賦值的方法是一樣的,即在變數名後跟著等號和變數值。例如,想要把5賦給變數count,則使用如下的命令 count 5 注意,在等號的兩邊不能有空格 在tcsh中,可以使用如下的命令 se...
外殼模式(shell)
系統程式設計師成長計畫 這本書中提到了外殼模式的概念。所謂的外殼模式的作用就是 不需要修改原來的應用程式,而控制它的輸入和輸出 即使用者介面 同時應用程式也不知道外殼的存在。當然這樣理解會比較麻煩,我們就舉個簡單的例子,比如已經存在乙個應用程式,我們想給該應用程式增添乙個新的使用者介面,這裡有兩種選...