运行 通过 C++ 的外部 .exe

run external .exe via c++

我尝试做的事情:通过另一个 C++ 程序在 windows 上启动一个外部 .exe 文件(从 fortran 编译)

我试过很多不同的版本,比如:

system("C:/IPSE_temp/CEA_schwing.exe");

编译没问题,但是当我执行文件时,他错过了一些库,例如 RUND32.dll...

然后我尝试在不同的变体中使用这种代码 (CreateProcess)

std::string rt = "C:/IPSE_temp/CEA_schwing.exe";

STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;

if (CreateProcess(NULL, (LPWSTR) rt.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);)
    {
    WaitForSingleObject(processInfo.hProcess, INFINITE);
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
    }

因为我也想知道,当程序完成时(程序应该等到外部 .exe 完成它的工作)。编译没问题,但他从来没有 运行s .exe

希望我在描述中没有遗漏任何内容,期待您的帮助。提前致谢

是的,我是 C++ 编程的新手 ;)

此致


感谢 Barmak Shemirani,程序现在 运行ning。

不幸的是还有一个错误:

我的 CEA_schwing.exe 正在从同一目录读取文件 "SINGLE_TP.inp"。通过 windows 资源管理器,我 运行 die exe 运行良好。

但是通过 运行 通过我的 c++ 程序运行 .exe,他无法再找到该文件。有谁知道为什么他再也收不到文件了?

rt.c_str()应该是CreateProcess()中的第一个参数。

此外,您正在混合使用 ANSI 和 Unicode。您显然是针对 Unicode 进行编译,其中 CreateProcess() 映射到 CreateProcessW()std::string 包含 char 数据,因此 c_str() returns 一个 const char * 指针,但 CreateProcessW() 需要一个 wchar_t* 指针。使用 (LPWSTR)rt.c_str() 进行转换只会隐藏编译器错误,但它不会解决您在需要 Unicode 数据的地方传递 ANSI 数据的实际问题。

声明 Unicode 字符串时使用宽字符串(注意 L 前缀):

std::wstring rt = L"C:/IPSE_temp/CEA_schwing.exe";
if (CreateProcess(rt.c_str(), NULL, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
...

之所以可行,是因为 rt.c_str() 现在与 CreateProcess() 的第一个参数兼容,后者是一个 LPCWSTR 并且将接受来自 [=19= 的 const wchar_t * 指针](第二个参数不接受 const 指针)。

或者,您可以声明 wchar_t buf[MAX_PATH] 并将其用作 CreateProcess() 中的第二个参数,其类型为 LPWSTR(非常量):

wchar_t buf[MAX_PATH];
wcscpy_s(buf, L"C:/IPSE_temp/CEA_schwing.exe");
CreateProcess(0, buf, ...);

也可以在第8个参数中设置工作目录:

wchar_t buf[MAX_PATH];
wcscpy_s(buf, L"C:\IPSE_temp\CEA_schwing.exe");

std::wstring dir = L"C:\IPSE_temp";
CreateProcess(0, buf, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, dir.c_str(), &si, &pi);