在DOS 系统中我们常使用命令行参数来实现用户对程序功能的控制, 如: dir /w 列举当前目录下的所有文件及文件夹, format c: /q 对C盘进行快速格式化等; 而在Windos平台中它一样非常有用,正如大家常操作的,双击一个关联文件test.doc或在开始->运行中输入notepad.exe c:\test.txt 都会启动对应的软件并打开所操作的文件,事实上,后面的实现无不与commandline 有关; 因此今天我们就来演示它的实现过程:
#define CONSOLE_PARAM_MAIN
#ifndef CONSOLE_PARAM_MAIN
void main()
{
TCHAR szCmdLineInfo[MAX_PATH * 3] = {0};
_stprintf(szCmdLineInfo, _T("command line: \n %s"), GetCommandLine());
MessageBox(GetDesktopWindow(), szCmdLineInfo, _T("I Come from < void main() > function"), MB_OK);
}
#else
void main(int argc, char* argv[])
{
TCHAR szTmp[MAX_PATH] = {0};
TCHAR szCmdLineInfo[MAX_PATH * 3] = {0};
_tcscpy(szCmdLineInfo, _T("command line: "));
for (int ii = 0; ii < argc; ii++)
{
#ifdef _UNICODE
TCHAR szBuf[MAX_PATH];
mbstowcs(szBuf, argv[ii], MAX_PATH);
_stprintf(szTmp, _T("\n%d: %s "), ii + 1, szBuf);
#else
_stprintf(szTmp, _T("\n%d: %s "), ii + 1, argv[ii]);
#endif
_tcscat(szCmdLineInfo, szTmp);
}
MessageBox(GetDesktopWindow(), szCmdLineInfo, _T("I Come from < void main(int, char*) > function"), MB_OK);
return;
}
#endif
BOOL WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpszCmdLine, int nShowCmd)
{
TCHAR szCmdLineInfo[MAX_PATH * 3];
if (NULL != lpszCmdLine && NULL != *lpszCmdLine)
{
_stprintf(szCmdLineInfo, _T("command line: [ %s ]"), lpszCmdLine);
} else {
_tcscpy(szCmdLineInfo, _T("hav't set the command line!"));
}
MessageBox(GetDesktopWindow(), szCmdLineInfo, _T("I Come from < BOOL _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) > function"), MB_OK);
//==: if this cmdline is exe file path, will startup it
if (NULL != lpszCmdLine && NULL != *lpszCmdLine && NULL != _tcsstr(lpszCmdLine, _T(".exe")))
{
ShellExecute(NULL, _T("open"), lpszCmdLine, NULL, NULL, SW_SHOWNORMAL);
}
return TRUE;
}
通常获取命令行参数有两种方式:
1. 通过main 函数的参数 (注: Console 下的main 参数里会把自身的exe做为命令参返回的, 参数以空隔为间隔,WinMain仅还返回命令参以字符方式返回)
2. 通过GetCommandLine函数返回(注: 返回结果如1注所描述一致)
我们先讲解一下程序结构,程序中包括了三个main函数: a. 无参数main; b. 带参数main; c. win32下的WinMain; main 函数不支持重载,所以运用宏来实现隔离。 main 和 WinMain可以共存的, 但是要求设置一下工程: 链接器->系统->子系统 为 未设置即可,用户可通过设置控制台或windows来启动不同的入口函数。 此外本程序使用了跨字符集开发,因而可以在不同的字符集下正常工作。
a. 无参数main -- 演示了GetCommandLine函数获取命令参的用法, 此函数同样可用于WinMain中;
b. 带参数main –- 演示void main(int, char*)通过参数返回命令参, 此main中两参数分别表示int – 参数个数, char* – 参数数组(含自身exe路径)
c. WinMain -- 演示WinMain(HINSTANCE, HINSTANCE, LPTSTR, int)通过参数返回命令参,LPTSTR 为命令参数, 无参数时返回空.
今天就讲到这了!