問題背景
在項目中,我們需要在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());
}