问题背景
在项目中,我们需要在window系统中对磁盘进行一系列操作,包括创建磁盘,分配盘符,以及格式化磁盘。为了提高效率,采用以子进程方式调用format命令对磁盘进程格式化操作。
但是在编码调试过程中,format命令一直执行失败,但在控制台输入同样参数,执行去成功。
示例代码如下:
char cmd[]= "format /?";
ret = CreateProcessA(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
if ( ret )
{
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
else
{
//错误码为2
printf("createprocess error :%d...\n",::GetLastError());
}
分析过程
通过获取错误码得知,系统给出的错误码为2,其含义如下:
2 (0x2)
The system cannot find the file specified.
ERROR_PATH_NOT_FOUND
因此CreateProcess参数中,当lpApplicationName为NULL时,lpCommandLine对于系统命令时,我们可以不要给出完整的路径以及后缀,如果没有后缀,系统默认后缀为.exe。查找路径包括window下的system目录以及当前目录。
通过给出的错误信息得知,系统在当前system目录下并未找到format.exe的可执行文件。通过在system目录下查找,发现format命令并不像其他命令一样,以.exe为后缀。其完整命令名称为format.com
解决方法
在传递给createprocess命令行参数中,给出format命令的完整命令format.com,即可解决该问题。虽然问题比较简单,当却比较少见,希望给以大家借鉴,减少类似问题。
char cmd[]= "format.com /?";
ret = CreateProcessA(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
if ( ret )
{
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
else
{
printf("createprocess error :%d...\n",::GetLastError());
}