原來獲取命令行是這樣的:
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++;
}
// ...
}
一測試,誒呀終於成功了。
因爲網上沒有這方面的說明,所以就把它記下來了,希望對遇到類似問題的有所幫助