【发布时间】:2015-12-31 18:59:55
【问题描述】:
我正在尝试创建一个向 cmd.exe 发送命令并接收错误 2 的进程, 为什么?有可能吗?怎么样?
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
String pathexe = "C:\Windows\system32\cmd.exe";
String command= "notepad.exe";
if(!CreateProcess(
pathexe.c_str(), // lpApplicationName
command.c_str(), // lpCommandLine
NULL, // lpProcessAttributes
NULL, // lpThreadAttributes
FALSE, // bInheritHandles
0, // dwCreationFlags
NULL, // lpEnvironment
NULL, // lpCurrentDirectory
&si, // lpStartupInfo
&pi // lpProcessInformation
))
{
AnsiString error = GetLastError();
ShowMessage("Error: " + error);
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
PD:1)假设您可以为此目的使用CreateProcess(),我不应该使用ShellExecute()或system()。 2)我在论坛上看过,找不到解决这个错误的办法,类似问题有很多答案但没有解决错误,建议其他功能,或与路由命令混合使用。 3)我不认为该问题允许,因为我在清单时构建。 4) 我目前使用 C++ Builder,在 win7 中,32 位但不重要。 5)我猜这个问题将被投票为否定和重复(像往常一样),但建议的测试示例也会收到错误。 谢谢大家
初步结论:
错误2:系统找不到指定的文件。
链接功能:https://msdn.microsoft.com/es-es/library/windows/desktop/ms679360(v=vs.85).aspx 链接错误:https://msdn.microsoft.com/es-es/library/windows/desktop/ms681382(v=vs.85).aspx
出现错误 2:检查语法、文件路径和存在。
作品:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
String command = "notepad.exe";
if(!CreateProcess(
NULL, // lpApplicationName
commmand.c_str(), // lpCommandLine
NULL, // lpProcessAttributes
NULL, // lpThreadAttributes
FALSE, // bInheritHandles
0, // dwCreationFlags
NULL, // lpEnvironment
NULL, // lpCurrentDirectory
&si, // lpStartupInfo
&pi // lpProcessInformation
))
{
AnsiString error = GetLastError();
ShowMessage("Error: " + error);
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
这个例子也适用于 exe
String command = "cd C:\\sample\\calc.exe";
但是没有 cmd 的通用命令,必须有一种方法可以将命令发送到 cmd 为:
notepad.exe && cd C:\sample\ && sample1.txt
感谢大家
【问题讨论】:
-
你知道
GetLastError返回一个整数值,而不是一个字符串? -
你确定吗?如果我尝试获取 GetLastError() 的 int,ShowMessage() 上不会显示错误,但如果我尝试 AnsiString 显示 2...
-
点击指向 MSDN 参考的链接。它返回一个
DWORD。如果您尝试在字符串文字和整数之间使用+(例如在"Error: " + 2中),那么您就是在进行指针运算。 -
"C:\Windows\system32\cmd.exe"应该是"C:\\Windows\\system32\\cmd.exe"。 -
通过命令解释器 cmd.exe 执行 notepad.exe 很尴尬。我假设 cmd.exe 期望其可执行映像 (
"C:\\Windows\\system32\\cmd.exe") 的路径作为命令行上的第一个参数。您正在传递"notepad.exe"。如果您同时提供应用程序名称和命令行,请将应用程序名称作为第一个参数复制到命令行,并正确引用它。或者干脆省略应用程序名称,只传递命令行。
标签: c++ winapi command createprocess c++builder-xe