zoukankan      html  css  js  c++  java
  • 【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 为命令参数, 无参数时返回空.

    今天就讲到这了!

    演示源码

  • 相关阅读:
    做小程序的流程总结(基本篇)
    ajax页面请求的做的留言板
    模仿文件存储方式,来进行添加、修改、添加子类的操作。
    轮播图(点击之后,会以滑动的形式滑动到指定的图片-有竖向和横向的显示)
    定时器使用实现的动画,宽度、位置等属性
    利用js、html以及Css简单制作了一个模拟手机短信发送
    利用反射获得数据库中存储数据的实现方法
    反射
    equals、static、单例模式的设计
    FPGA设计中的复位
  • 原文地址:https://www.cnblogs.com/ztercel/p/2110116.html
Copyright © 2011-2022 走看看