[TOC](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;
}

Q.E.D.