我想执行一个简单的命令行但不显示窗口。因此,据我所知,我不能使用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文件(不使用" \"转义字符),删除工作就完美了!
有谁知道我做错了什么?
P.S。不,我没有写一个破坏性的病毒..如果那是我的目标,我肯定会找到更简单的方法......
答案 0 :(得分:4)
某些系统命令如rd
,del
和...不是实际的可执行映像(例如.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
}
答案 1 :(得分: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
}