C++ Coder

HCP高性能计算架构,实现,编译器指令优化,算法优化, LLVM CLANG OpenCL CUDA OpenACC C++AMP OpenMP MPI

C++博客 首页 新随笔 联系 聚合 管理
  98 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
http://blog.csdn.net/tangaowen/article/details/6436053

                                           进程启动命令行中怎么传递带空格的参数

  

 一般我们在一个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就不会出现问题了。 


 


posted on 2012-10-18 15:50 jackdong 阅读(2013) 评论(0)  编辑 收藏 引用 所属分类: Windows编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理