很早以前就打算寫乙個自己的cmd,cmd,就類似與c:/windows/system32/cmd.exe的東東,就是輸入一些指令**,它就會完成相應的功能。比如敲入dir,則列出當前目錄下的檔案和資料夾等。
乙個好的cmd(你可以叫它為指令解析系統)能夠允許使用者自定義指令,然而你也許不想讓使用者看到你的**,這可以用dll來實現,使用者按照你的編寫規則,建立自己的乙個dll,這個dll裡面是使用者自己定義的命令,相應的又一些命令函式,然後在乙個規定的檔案(比如functioninfo.txt)中加入一些dll資訊和指令資訊,而你的cmd系統可以根據這個檔案來查詢相應的dll並呼叫相應的命令函式。
還有乙個困難,就是如何根據使用者輸入的命令來進行解析,並呼叫相應的命令函式呢?這便是cmd核心的東西,在此之前,你應該了解一下dll。乙個exe可以利用乙個dll中的函式名來呼叫該函式,也可以利用該函式在dll中的編號來呼叫它。
例如:getprocaddress(hdll,makeintresource(num));
該函式返回編號為num的函式的位址,其中的hdll可以用hdll = loadlibrary(dllname);來獲取,dllname就是dll的檔名,可以在functioninfo.txt中給出。於是就可以定位該命令函式了。
也許你會問命令函式是什麼東東,呵呵,乙個cmd就是利用輸入的指令,根據指令來呼叫相應的函式以完成一定的功能,這個和命令相關聯的函式就是命令函式了。^-^
有一些命令是有引數的,比如計算加分的命令,我們這裡以add命令為例,來編寫add命令。應該完成這樣的功能,使用者輸入add 34 56(按回車)cmd要對輸入的這個命令進行分解,分解成命令名和引數,顯然,這裡的add是命令名,34 56為兩個引數,cmd系統在進行處理,把輸入的34 56存放在string裡面,然後對其進行引數壓棧,壓棧順序是從右向左。所以系統中應該還要有個引數棧,學過了資料結構,這個棧會很容易實現。引數壓棧完還要再對命令add進行處理,因為要定位相應的命令函式。由於getprocaddress()是返回引數的位址,也就是函式的指標,
typedef void (_stdcall *lpfun) ();//定義函式指標
我們這樣來定義乙個引數為空,返回值為void的函式指標,我們不可能定義很多很多的指標函式,於是我們規定,所以的命令函式都應該滿足引數為空,返回值為void的要求。你會問,可是add 34 56 命令裡有兩個引數呀!沒錯,因為我們已經對引數壓棧了,我們只要進行出棧操作就可以了。
對add進行處理,就是要找到add命令的命令函式位於哪個dll裡面,並且在dll中的編號是什麼,這都記錄在functioninfo.txt裡面,functioninfo.txt的編寫格式是這樣的,每一行是乙個命令記錄,其從左向右的屬性分別為:
命令標號| |函式名| |函式所在dll| |函式引數| |在dll中的序號|
屬性之間用空格隔開。
例如:1 acos math.dll 5 1
2 add math.dll 55 2
3 asin math.dll 5 3
29 listprocess control.dll 0 8
30 closeprocess control.dll 0 1
31 listwindow control.dll 0 9
32 closewindow control.dll 0 2
函式引數的標號這樣規定:
0代表沒有引數
1代表char*
2代表char
3代表int
4代表float
5代表double
6代表string
...於是根據輸入的add來進行查詢,查詢記錄的第二個屬性,於是查詢到記錄為:
2 add math.dll 55 2
的行,再對該行進行處理,獲得add命令所在的dll檔名,為math.dll,引數型別為55(即兩個double型別的引數,並獲得add的命令函式在math.dll中的編號為2,於是,我們就可以進行定位該函式了。
可問題又出來了,你要的引數是double可引數棧中的型別為string啊,這也好辦,cmd中要有乙個專門處理引數型別的方法,可以根據引數型別如:55,來進行引數的處理,處理後放在引數結構體裡面:引數結構體是這樣的:
struct realparm
;於是add的函式編寫就是這樣的:
void _stdcall add()
{
coutdouble_parm[1]《然而這只是簡單的命令解析和命令函式呼叫,本cmd中還有很多其他的解析和呼叫方法。
老師給我的指點 深刻剖析了我
今天上午找導師有事,導師坐下來和我聊了聊。他說,就他的觀察,我有以下幾個方面的問題。一 感覺我在做事上總是欠缺那麼一點東西。就是說,給我的事情,我是能做完也讓別人沒法批評我,但是總感覺欠缺一點東西,相比師妹,每次給任務1分可以做完1.2分,而我每次都是0.8分。雖然無可厚非,但是總感覺少點什麼。他說...
軟體工程 我的留學生活 1
來到南韓將近兩年了。本想把發生的事情都記下來的。可繁重的學習任務,專案,生活,打工等等佔據了我所有的時間,幾乎2年都沒有寫過文章了。身在國外,說著外語,我忽然感覺對中文既熟悉又生疏。開心的是我終於又可以開始寫文章了,但同時也感覺到心中的話好像又文章表達不出來,很壓抑的感覺。研究室的生活很辛苦,特別是...
我的軟體工程之路1 寒假總結
我是乙隻小小小小菜鳥 想要飛呀飛卻飛也飛不高 我尋尋覓覓尋尋覓覓乙個溫暖的it懷抱 這樣的要求不算太高 現在我可以驕傲的說自己是乙隻小小小小菜鳥,就在這個寒假以前回想自己連乙隻小小小小菜鳥都不算,要說清楚這只小小小小菜鳥的誕生的原委,這還得聽我娓娓道來。2012 1 9 開始寒假之旅 2012 1 ...