獲取命令列引數的各種變化

2021-07-25 08:27:28 字數 4562 閱讀 7967

常,在vc++中獲取命令列引數的有如下幾種方式:

在控制台程式中:

c++執行時庫通過入口函式main傳遞進來的引數int argc 和 char* argv。其中第二個引數將乙個完整的命令列分割成指向各引數的字串指標陣列,陣列中的每乙個元素是乙個指向引數的字串指標。其中, argv[0] 指向應用程式名自身。

如果想獲得像視窗形式的完整命令列引數cmdline的話,可以呼叫api getcommandline() 獲得。

在視窗程式中:

c++執行時庫通過入口函式winmain傳遞進來的引數lptstr pszcmdline。pszcmdline是乙個完整的命令列引數,包含應用程式名自身。

如果想獲得像控制台形式的被分割的命令列引數指標陣列的話。可以使用如下**獲得:

[cpp]

view plain

copy

//c++ code

pszcmdlinew = getcommandlinew();  

argv = commandlinetoargvw(pszcmdlinew, &argc);  

if(argv != null) localfree(argv);  

需要注意的是, commandlinetoargvw只有unicode的版本,因此省略第二行的**,而直接將入口函式中提供的引數lpcmdline傳給 commandlinetoargvw 可能會存在問題,這取決於專案使用的字符集屬性,幸好從 vs2005 開始,專案預設使用的字符集就是 unicode!

然而,在實際使用命令列引數,其實並不像如上所述那麼簡單,還有幾個不確定的因素會導致獲得的命令列引數發生變化。

測試步驟為:

三個程式的**為:

[cpp]

view plain

copy

//c++ code

//win32 project.

#include 

#include 

#include 

#include 

//使用xp風格的控制項。

#if defined _m_ix86

#pragma comment(linker,"/manifestdependency:/"type='win32' name='microsoft.windows.common-controls' version='6.0.0.0' processorarchitecture='x86' publickeytoken='6595b64144ccf1df' language='*'/"")

#endif

//函式前導宣告。

hresult

formattextw(

wchar

**, 

size_t

*, lpcwstr

, ...);  

hresult

wchar

**, 

size_t

*, lpcwstr

);  

hresult

wchar

**, 

size_t

*, lpbyte

, int

);  

intwinapi _twinmain(

hinstance

hinstance, 

hinstance

/*hprevinstance*/

,  lptstr

lpcmdline, 

intncmdshow)  

;  lpwstr

pcur = null;  

pszcmdlinew = getcommandlinew();  

argv = commandlinetoargvw(pszcmdlinew, &argc);  

//對命令列引數進行一些格式化,儲存到sztext中,最後通過messagebox進行顯示。

buflen = _countof(sztext);  

pcur = sztext;  

if(succeeded(  

hr = formattextw(&pcur, &buflen, l"getcommandlinew=%s"

, pszcmdlinew)  

) && succeeded(  

)pszcmdlinew,  

wcslen(pszcmdlinew)*sizeof

(wchar

))  

) && succeeded(  

)  ) && succeeded(  

)  ) && succeeded(  

hr = formattextw(&pcur, &buflen, l"argc=%d/r/nargv:/r/n"

, argc)))  

}  if(argv != null) localfree(argv);  

if((succeeded(hr)) || (hr == strsafe_e_insufficient_buffer))  

return

0;  

}  //格式化文字到緩衝區。

hresult

formattextw(

wchar

**ppbuf, 

size_t

*pbuflen, 

lpcwstr

pszformat, ...)  

//新增文字到緩衝區。

hresult

wchar

**ppbuf, 

size_t

*pbuflen, 

lpcwstr

psztext)  

//新增16進製制形式的記憶體位元組到緩衝區。

hresult

wchar

**ppbuf, 

size_t

*pbuflen, 

lpbyte

pmem, 

intcblen)  

;  hr = stringcchcatex(*ppbuf, *pbuflen, l"("

, ppbuf, pbuflen,  

strsafe_ignore_nulls);  

for(

inti = 0; i < cblen; i += 2)  

}  if(succeeded(hr))  

return

hr;  

}  

[cpp]

view plain

copy

//c++ code

//console project.

#include 

#include 

#include 

//函式前導宣告。

void

printmem(

lpbyte

, int

);  

int_tmain(

int/*argc*/

, _tchar* 

/*argv*/

)    

return

0;  

}  //輸出16進製制形式的記憶體位元組。

void

printmem(

lpbyte

pmem, 

intlen)  

}  _tprintf(_t(")/r/n"

));  

}  

[c-sharp]

view plain

copy

//c++ code

//console project.

#include 

#include 

#include 

//函式前導宣告。

void

int_tmain(

intargc, _tchar* argv)  

;  tchar szcmdline2 = ;  

tchar szwincmdline1 = ;  

) };  

tchar szconcmdline1 = ;  

) };  

//視窗程式測試。

//控制台程式測試。

return

0;  

}  void

;  process_information pi = ;  

_tprintf(_t("------------------------------------------/r/n/r/n"

));  

_tprintf(_t("/r/n/r/n"

), c);  

c++;  

_tprintf(_t("pszcmdline -- %s/r/n"

),  

pszcmdline == null ? _t("null"

) : pszcmdline);  

null, null, &si, &pi);  

if(bret != false)  

}  _tprintf(_t("/r/n------------------------------------------/r/n"

));  

}  

獲取命令列引數

在win32控制台應用程式中,主函式為 int main intargc,char argv 其中argc為引數個數,我們可以如此呼叫 for i 0 i 在win32應用程式中呢?主函式為 int winapi winmain hinstancehinstance,hinstancehprevin...

python getopt 獲取命令列引數

python 中 getopt 模組,該模組是專門用來處理命令列引數的函式 getopt args,shortopts,longopts args一般是sys.argv 1 shortopts 短格式 longopts 長格式 命令列中輸入 python test.py i 127.0.0.1 p ...

php命令列獲取引數

php命令列獲取引數 原來程式使用list.php?n 1來實現乙個功能,現在需要讓其自動執行。在命令列下,cd www hx usr local bin php www hx list.php 但list.php要如何獲取引數呢?通過瀏覽文件,php 的命令列模式 知道了在使用命令行時,會產生 a...