Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> Linux 文章内容

进程启动命令行中注意带空格的参数-itarticl.cc-IT技术类文章记录&分享

发布时间: 9年前Linux 126人已围观返回

一般我们在一个exe里面启动另外一个exe使用 ShellExecute 命令函数:

比如下面的代码:

std::string strExePath="D:/MyExe.exe";

std::string strMyParas="D:/config.ini";

ShellExecute(NULL, _T("open"), strExePath.c_str(), strMyParas.c_str(), NULL, SW_SHOWNORMAL);


要启动的exe位于D盘的根目录下面,要传递的命令行参数为一个路径:

D:/config.ini

那么在MyExe.exe里面怎么获得传递过去的命令行参数呢,看下面的代码:


int argc=0;

LPWSTR *argv=::CommandLineToArgvW(::GetCommandLineW(),&argc);

if(argc>=2)

{

strIniPath=argv[1];

}

那么,我们从上面的代码可以得出,命令行参数为argc-1个,都放在argv这个数组中,其中 argv[0] 是程序本身的执行路径,所以argc>=1 .

我们通过argv[1]就可以获得第一个命令行参数,比如上面的代码,我们就获得了传递过来的命令行参数为D:/config.ini 。

但是,当我改变传递的命令行参数的内容为D:/Program Files/config.ini的时候

std::string strExePath="D:/MyExe.exe";

std::string strMyParas="D:/Program Files/config.ini";

ShellExecute(NULL, _T("open"), strExePath.c_str(), strMyParas.c_str(), NULL, SW_SHOWNORMAL);


我的MyExe.exe程序对命令行参数的解析出问题了,解析的结果为:D:/Program,而且argc=3,显然,程序把我的一个参数“D:/Program Files/config.ini”解析为两个参数:

argv[1]="D:/Program" , argv[2]="Files/config.ini" 了。

这是个比较严重的bug ,那么怎么告诉系统我传递的是一个带有空格的参数,而不是多个参数呢?

解决方法:

可以使用下面的代码:

wstring strExePath=wstring(L"/"");

strExePath.append(strExePath);

strExePath.append(wstring(L"/""));

wstring strMyParas=wstring(L"/"");

strMyParas.append(strMyParas);

strMyParas.append(wstring(L"//"));

strMyParas.append(wstring(L"/""));

ShellExecute(NULL, _T("open"), strExePath.c_str(), strMyParas.c_str(), NULL, SW_SHOWNORMAL);

将要传递的参数用"/"" 和 "/"" 给包起来,然后传递给ShellExecute就不会出现问题了。


linux shell 中对一个变量用引号包括起来也是这个意思,避免参数中出现空格,导致脚本失败,例如对一个字符串是否为空的判断里,如果不用引号包括就有可能出现把一个字符串当作多个字符串(以空格作分隔)的情况




发布时间: 9年前Linux126人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    125人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流