【Demo 0001】 获取命令行参数

在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 为命令参数, 无参数时返回空.

今天就讲到这了!

演示源码

原文地址:https://www.cnblogs.com/ztercel/p/2110116.html