我的CMD工程(1) 請指點

2021-05-23 01:56:56 字數 2269 閱讀 5928

很早以前就打算寫乙個自己的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 ...