什么是进程的命令行参数

每个进程在启动(双击exe启动、cmd命令行启动或者由其他程序通过CreateProcess启动)的时候,都会有一个命令行参数给它。命令行的参数以空格区分。这个命令行总是不为空,因为命令行参数的第第一参数是exe程序的启动路径。但是一般情况下,我们会忽略这个参数。一般情况下,我们忽略第一个参数,将后面的内容作为命令行参数对待。

如何获取命令参数一

方法一:通过Windows API GetCommandLine 获取命令参数。

#include <iostream>
#include <Windows.h>
int main()
{
PTSTR cmdStr = GetCommandLine();
std::wcout << cmdStr << std::endl;
}

在VS项目的属性页中,设置调试属性为 key1=value1 key2=value2 这个属性可以配置启动程序的命令行参数。

调试项目之后之后,会得到下面的输出结果"D:\project\ConsoleApp1\x64\Debug\ConsoleApp.exe" key1=value1 key2=value2,从输出结果可以看到GetCommandLine api获取到的结果 第一个参数为"D:\project\ConsoleApp1\x64\Debug\ConsoleApp.exe" ,第二个参数为key1=value1,一般参数都是key-value键值对。第三个参数为key2=value2.一般情况下,我们会忽略第一个参数。从程序的角度来讲,命令行参数本质上就是以0结尾的一个字符串。我们可以定义任何格式的字符串作为命令行参数。但是通常情况下,我们以空格作为分割命令行参数的分割符号。

一般我们用key=value的形式表示一个命令行参数。但这也不是绝对的。我们也还可以其他的参数格式key1=value1 --key2=value2 /key3=value3 --key4 value4 /key5 value5具体参数,可以在程序中,自行解析。

方法二:通过修改main函数的参数

main函数除了可以写成上面的格式之外,还可以写成带参数的格式,如下:

int main(int argc,char** argv)

第一个参数argc表示命令行参数的个数,第二个参数表示命令行参数的指针数组。这种写法的好处是不用自己手动解析参数,操作系统会帮助我们解析好参数之后,放在数组指针中,我们直接拿着用就可以。

#include <iostream>
#include <Windows.h>
int main(int argc,char** argv)
{
for (int i = 0; i < argc; i++) {
std::wcout << argv[i] << std::endl;
}
}

上面代码,通过循环输出所有的参数,输出结果如下:

方法三:通过全局变量获取命令行参数

windows提供了__argc的全局变量表示命令行参数的个数,通过__argc或者__wargv表示命令行的参数,相当于方法二中 main函数的第二个参数char** argv__wargv表示unicode版本,__argc表示ANISC版本。

#include <iostream>
#include <Windows.h>
int main(int argc,char** argv)
{
std::cout << __argc << std::endl;
for (size_t i = 0; i < __argc; i++)
{
std::wcout << __argv[i] << std::endl;
}
}

运行上面代码,可以得到如下结果:直接打印出命令行参数的个数和参数的具体内容。当然微软不建议使用这两个全局变量来访问命令行参数个数和参数内容。一般建议使用方法一和方法二访问命令行参数和参数内容。

解析命令行参数

微软提供一个CommandLineToArgvWAPI来对命令行参数进行解析,但是这个API目前貌似只提供了UNICODE版本的API。

#include <iostream>
#include <Windows.h>
int main(int argc,char** argv)
{
PTSTR cmdStr = GetCommandLine();
int numArgs;
PWSTR* str = CommandLineToArgvW(cmdStr, &numArgs);
for (size_t i = 0; i < numArgs; i++)
{
std::wcout << str[i] << std::endl;
}
HeapFree(GetProcessHeap(), 0, str);
}

执行上述代码会输出以下结果,可以看到三个命令行参数被正确打印出来。因为CommandLineToArgvWAPI在函数内部会分配内存,所以我们要记得释放内存。尤其是当我们频繁调用这个API的时候。

Windows编程----进程:命令行参数的更多相关文章

  1. Linux进程-命令行参数和环境列表

    命令行参数 在C中,main函数有很多的变种,比如 main(), int main(), int main(int argc, char *argv[]), int main(int argc, c ...

  2. Windows下解析命令行参数

    linux通常使用GNU C提供的函数getopt.getopt_long.getopt_long_only函数来解析命令行参数. 移植到Windows下 getopt.h #ifndef _GETO ...

  3. windows WTL使用命令行参数

    两中方法: 第一种: int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLin ...

  4. 转载:linux编程,命令行参数输入getopt

    下面资料来自百度百科: getopt(分析命令行参数) 相关函数 表头文件 #include<unistd.h> 定义函数 int getopt(int argc,char * const ...

  5. java编程将命令行参数转化为整数并实现求和的功能。

  6. 利用COPYDATASTRUCT传递命令行参数给驻留内存的进程(SendMessage应用)

    我们知道Window进程之间通过API的SendMessage方法传递消息.但是方法参数lParam是Long型,那么如果传递一个字符串(譬如命令行参数)应该怎么办呢,甚至一个对象.结构呢.VB的发送 ...

  7. Delphi 获取进程路径及命令行参数

    Delphi 获取进程路径及命令行参数, 但有的进程获取时会报错,不知为啥 type PVOID64 = UINT64; _UNICODE_STRING = packed record Length ...

  8. windows上,任务管理器中,进程命令行太长怎么办

    一.前言 在windows上,有时候需要查看进程命令行,但是有的进程的命令行太长了,很难看全 此时,可以使用下面的方法解决(红框改为自己要查看的进程即可): C:\Users\Gaoyu>wmi ...

  9. Windows命令行参数的知识(一)

    最近没事的时候,准备研究一下Windows命令行参数的知识,因为每次自己在操作电脑时总是效率太慢,如果能够了解Windows参数的一些知识,绝对能提高效率! 基本外部命令和内部命令 首先是基本的知识, ...

  10. C#中如何获取其他进程的命令行参数 ( How to get other processes's command line argument )

    Subject: C#中如何获取其他进程的命令行参数 ( How to get other processes&apos;s command line argument )From: jian ...

随机推荐

  1. Java的HTTP接口测试框架Gatling

    之前讲过的<JHM>是一个java的基准测试框架,一般用于测试jdk里的API.如果要测试http接口,可以使用Gatling. 你可能用过JMeter,也是可以的 原生的Gatling是 ...

  2. 转载 Python 存储与读取HDF5文件

    HDF5 简介 HDF(Hierarchical Data Format)指一种为存储和处理大容量科学数据设计的文件格式及相应库文件.HDF 最早由美国国家超级计算应用中心 NCSA 开发,目前在非盈 ...

  3. re模块:核心函数和方法

    1.compile(pattren,flages=0)   使用任何可选的标记来编译正则表达式的模式然后返回一个正则表达式对象 2.match(pattern,string,flags=0)    尝 ...

  4. Windows10 64环境下用Qt5.12.12自带的mingw730_64构建编译OpenCV4.1.0时cmake-3.20.6中的参数配置

    一.环境条件说明: 操作系统:Windows10 64环境 编译工具:用Qt5.12.12自带的mingw730_64构建 构建对象:编译OpenCV4.1.0的Release 64位和Debug 6 ...

  5. 即时通讯技术文集(第44期):微信、QQ技术精华合集(Part1) [共14篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第44 期. [-1-]  微信朋友圈千亿访问量背后的技术挑战和实践总结 [链接] http:/ ...

  6. 即时通讯技术文集(第32期):IM开发综合技术合集(Part5) [共12篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第32 期. [- 1 -] IM开发干货分享:如何优雅的实现大量离线消息的可靠投递 [链接]  ...

  7. Angular(一) - Typescript&Angular入门熟悉

    1. Typescript 1.1 安装typescript 1.2 typescript的小例子 1.2.1 新建一个index.ts 1.2.2 编译ts成js 1.2.3 查看生成的index. ...

  8. GeoJSON代码示例

    GeoJSON代码示例 1. 读取GeoJSON文件 1.1 实现思路 graph TD A[读取GeoJSON文件] --> B[读取GeoJSON文件内容] B --> C[解析Geo ...

  9. ElasticSearch(1)---Logstash同步Mysql数据到ElasticSearch

    1. 单机部署-场景描述 elasticsearch只用过,没有部署或者维护过,从头完整走一遍,记录下,原创实战,有需要的朋友参考下. 2 . 解决方案 特别说下,以前win7下安装的3台虚拟机,没有 ...

  10. superset 1.3 hello world 开发实录

    参考网址: https://superset.apache.org/docs/installation/building-custom-viz-plugins 实际操作: 因为内容是从hub上下载的: ...