天天看点

解决format命令以子进程方式执行报错问题

问题背景

在项目中,我们需要在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

解决format命令以子进程方式执行报错问题

解决方法

在传递给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());
}