Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86945
  • 博文数量: 38
  • 博客积分: 350
  • 博客等级: 一等列兵
  • 技术积分: 365
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-30 09:14
个人简介

每一种技术都有其诱人之处。

文章分类

全部博文(38)

文章存档

2016年(2)

2014年(23)

2011年(13)

我的朋友

分类: C/C++

2011-10-20 20:07:25

  解决CreateProcess 路径带空格问题
分类: 编程技术 594人阅读 评论(1)  举报

当需要生成子进程的时候,需要用CreateProcess,第一个参数指定EXE所在完整路径,其实这个路径有空格和没空格都没什么问题, 第二个参数是传入的参数列表,参数之间是用空格隔开的,如果其中一个参数中有空格,像"c://program  file//cmd.exe"这样,传进去的参数列表,会出现如下,argv[0] = "c://progeam"  argv[1] = "file//cmd.exe" ,不是我们想要的,其实可以这样:

 CString GetCrrectInput(const CString  & szInput)
 {
       // 为了解决传入参数中有空格的问题
        CString szDest   = szInput;      

      // 判断是否有空格
       if(szDest.Find(' ') < 0)
       {
            // 没有空格
            return szDest;
       }  

       // 有空格,用转义符处理

       CString szSpaceFormat = _T("/"%s/"");

       szDest.Format(szSpaceFormat,szInput);
       return szDest;
}

 

// 用法如下

void CreateChildProcess()

{

     STARTUPINFO sInfo;
     PROCESS_INFORMATION pInfo;

     SECURITY_ATTRIBUTES security;
     security.bInheritHandle = TRUE;
     security.lpSecurityDescriptor = NULL;
     security.nLength = sizeof(SECURITY_ATTRIBUTES);

     ZeroMemory(&sInfo, sizeof STARTUPINFO);
     ZeroMemory(&pInfo, sizeof PROCESS_INFORMATION);

     sInfo.cb = sizeof(STARTUPINFO);

     // 传入的参数有空格的

     CString   szCmd  = _T("c://program  files//cmd.exe");

     CString   szCmdData = GetCrrectInput(szCmd  );
     LPWSTR lpwCmd = (LPWSTR)szCmdData.GetString();
     // 获取EXE全路径
     CString szApplicationName   = GetFullFileName();
     BOOL bRetVal = CreateProcess(szApplicationName,  lpwCmd, NULL, NULL,
         FALSE,NORMAL_PRIORITY_CLASS, NULL, NULL, &sInfo, &pInfo);
    if(!bRetVal)
    {
          CLog::LogMessage(LOG_LEVEL_INFO,TRUE,_T(" CreateProcess failed (%d) "),GetLastError());
          return;
    }

    // 等待子进程结束
    ::WaitForSingleObject(pInfo.hProcess,   INFINITE);
    // 关闭子进程句柄
    CloseHandle(pInfo.hProcess);
    CloseHandle(pInfo.hThread);

}

阅读(3722) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~