我是靠谱客的博主 虚拟铃铛,最近开发中收集的这篇文章主要介绍GetCommandLine 分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

程序的 abc.exe

三个参数 1 2 3


1. 通过CreateProcess()调用

BOOL bRet = CreateProcess(
sCmd,
sParam,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi);

(1)如果sCmd = "D:testabc.exe", sParam = "1 2 3"则在abc.exe程序中通过GetCommandLine()得到字串 "1 2 3"

(2)如果sCmd = "D:testabc.exe",sParam = "D:testabc.exe 1 2 3"则在abc.exe程序中通过GetCommandLine()得到字串 "D:testabc.exe 1 2 3"

(3)如果sCmd = "D:testabc.exe", sParam = ""D:testabc.exe" 1 2 3"则在abc.exe程序中通过GetCommandLine()得到字串 ""D:testabc.exe" 1 2 3"

总结:在使用CreateProcess()调用程序时

(1).在子进程中通过GetCommandLine()得到的命令行结果跟调用时传入的sParam完全一致。

(2).方式(2)和(3)效果其实是一样的,对进程全路径文件名是否单独加引号,Windows都兼容。只是程序在使用这个参数时,要做脱引号处理。

(3).标准做法是采用方式(3),这样既可以兼容执行程序路径中包含的空格,也可以和ShellExecute()调用保持一致。


2. 通过ShellExecute()调用

(1)ShellExecute(NULL, "open", "D:testabc.exe", "1 2 3", "", SW_HIDE);

结果则在abc.exe程序中通过GetCommandLine()得到的字串为""D:testabc.exe" 1 2 3", 

即命令行中包含有进程名,并且程名有单独的引号引起,程序在使用该参数时要做脱引号处理。

(2)ShellExecute(NULL, "open", "D:testabc.exe", "D:\test\abc.exe 1 2 3", "", SW_HIDE);

结果则在abc.exe程序中通过GetCommandLine()得到的字串为 ""D:testabc.exe"  D:testabc.exe 1 2 3", ----- 这种调用是错误的

(3)ShellExecute(NULL, "open", "D:testabc.exe", ""D:\test\abc.exe" 1 2 3", "", SW_HIDE);

结果则在abc.exe程序中通过GetCommandLine()得到的字串为 ""D:testabc.exe" "D:testabc.exe" 1 2 3", ----- 这种调用是错误的

总结:在使用ShellExecute()调用程序时

(1).命令就是命令,参数就是参数,参数中不需要再次包含执行程序名。

(2).在子进程中通过GetCommandLine()得到的命令行参数中,总会包含有进程全路径文件名,并且是被单独引号引起的,用到时需要做脱引号处理。

(3).在子进程中通过GetCommandLine()得到的命令行参数结果ShellExecute()的第五个参数lpDirectory没任何关系,调用时永远默认置空字串即可。

(4).ShellExecuteEx()与ShellExecute()的情况一样。


3. 通过abc.exe的快捷方式启动,则在abc.exe程序中通过GetCommandLine()得到字串 ""D:testabc.exe" 1 2 3", 注意进程名有引号


总结:在CMD命令行里面调用时,不管是否对进程名加引号,在程序里面获取到的结果,进程名都会有单独的引号引起的。


4. 通过CMD命令行调用

(1)输入  D:testabc.exe  1 2 3,  则在abc.exe程序中通过GetCommandLine() 得到字串 ""D:testabc.exe" 1 2 3", 注意进程名单独有引号

(2)输入 "D:testabc.exe" 1 2 3,  在abc.exe程序中通过GetCommandLine() 得到字串 ""D:testabc.exe" 1 2 3", 注意进程名单独有引号

可见:调用时无论对进程全路径文件名是否加引号, 结果是一样, 得到的参数中进程名都有单独的引号引起的。


特别注意:

对于路径中包含空格的情况, 则调用时必须加引号, 如 "C:Program Filesabc.exe" 1 2 3




最后

以上就是虚拟铃铛为你收集整理的GetCommandLine 分析的全部内容,希望文章能够帮你解决GetCommandLine 分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部