WinMain中的lpCmdLine参数

来源:互联网 发布:蒋介石为何不抵抗知乎 编辑:程序博客网 时间:2024/05/18 00:13
 

WinMain中的lpCmdLine参数

分类: c++ 740人阅读 评论(0) 收藏 举报

win32可执行程序分为两种类型,基于控制台(Consol-based)的和基于窗口(Windows-based)的。基于控制台程序它的入口函数是传统的main,基于窗口的则是WinMain。这两个入口函数一大区别是对于命令行参数的处理。

WinMain函数原型:int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow),LPSTR lpCmdLine存储了命令行参数信息,MSDN对这参数解释:

lpCmdLine
[in] Pointer to a null-terminated string specifying the command line for the application, excluding the program name. To retrieve the entire command line, use the GetCommandLine function.
(指向一个应用程序命令中,除了程序名的null字符结束的字符串。GetCommandLine函数可以返回整个命令行)

为了更清晰lpCmdLine是什么内容,以下做一些测试。假设可执行程序名:test.exe。

1、命令:test.exe (回车)
lpCmdLine:0x00141f03 "" char *

注:
0x00141f03:lpCmdLine运行时内存地址
"":lpCmdLine内容,这里值是空串
char *:lpCmdLine类型,它指出lpCmdLine是字符串。

命令行中没任何参数。lpCmdLine是有效地址,但它是空字符串,即lpCmdLine[0]='/0'。因而程序要判断命令行是不是带参数不能用if (lpCmdLine)而应该用if (lpCmdLine[0])。

2、命令:test.exe --config-dir Wesnoth1.7 (回车)
lpCmdLine:0x00141f03 "--config-dir Wesnoth1.7" char *

命令行带参数,参数间有空格但没有"符号。

3、命令:test.exe "--config-dir Wesnoth1.7" (回车)
lpCmdLine:0x00141f03 ""--config-dir Wesnoth1.7"" char *

相比2,这里强行给参数加了"",可以看到lpCmdLine不对参数内的""进行处理,直接复制。

4、命令:test.exe "--config-dir "Wesnoth1.7" (回车)
lpCmdLine:0x00141f03 ""--config-dir "Wesnoth1.7"" char *

相比于3,这里强行在中间加一个",这造成了""没有配对,但WinMain只是原样复制而已。

WinMain的参数不像传统的main函数,会依着特殊字符得出两个参数argv和argc,它就是除去可执行文件字符串(加上后续空格符)的整个命令行作为一个字符串,直接给了lpCmdLine。

程序一般作法是参数以空格符进行分隔,所以为了便于程序解析参数,当某个参数中有空格符时,例如program files,那最好能用某种方法让程序知道它是一个参数,所以一直沿袭作法就是在它的外头加上""。

 

 

 

SEXWOW 说的的 Shell 打开文件只是其中一种,除了 Shell 打开,还可以用 DDE 打开。 

很多程序都有命令行参数,但是在 Windows 软件里,命令行参数一般不被普通用户直接使用。 

比如,WinRAR 在解压的时候就后台调用了 Rar.exe,并把很多参数作为命令行参数传递给 Rar.exe,这样 Rar.exe 根据这些参数对文件进行压缩。 

再比如,我们的编译器环境,VC++,后台调用了 CL.exe 和 Link.exe 进行编译和链接,同时把很多参数传递给它们。让它们根据这些参数进行工作。 

再比如我们经常用的 RegSvr32 /u ... ,RunDLL32 **.dll 

这里的 /u,*.dll 也是命令行参数。 

如果你要编译带有命令行参数的 EXE,就需要这个 lpCmdline。

另外,纠正你一个错误,lpCmdline 不是操作系统传递给 WinMain 的,而是 VC++ 的运行时库获得命令行参数,并传递给你编写的 WinMain 函数。
要注意的是,VC++ 获得的 EXE,首先执行的是 VC++ 运行时库的开始程序,然后获得各种参数(包括 lpCmdline)以后传递给 WinMain。

操作系统是不管你有没有 WinMain 的,更不会给一个程序的某个函数传递任何参数。

 

 

 

 

举个例子来说吧:
你在双击一个文件时,系统会调用相应的程序来打开文件,(如你双击一个.txt文件的时候,系统会调用notepad.exe来打开文件),这个时候系统会传一个命令行参数给WinMain,也就是说lpCmdLine等于那个.txt文件的路径(例如是D:/1.txt),就是这个意思

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美图m4手机拍照黑屏怎么办 美图m4拍照黑屏怎么办 美图m4很卡怎么办 美图m8工厂模式怎么办 美图m6开不了机怎么办 美图m8开不开机怎么办 美图摄像头坏了怎么办 美图t8相机模糊怎么办 美图m4卡槽坏了怎么办 美图t8手机好卡怎么办 美图手机m6卡怎么办 美图t8屏幕不亮怎么办 美图m8卡机了怎么办 美图m6手机太卡怎么办 美图t8闪退怎么办 美图手机相机闪退怎么办 美图手机闪屏怎么办 魅族m6相册闪退怎么办 美图m6工厂模式怎么办 美图m6手机死机怎么办 美图m6s开不了机怎么办 美图手机m6进水怎么办 美图t8摔黑屏怎么办 美图屏幕点不动怎么办 朗动钥匙丢了怎么办 深圳小汽车摇号中签了怎么办 深圳摇号审核通过后怎么办 京东过保修期了怎么办 买的商业预付卡怎么办 壹钱包预付卡金额不足怎么办 美发店换老板原来预付卡怎么办 超市预付卡现超市停业怎么办? 利群购物卡丢了怎么办 利群金卡丢了怎么办 坐飞机洗漱用品超过规定怎么办 请律师团了解后怎么办 三星s9开不了机怎么办 三星手机开不了机了怎么办 安卓手机音响进水了怎么办 音响不读u盘怎么办 虎牌水壶显示f2怎么办