簡體   English   中英

如何使用CreateProcess執行簡單的命令行?

[英]How to execute a simple command line with CreateProcess?

我想執行一個簡單的命令行但不顯示窗口。 因此,據我所知,我不能使用System並且必須使用CreateProcess。 所以我有以下代碼例如:

//.../

CreateProcess(NULL,input,NULL,NULL,false,NORMAL_PRIORITY_CLASS | 
 CREATE_NO_WINDOW,NULL,NULL,&startInf,&procInf);//)

//.../

如果輸入是“ping www.google.com -n 2”這樣的行,它似乎有效。 我需要的是刪除功能。 因此,我嘗試了很多變化,如:

input = "rd /S /Q \"D:\\ALEX_DATEN\\PC\\C++\\bla\"";

  input = "rd /S /Q \"D:/DATEN/PC/C++/bla\"";

但沒有任何反應,函數返回失敗:/如果我把它寫成.bat文件(不使用“\\”轉義字符),刪除工作完美!

有誰知道我做錯了什么?

不,我不會寫一個破壞性的病毒..如果那是我的目標,我肯定會找到更簡單的方法......

某些系統命令如rddel和...不是實際的可執行映像(例如.exe文件),因此您無法使用CreateProcess執行/運行它們,它們是cmd已知的內置命令(Windows的命令解釋程序)所以你應該創建cmd並將命令傳遞給它:

wchar_t cmd[ MAX_PATH ];
size_t nSize = _countof(cmd);
_wgetenv_s( &nSize, cmd, L"COMSPEC" );
BOOL b = CreateProcessW( cmd, input, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startInf, &procInf );

注意:請參閱cmd參數,您必須使用/C來傳遞命令。 所以你的命令如下:

wchar_t input[] = L"some command";
wchar_t cmd[MAX_PATH] ;
// initialize cmd
wchar_t cmdline[ MAX_PATH + 50 ];
swprintf_s( cmdline, L"%s /c %s", cmd, input );
STARTUPINFOW startInf;
memset( &startInf, 0, sizeof startInf );
startInf.cb = sizeof(startInf);
// If you want to redirect result of command, set startInf.hStdOutput to a file
// or pipe handle that you can read it, otherwise we are done!
PROCESS_INFORMATION procInf;
memset( &procInf, 0, sizeof procInf );
BOOL b = CreateProcessW( NULL, cmdline, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &startInf, &procInf );
DWORD dwErr = 0;
if( b ) {
    // Wait till cmd do its job
    WaitForSingleObject( procInf.hProcess, INFINITE );
    // Check whether our command succeeded?
    GetExitCodeProcess( procInfo.hProcess, &dwErr );
    // Avoid memory leak by closing process handle
    CloseHandle( procInfo.hProcess );
} else {
    dwErr = GetLastError();
}
if( dwErr ) {
    // deal with error here
}

正如其他人所說, rd不能直接用CreateProcess()執行,你必須用/C rd ...作為命令行參數執行cmd.exe 不要像這樣使用CreateProcess() ,而應該使用SHFileOperation()代替:

SHFILEOPSTRUCT FileOp = {0};
FilOp.wFunc = FO_DELETE;
FileOp.pFrom = "D:\\ALEX_DATEN\\PC\\C++\\bla\0"; 
FileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI.

int ErrorCode = SHFileOperation(&FileOp);
if (ErrorCode == 0)
{
    if (FileOp.fAnyOperationsAborted)
        // not everything was deleted
    else
        // delete was successful
}
else
{
    // delete failed
    // note that ErrorCode might not be a Win32 error code,
    // so check the SHFileOperation() documentation for
    // possible alternatives
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM