關於Win32 SDK(C++)的命令行獲取,通過__argc和__argv

原來獲取命令行是這樣的:

int APIENTRY wWinMain(
	_In_		HINSTANCE	hInstance,
	_In_opt_	HINSTANCE	hPrevInstance,
	_In_		LPWSTR		lpCmdLine,
	_In_		int			nShowCmd
)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
 //...
	return (int)msg.wParam;
}

 

 

上面的初始化代碼裏面有一個參數,lpCmdLine就是命令行。不過這樣有一個問題——一個個去寫字符串分析很煩,還弄得代碼一大串。

 

 

前段時候,在網上看到了<stdlib.h>裏面的__argc和__argv可以當成控制檯裏面的用。當時那個興奮。火速完成了下面的代碼。

 

int APIENTRY wWinMain(
	_In_		HINSTANCE	hInstance,
	_In_opt_	HINSTANCE	hPrevInstance,
	_In_		LPWSTR		lpCmdLine,
	_In_		int			nShowCmd
)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	// 前初始化 - 參數配置等
#if _DEBUG_VER_
	FILE *stream;
	AllocConsole();
	freopen_s(&stream, "CONOUT$", "w", stdout);
#endif
	// 命令行
	int cnum = __argc, i = 0;
	char** cm = __argv;
	while (cnum--)
	{
		printf("%s\r\n", cm[i]);
		i++;
	}
// 。。。
}

 

看出問題了嗎?如果可能的話你可以自己去試試,運行就崩潰。本來這方面資料就少,翻遍百度找不到一個。後來,我發現__argv是char **型的,難道wWinMain裏面不能出現ANSI的這種?

通過查找它們在<stdlib.h>中的定義,我找到了 __wargv ,是__argv對應的寬字符類型。思來想去都覺得是wWinMain裏面不能出現ANSI的__argv這種問題,便馬上改了改:

 

int APIENTRY wWinMain(
	_In_		HINSTANCE	hInstance,
	_In_opt_	HINSTANCE	hPrevInstance,
	_In_		LPWSTR		lpCmdLine,
	_In_		int			nShowCmd
)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

	// 前初始化 - 參數配置等
#if _DEBUG_VER_
	FILE *stream;
	AllocConsole();
	freopen_s(&stream, "CONOUT$", "w", stdout);
#endif
	// 命令行
	int cnum = __argc, i = 0;
	wchar_t** cm = __wargv;
	while (cnum--)
	{
		wprintf(L"%s\r\n", cm[i]);
		i++;
	}
// ...
}

一測試,誒呀終於成功了。

 

因爲網上沒有這方面的說明,所以就把它記下來了,希望對遇到類似問題的有所幫助
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章