5

単純なコマンドラインを実行したいのですが、ウィンドウを表示させません。したがって、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 ファイルとして (「\」エスケープ文字を使用せずに) 記述した場合、削除は完全に機能します!

私が間違っていることを誰かが知っていますか?

Ps いいえ、私は破壊的なウイルスを書いているわけではありません..それが私のターゲットだった場合、私は間違いなくもっと簡単な方法を見つけたでしょう...

4

2 に答える 2

4

rd、および...などの一部のシステムコマンドは、実際の実行可能イメージ(.exeファイルなど)ではないため、 (Windowsのコマンドインタープリター)に認識されている組み込みコマンドをdel使用して実行/実行できないため、作成する必要がありますコマンドをそれに渡します:CreateProcesscmdcmd

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
}
于 2012-10-16T19:26:52.540 に答える
0

他の人が述べているように、直接rd実行することはできません。コマンドラインパラメータとしてで実行する必要があります。このように使用するのではなく、代わりに次を使用する必要があります。CreateProcess()cmd.exe/C rd ...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
}
于 2012-10-16T21:04:10.660 に答える