讓MFC程式支援命令列引數

2021-05-24 15:44:03 字數 2540 閱讀 4046

讓mfc程式支援命令列引數

一般情況下,如果我們的vc工程是console控制台型別或者是win32型別的情況下,這兩類的工程型別比較容易獲得命令列引數,即,通過其入口點函式

int main(int argc, char *argv)

int apientry winmain(hinstance hinstance, hinstance hprevinstance, lptstr lpcmdline, int ncmdshow)

複製**

else if (nresponse == idcancel)

return false;}

複製**

我們要獲取程式的命令列引數,一般是在主對話方塊介面顯示之前,即 cprojcleanerdlg dlg; 之前獲取。獲取的方法主要是呼叫 getcommandline 和 commandlinetoargvw 函式。

getcommandline 函式的原型定義如下:

lptstr winapi getcommandline(void);

複製**

沒有引數,返回值是乙個lptstr型別的字串指標,即命令列引數的字串。

預設情況下,每個程式都會有乙個命令列引數,即可執行程式本身的路徑,第二個引數才是真正的附加命令列引數。舉個例子,呼叫getcommandline函式獲取到的命令列引數的字串大致如下:

"e:/software/projcleaner.exe" "-help"

複製**

其中,"e:/software/projcleaner.exe" 為可執行檔案的路徑,"-help" 為附加的引數。

呼叫完 getcommandline 函式獲取到了命令列引數之後,我們就要呼叫 commandlinetoargvw 函式去分解得到的命令列引數字串,commandlinetoargvw 函式的原型定義如下:

lpwstr *commandlinetoargvw(

lpcwstr lpcmdline,

int *pnumargs);

複製**

他有兩個引數,第乙個引數 lpcmdline 即通過 getcommandline 函式獲取到的命令列引數字串指標,第二個引數是乙個 int 型別的指標,用這個引數返回命令列引數中的引數個數,預設情況下,pnumargs 會返回1,如果有附加的命令列引數,該值會大於1,比如:

"e:/software/projcleaner.exe" "-help"

複製**

剛開始我還不以為然,可是最近從網上蒐集到了一些軟體的例子原始碼,想**到我們 vc驛站 - www.cctry.com

,在清理工程目錄過程中確實感到有點不方便,於是我就想也讓我的這個《工程目錄清理器》支援命令列引數,同時整合到資料夾的系統右鍵選單裡面,這樣執行起來就方便多了。說做就做,於是把《工程目錄清理器》的**修改了一下,主要的核心**就是上面提到的。此外,再給大家說一下如何整合到資料夾的系統右鍵選單:

1、在[hkey_classes_root/directory/shell] 分支下建立乙個自己命名的子鍵,例如,我的叫做:projcleaner;

2、將新建子鍵projcleaner下的預設鍵值設定為你想在資料夾右鍵選單中顯示的字串,比如我的設定為:工程目錄清理器;

3、在剛才新建的子鍵projcleaner下面再新建一子鍵,但是名字必須是command;

4、將剛才新建子鍵command下面的預設鍵值設定為:e:/software/projcleaner.exe "%1",其中 e:/software/projcleaner.exe 是工程目錄清理器軟體所在的路徑,這個大家可以根據自己的程式位置來寫,但是後面的 "%1" 大家一定要記得加上,他代表的就是右鍵單擊資料夾所在的路徑,即我們呼叫 getcommandline 函式所獲得的附加引數。

具體,見如下兩幅圖:

經過了以上4個步驟之後,當我們右鍵單擊某個資料夾之後,在彈出的選單中就已經有我們新增的一項即「工程目錄清理器」,如下圖:

修改後的 initinstance() 函式**如下:

;swprintf(szpath, _t("%s%s%s"), _t("確定要清理 [ "), lpszargv[1], _t(" ] 目錄嗎?")); //格式化字串;

if (messagebox(null, szpath, _t("友情提示"), mb_okcancel|mb_iconquestion) ==  idok)

return false;

} line end;

cprojcleanerdlg dlg;

m_pmainwnd = &dlg;

int_ptr nresponse = dlg.domodal();

if (nresponse == idok)

else if (nresponse == idcancel)

return false;}

複製**

中的原始碼資訊。

具體開啟關聯資料夾右鍵選單的設定在:執行「工程目錄清理器」-> 「設定資訊」按鈕 -> 「關聯資料夾右鍵選單」勾上 -> "應用設定" 即可!

說道這裡也差不多講完了,大家有什麼問題再跟帖提問吧……

讓MFC支援命令列引數

如果在c dlg dlg 之前加入,這個過程就是程式框架出來之前。簡介 lptstr winapi getcommandline void 沒有引數,返回值是乙個lptstr型別的字串指標,即命令列引數的字串。lpwstr commandlinetoargvw lpcwstr lpcmdline,i...

關於main ,讓程式可以執行命令列引數

ms c c應用程式的啟動函式為maincrtstartup 或者winmaincrtstartup 他們都在這個函式內部定義了main 函式,或者winmain 然後以他們的返回值為引數呼叫庫函式exit 因此也就預設了main 應該作為它的連線物件,如果找不到這樣的函式定義,自然就會報錯了。ma...

MFC程式中如何接受命令行引數

方法一 getcommandline 方法二 for int i 0 i argc i for int i 1 i argc i rcmdinfo.parseparam pszparam,bflag,blast 這裡有個繼承ccommandlineinfo類的例子 目標 讓應用程式處理這裡所見的命令...