通过c ++运行外部.exe

时间:2017-10-04 05:42:25

标签: c++ winapi createprocess

我试图做的事情:通过另一个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,他再也找不到该文件了。有谁知道为什么他不再拿到文件了?

1 个答案:

答案 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, ...);