运行 通过 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);
我尝试做的事情:通过另一个 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);