通过 C++ 运行外部 .exe

Posted

技术标签:

【中文标题】通过 C++ 运行外部 .exe【英文标题】:run external .exe via c++ 【发布时间】:2017-10-04 05:42:25 【问题描述】:

我尝试做的是:通过另一个 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 完成它的工作)。编译没问题,但他从不运行.exe

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

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

最好的问候


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

不幸的是,还有一个额外的错误:

我的 CEA_schwing.exe 正在从同一目录读取文件“SINGLE_TP.inp”。这工作正常,我通过 Windows 资源管理器运行 die exe。

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

【问题讨论】:

【参考方案1】:

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

此外,您正在混合使用 ANSI 和 Unicode。您显然正在为 Unicode 编译,其中 CreateProcess() 映射到 CreateProcessW()std::string 包含 char 数据,所以 c_str() 返回一个 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,并且将接受来自c_str()const wchar_t * 指针(第二个参数不接受const指针)。

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

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);

【讨论】:

不客气。请参阅编辑以设置工作目录。 或者,您可以声明 wchar_t buf[MAX_PATH] 并将其用作第二个参数 - 不需要。只需执行CreateProcess(NULL, &rt[0], ...。还应该指出的是,不建议将前斜杠用作路径分隔符。 Windows 的有效路径分隔符是反斜杠,如果前斜杠有效,那么您很幸运,您使用的特定 API 恰好支持它们。 谢谢大家!对于我的问题,我现在正在使用 barmak Shemirani 的解决方案! @zett42:请注意 std::(w)string 的内部内容在 C++11 之前不能保证为空终止,因此 &rt[0] 可能会也可能不会能否正常工作,具体取决于您的 STL 的实现。在实践中,大多数实现通常是安全的,因为它们往往在内部以空值结尾,因此c_str() 可以按原样返回内部数据指针。但这在 C++11 之前也不能保证。所以,在使用&rt[0]时要小心

以上是关于通过 C++ 运行外部 .exe的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中运行外部可执行文件 (.exe)

exe 文件在 C++ 中不被识别为内部或外部命令、可运行程序或批处理文件

qt调用外部exe程序并且将exe程序一起打包

QT调用外部程序

运行外部 .exe 并从中接收返回值

使用Flash CS4运行外部exe