解决CreateProcess 路径带空格问题
2011-02-21 19:30
453 查看
当需要生成子进程的时候,需要用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);
}
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);
}
相关文章推荐
- java实现数据库备份和恢复源码---解决路径带空格引发的问题
- 解决路径名中不能有空格的问题
- 包含空格的项目的文件/路径部分需要用括号 问题解决方案
- 解决nginx在windows环境下location中root路径空格问题
- 解决https证书导入路径有空格问题
- 解决IIS出现包含空格的项目的文件/路径部分需要用括号括起来的问题
- Java中解决访问地址中包含空格和中文路径的问题
- 批处理路径有空格问题解决方法
- ◎解决RUN的路径里有空格的问题
- 解决路径名中不能有空格的问题
- VC中关于路径中含有空格问题的解决办法
- java获取classpath文件路径空格转变成了转义字符%20的问题解决 !
- 解决RUN的路径里有空格的问题
- C#关联程序的文件路径中存在空格的问题解决
- 解决Vue打包之后文件路径出错的问题
- 解决D7下TStringList.Delimiter分离空格问题
- Android Studio 配置模拟器AVD存放路径(默认在c盘,解决c盘空间不够问题)
- springmvc web国际化i18n解决资源文件路径问题
- eclipse配置虚拟路径后,每次启动tomcat都会虚拟路径失效的问题解决
- 织梦DedeCMS启用二级域名图片路径错误问题的解决办法