通过C 运行外部.exe

run external .exe via c++

本文关键字:exe 外部 运行 通过      更新时间:2023-10-16

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

最好的问候


Hanks到Barmak Shemirani,该程序现在正在运行。

不幸的是还有一个其他错误:

我的cea_schwing.exe正在从同一目录中读取文件" single_tp.inp"。这是正常工作的Wenn,我通过Windows Explorer运行Die Exe。

但是,通过通过我的C 程序运行.EXE,他将无法再找到该文件了。有人知道为什么他不再收到文件吗?

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 Pointer)。

>

另外,您可以声明wchar_t buf[MAX_PATH]并将其用作CreateProcess()中的第二个参数,该参数类型为LPWSTR(non-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);