我试图做的事情:通过另一个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 ++编程的新手;)
最好的问候
向巴马克·谢米拉尼致敬,该计划正在进行中。
不幸的是还有一个错误:
我的CEA_schwing.exe正在从同一目录中读取文件“SINGLE_TP.inp”。这工作正常,我通过Windows资源管理器运行die exe。
但是通过我的c ++程序运行.exe,他再也找不到该文件了。有谁知道为什么他不再拿到文件了?
答案 0 :(得分:4)
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
并且会接受来自const wchar_t *
的{{1}}指针(第二个参数不接受c_str()
指针)。
或者,您可以声明const
并将其用作wchar_t buf[MAX_PATH]
中的第二个参数,其类型为CreateProcess()
(非常量):
LPWSTR
您还可以在第8个参数中设置工作目录:
wchar_t buf[MAX_PATH];
wcscpy_s(buf, L"C:/IPSE_temp/CEA_schwing.exe");
CreateProcess(0, buf, ...);