尝试使用 createprocess (API) 在 cmd throw c++ 上运行命令?
Posted
技术标签:
【中文标题】尝试使用 createprocess (API) 在 cmd throw c++ 上运行命令?【英文标题】:trying to run commend on cmd throw c++ using createprocces (API)? 【发布时间】:2016-04-01 12:28:50 【问题描述】:bool execute()
STARTUPINFO si;
PROCESS_INFORMATION pi;
bool flag = true;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
string f = "dir desktop"
if (CmdLine.parameter != "")
LPSTR l1 = const_cast<char *>(f.c_str());
CreateProcess(NULL, l1, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
flag = true;
// WaitForSingleObject(pi.hProcess, INFINITE);
// // Close process and thread handles.
// CloseHandle(pi.hProcess);
// CloseHandle(pi.hThread);
//
return flag;
我正在尝试通过 Visual Studio 运行 cmd 命令。 我正在使用 createprocces (API) 来运行这个东西 但我不明白为什么它不运行任何东西。
【问题讨论】:
为什么flag
在两个地方设置为true
,而从来没有设置为false
?
【参考方案1】:
dir
是cmd.exe
理解的命令,不是你可以执行的程序。
您可以尝试命令cmd /k "dir desktop"
,正确表示为 C++ 字符串。
例如,
auto execute()
-> bool
STARTUPINFO si = sizeof( si ) ;
PROCESS_INFORMATION pi = ;
string f = "cmd /k \"dir desktop\"\0";
bool const ok = !!CreateProcess( 0, &f[0], 0, 0, false, 0, 0, 0, &si, &pi );
if( !ok ) return false;
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return true;
注意对 ZeroMemory
的调用如何被 C++ 初始化所取代。
只要让编译器完成它的工作,您就可以获得更短、更清晰、更可能正确且同样高效(可能更多)的代码。双赢。
免责声明:代码未经编译器审查。
如果目的是列出用户桌面文件夹的内容,请注意dir desktop
不会这样做。作为命令解释器中的交互式命令,您可以使用dir %userprofile%\desktop
,这也可以通过 Windows 运行对话框工作。根据命令解释器对命令行参数的行为,它可能直接通过CreateProcess
工作,也可能不工作。
通常,在使用 Windows API 级别函数时,最好使用基于 wchar_t
的基于文本的函数,即在包含 <windows.h>
之前定义 UNICODE
(或显式使用 ...W
函数)。
【讨论】:
【参考方案2】:如果您在第一个参数设置为 NULL 的情况下调用 CreateProcess()
,那么您必须确保 l1
以要调用的模块名称开头。
由于dir
是命令处理器的内部命令而不是可执行文件,因此您必须使用cmd
作为模块名称并提供其余参数as cmd expects them。
所以尝试以下方法:
string f = "cmd /c=dir desktop";
【讨论】:
以上是关于尝试使用 createprocess (API) 在 cmd throw c++ 上运行命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何为两个单独的 CreateProcess() API 调用打开单独的命令提示符控制台
Win32 API 类似于 CreateProcess,但适用于 bat/cmd/等。 (即使用 PATHEXT)