C++调用外部exe, 并传参获取返回值
调用exe
C++调用使用CreateProcess
函数调用外部exe传参并获取其执行结果。
CreateProcess函数原型
MSDN官方地址介绍
BOOL CreateProcess(
LPCWSTR pszImageName, // an exe file.
LPCWSTR pszCmdLine, // parameter for your exe file.
LPSECURITY_ATTRIBUTES psaProcess, //Process handle not inheritable.
LPSECURITY_ATTRIBUTES psaThread, // Thread handle not inheritable.
BOOL fInheritHandles, // Set handle inheritance.
DWORD fdwCreate,
LPVOID pvEnvironment,
LPWSTR pszCurDir,
LPSTARTUPINFOW psiStartInfo,
LPPROCESS_INFORMATION pProcInfo
);
CreateProcess示例
int32_t ZipFile(const std::string& fileName, const std::string& target)
{
DWORD dwExitCode = -1;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//所要执行的命令
std::string cmdLine = std::string("7z a -tzip ") + target + " " + fileName;
wchar_t msg[1000] = { 0 };
wcscpy_s(msg, wcslen(StringToWstring(cmdLine).c_str())+1 , StringToWstring(cmdLine).c_str());
// Start the child process.创建子进程
if (!CreateProcess(L"7z.exe", // an exe file.
msg, // parameter for your exe file.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
// 传null默认为使用父目录启动子进程,如要改变子进程运行目录可以传相应路径
&si, // Pointer to STARTUPINFO structure.
&pi) // Pointer to PROCESS_INFORMATION structure.
)
{
return MYRESULT::CREATE_PROCESS_ERROR;
}
// Wait until child process exits. 等待子进程执行结束返回
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
if (0 != dwExitCode)return MYRESULT::ZIP_FILE_ERROR;
return MYRESULT::SECCESS;
}