通过 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的主要内容,如果未能解决你的问题,请参考以下文章