无法将命令行传递给 CreateProcess 创建的新 exe
Unable to pass command line to new exe created by CreateProcess
我现在正尝试从用 C++ 编写的应用程序中调用 .exe
我尝试调用的 exe 是一个 Kermit 程序 (k95.exe) - 一个文件传输应用程序。
在不使用 C++ 的情况下,我可以在 Kermit 程序中输入命令并且它有效。
但是,现在我正在尝试使用 CreateProcess()
在我的应用程序中调用这个 'Kermit' 程序。
在这个阶段,我可以成功调用'Kermit'程序。
Kermit 应用程序能够成功启动。
现在,我们想通过我的 C++ 应用程序将 "Take connect.txt" 键入控制台,但我们不知道如何继续。
我知道我们可以传递命令 CreateProcess()
,有点像传递函数参数,但我不打算立即关闭这个 Kermit 程序。
在此期间,我可能仍想将其用于其他操作,例如下载或上传文件。
我们无法完成上述所有操作,因为 CreateProcess()
没有 return window 句柄。
备注
上面使用的"Take"是k95.exe
的命令之一
这是我的 CreateProcess 函数所在位置:
bool LaunchKermitExe( const char path, char cmdLine)
{
STARTUPINFO si;
SECURITY_ATTRIBUTES saProcess, saThread;
PROCESS_INFORMATION piProcess;
bool bSuccess;
DWORD lasterr;
// setup STARTUPINFO struct
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
// make new process handle inheritable
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = TRUE;
// make the new thread handle not inheritable
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = FALSE;
bSuccess = CreateProcess(path, cmdLine, NULL, NULL,TRUE,
0, NULL, NULL, &si, &piProcess);
lasterr = GetLastError();
// now close handles to detach the process
CloseHandle(piProcess.hThread);
CloseHandle(piProcess.hProcess);
return bSuccess;
}
所以您需要做的是写入该进程的标准输入。我对 windows CreateProcess api 不熟悉,因此您需要自己查看一下。 This example on 显示了几个示例,其中读取了一个文件并将其填充到被调用进程的标准输入中。做这种事情没有简单的方法,所以准备学习很多关于管道的知识吧!
Kermit 应用显然有自己的用户输入命令处理器。您必须在创建进程时重定向其 STDIN,以便您可以根据需要向其写入自己的数据。 MSDN 中有一段对此进行了详细描述:
我现在正尝试从用 C++ 编写的应用程序中调用 .exe 我尝试调用的 exe 是一个 Kermit 程序 (k95.exe) - 一个文件传输应用程序。
在不使用 C++ 的情况下,我可以在 Kermit 程序中输入命令并且它有效。
CreateProcess()
在我的应用程序中调用这个 'Kermit' 程序。
在这个阶段,我可以成功调用'Kermit'程序。 Kermit 应用程序能够成功启动。
现在,我们想通过我的 C++ 应用程序将 "Take connect.txt" 键入控制台,但我们不知道如何继续。
我知道我们可以传递命令 CreateProcess()
,有点像传递函数参数,但我不打算立即关闭这个 Kermit 程序。
在此期间,我可能仍想将其用于其他操作,例如下载或上传文件。
我们无法完成上述所有操作,因为 CreateProcess()
没有 return window 句柄。
备注
-
上面使用的
"Take"是k95.exe
的命令之一
这是我的 CreateProcess 函数所在位置:
bool LaunchKermitExe( const char path, char cmdLine) { STARTUPINFO si; SECURITY_ATTRIBUTES saProcess, saThread; PROCESS_INFORMATION piProcess; bool bSuccess; DWORD lasterr; // setup STARTUPINFO struct ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); // make new process handle inheritable saProcess.nLength = sizeof(saProcess); saProcess.lpSecurityDescriptor = NULL; saProcess.bInheritHandle = TRUE; // make the new thread handle not inheritable saThread.nLength = sizeof(saThread); saThread.lpSecurityDescriptor = NULL; saThread.bInheritHandle = FALSE; bSuccess = CreateProcess(path, cmdLine, NULL, NULL,TRUE, 0, NULL, NULL, &si, &piProcess); lasterr = GetLastError(); // now close handles to detach the process CloseHandle(piProcess.hThread); CloseHandle(piProcess.hProcess); return bSuccess; }
所以您需要做的是写入该进程的标准输入。我对 windows CreateProcess api 不熟悉,因此您需要自己查看一下。 This example on 显示了几个示例,其中读取了一个文件并将其填充到被调用进程的标准输入中。做这种事情没有简单的方法,所以准备学习很多关于管道的知识吧!
Kermit 应用显然有自己的用户输入命令处理器。您必须在创建进程时重定向其 STDIN,以便您可以根据需要向其写入自己的数据。 MSDN 中有一段对此进行了详细描述: