作者:朱金灿

来源:http://blog.csdn.net/clever101

首先说说Win 32 API程序如何支持命令行参数。Win 32程序的入口函数为:

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)

其中lpCmdLine为命令行参数,所以只需把它解析出来即可。

比如一个win32程序为a.exe,它的命令行用法如下:

a.exe 文件1 文件2

那么可以这样解析:

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{ int argc = 0;
LPWSTR *lpszArgv = NULL;
//分割命令行参数
lpszArgv = CommandLineToArgvW(lpCmdLine, &argc);
if (argc >= 2)
{
if(::GetFileAttributes(lpszArgv[0])==-1)
{
//文件1不存在
::MessageBox(GetDesktopWindow(),lpszArgv[1],_T("提示"), MB_OK|MB_ICONINFORMATION);
return 1;
} if(::GetFileAttributes(lpszArgv[1])==-1)
{
//文件2不存在
::MessageBox(GetDesktopWindow(),lpszArgv[2],_T("提示"), MB_OK|MB_ICONINFORMATION);
return 1;
}
}

如果是一个MFC程序,做法比Win 32 API程序多一步,就是获取命令行字符串。具体如下:

BOOL CXxxAppApp::InitInstance()
{
LPTSTR pszCmdLine = GetCommandLine(); //获取命令行参数;
LPWSTR *lpszArgv = NULL;
int argc = 0;
lpszArgv = CommandLineToArgvW(pszCmdLine,&argc); //拆分命令行参数字符串
// 下面的处理和win32 api程序一样,
}

有四点需要注意:

1. Win 32 API程序的命令行lpCmdLine是只包含参数,而MFC程序的命令行第一个参数是exe本身。

2.  GetCommandLine获取的是一个unicode字符串,CommandLineToArgvW也只能处理unicode字符串,如果你的程序选择的是多字节字符集,需要进行处理。

3.  CommandLineToArgvW是按空格来拆分参数的,如果从参数是文件路径,就不要用CommandLineToArgvW了,因为文件路径本身可能带有空格,可以用正则表达式来解析。

4.  命令行的调试可以这样设置:

Win32程序支持命令行参数的做法的更多相关文章

  1. Win32程序支持命令行参数的做法(转载)

    转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...

  2. 让.Net程序支持命令行启动

    很多时候,我们需要让程序支持命令行启动,这个时候则需要一个命令行解析器,由于.Net BCL并没有内置命令行解析库,因此需要我们自己实现一个.对于简单的参数来说,自己写一个字符串比较函数来分析args ...

  3. 给go程序添加命令行参数

    操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 需要应用程序根据不同的配置文件访问不同的服务器,希望程序启动时可以指定配置文件. 解决方案 package main i ...

  4. 如何让python脚本支持命令行参数--getopt和click模块

    一.如何让python脚本支持命令行参数 1.使用click模块 如何使用这个模块,在我前面的博客已经写过了,可参考:https://www.cnblogs.com/Zzbj/p/11309130.h ...

  5. Spring Boot程序接收命令行参数

    Spring Boot程序接收命令行参数 输入一行,回车,触发一次.如果想要调用service层,也是可以,能调用service层,就可以做很多事,触发一次就好比调用了一次http接口一样 packa ...

  6. 在Xcode4中给程序提供命令行参数(转)

    网上xcode4的资料实在是不多,再加上xcode4相对3的改动还那么大,并且还只有英文版.我为了这个问题头痛了很久.后来终于找到了...方法如下 xcode菜单的Product->EditSc ...

  7. .NET 命令行参数包含应用程序路径吗?

    如果你关注过命令行参数,也许发现有时你会在命令行参数的第一个参数中中看到应用程序的路径,有时又不会.那么什么情况下有路径呢? 其实是否有路径只是取决于获取命令行参数的时候用的是什么方法.而这是 Win ...

  8. Appium 服务命令行参数

    Appium  可以直接通过命令行启动,同样支持命令行参数配置 参考: http://appium.io/slate/cn/master/ 使用方法 例如: appium  --shell 服务器标志 ...

  9. 如何编写一个带命令行参数的Python文件

    看到别人执行一个带命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持带命 ...

随机推荐

  1. 【PHP+Redis】 php-redis 操作类 封装

    <?php /** * redis操作类 * 说明,任何为false的串,存在redis中都是空串. * 只有在key不存在时,才会返回false. * 这点可用于防止缓存穿透 * */ cla ...

  2. LeetCode——Move Zeroes

    Description: Given an array nums, write a function to move all 0's to the end of it while maintainin ...

  3. redis未授权访问漏洞那拿SHELL

    一.什么是redis未授权访问漏洞: 1.redis是一种文档型数据库,快速高效,存储在内存中,定期才会写磁盘.主要用于快速缓存,数据转存处理等.默认redis开在6379端口,可以直接访问.并不需要 ...

  4. 【BZOJ3932】[CQOI2015]任务查询系统 主席树

    [BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...

  5. Python 自学积累(一)

    1. 当"print os.path.dirname(__file__)"所在脚本是以完整路径被运行的, 那么将输出该脚本所在的完整路径,比如: python d:/pythonS ...

  6. Ubuntu18.04下安装比特币客户端

    一.下载有两种安装方式:安装包和源码 二.安装1.通过安装包安装在https://bitcoin.org/en/download下载Windows,Mac OSX,Linux对应的安装包.安装过程比较 ...

  7. mysql 数据操作 单表查询 where约束 练习

    create table employee( id int not null unique auto_increment, name ) not null, sex enum('male','fema ...

  8. ssh 配置文件讲解大全 ssh调试模式 sftp scp strace进行调试 特权分离

    ssh 配置文件讲解大全  ssh调试模式  sftp scp strace进行调试  特权分离 http://blog.chinaunix.net/uid-16728139-id-3265394.h ...

  9. PHP函数处理方法总结

    call_user_func_array (PHP 4 >= 4.0.4, PHP 5, PHP 7) call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的 ...

  10. PAT 1083 List Grades[简单]

    1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...