天天看點

解決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());
}