C语言怎么同时调用多个EXE?
不知道你介不介意用(匿名)管道的方式来实现,通过它的转向功能,可以很容易得到调用程序的输出,并可进行交互。msdn中CreatePipe 函数提供了这方面的例子。还有一个例子,当年写bcb插件ddkbuild编译驱动程序时写的:
void __fastcall BuildAndMessage(AnsiString PathToBuild/*=NULL*/, AnsiString Set/*=NULL*/)
{
AnsiString CommandStr = MakeCommandStr(PathToBuild, Set);
//ShowMessage(CommandStr);
// 读管道
HANDLE hChildStdinWr/*父进程写*/, hChildStdinRd/*子进程读*/;
// 写管道
HANDLE hChildStdoutWr/*子进程写*/, hChildStdoutRd/*父进程读*/;
SECURITY_ATTRIBUTES sa;
_di_IOTAMessageServices MessageServices;
_di_IOTAMessageGroup MessageGroup;
if (BorlandIDEServices->Supports(MessageServices))
{
MessageServices->ClearToolMessages(NULL);
MessageGroup = MessageServices->AddMessageGroup("Ddkbuild");
MessageServices->ShowMessageView(MessageGroup);
}
else
{
ShowMessage("Create ddkbuild messageview failed");
return;
}
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
// 创建子进程写管道
if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &sa, 0))
{
ShowMessage("Create Stdout pipe failed");
return;
}
SetHandleInformation(hChildStdoutRd, HANDLE_FLAG_INHERIT, 0); // 该句柄子进程没用到,故取消继承性
// 创建子进程读管道
if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &sa,0))
{
ShowMessage("Create StdinRd pipe failed");
return;
}
SetHandleInformation(hChildStdinWr, HANDLE_FLAG_INHERIT, 0); // 该句柄子进程没用到,故取消继承性
//SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr);
//SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd);
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdInput = hChildStdinRd; // 重定向子进程输入
si.hStdOutput = hChildStdoutWr; // 重定向子进程输出
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
// 注意使用了true,这样创建子进程时,父进程的所有可继承的句柄就可以被继承下来了
// 我们也可以使用SetHandleInformation使句柄不可被继承,这样子进程就无法使用了
// 这样的例子可以看《Creating a Child Process with Redirected Input and Output.doc》
if (!CreateProcess(NULL, CommandStr.c_str(), NULL, NULL, true, 0, NULL, NULL, &si, &pi))
{
ShowMessage("Create process failed");
return;
}
// 将数据写入子进程,这里只是演示,本程序不需要写入
const char *strIn = " ";
DWORD dwBytes = 0;
WriteFile(hChildStdinWr, strIn, strlen(strIn), &dwBytes, NULL);
CloseHandle(hChildStdinWr); // 保证对端的ReadFile可返回
// 调用ReadFile前须关闭,否则因写管道写入端有未关闭的Write句柄,ReadFile最后无法返回0
CloseHandle(hChildStdoutWr);
// 从子进程中读出执行结果,不处理mbcs,需要的朋友请加上前导字符的判断
char strData[MAX_PATH * 2];
AnsiString MessageComplete, MessageCut;
char* pos;
char lf = '\n';
void* Unused = 0;
while (ReadFile(hChildStdoutRd, strData, sizeof(strData), &dwBytes, NULL))
{
strData[dwBytes] = 0;
if (pos = strrchr(strData, lf)) // 如果有换行,则显示
{
*(pos-1) = 0;
pos++;
MessageComplete = MessageCut + strData;
MessageCut = pos;
MessageServices->AddToolMessage(
"", MessageComplete, "Ddkbuild", 0, 0, NULL, Unused, MessageGroup);
}
else // 否则暂存
MessageCut = MessageCut + strData;
Application->ProcessMessages();
}
MessageServices->AddToolMessage(
"", MessageCut, "Ddkbuild", 0, 0, NULL, Unused, MessageGroup);
// 关闭句柄
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(hChildStdinRd);
CloseHandle(hChildStdoutRd);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}