解决CreateProcess 路径带空格问题

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

CStringGetCrrectInput(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);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值