如何获取被调用程序返回的退出值并存储在内部?

How to get the returned exit value of an invoked program to store it internally?

此问题与之前找到的问题相关

我可以在 runProgram() 函数中调用另一个可执行文件。但是,在此 runProgram() 函数之前 return 返回 main() 并关闭进程的句柄。我需要检索可执行文件 return 退出时的值...

这是我当前的申请:

#include <Windows.h>
#include <exception>
#include <stdio.h>
#include <tchar.h>
#include <cstdint>
#include <iostream>

uint32_t runProgram(LPCSTR lpApplicationName) {
    STARTUPINFOA si;
    PROCESS_INFORMATION pi;

    // Set the size of the structures
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    // Run the program
    CreateProcessA(
        lpApplicationName,  // the path
        NULL,               // Command line
        NULL,               // Process handle not inheritable
        NULL,               // Thread handle not inheritable
        FALSE,              // Set handle inheritance to FALSE
        CREATE_NEW_CONSOLE, // Opens file in seperate console
        NULL,               // Use parent's environment block
        NULL,               // Use parent's starting directory
        &si,                // Pointer to STARTUPINFO structure
        &pi                 // Pointer to PROCESS_INFORMATION structure
    );

    uint32_t error = GetLastError();

    if ( error != 0)
        std::cerr << error << "\n";

    // How to retrieve and store the result from the exiting program above...?
    uint32_t cache_size = 0;

    WaitForSingleObject(pi.hProcess, INFINITE);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return cache_size;
}

int main() {
    try {
        const uint32_t cache_size = runProgram("CacheQuerry.exe");
        std::cout << cache_size << '\n';
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << "\n\n";
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

我想将此可执行文件中的 return 值存储到 runProgram() 的局部变量中:cache_size.

这是调用程序中的 main.cpp:

#include "CacheQuerry.h"

int main() {
    int error = cache_info();
    if (error != 0)
        std::cout << error << '\n';
    else
        std::cout << '\n';
    std::cout << "l1d_cache_size = " << l1d_cache_size() << std::endl;
    std::cout << "cache line size = " << cache_line_size() << '\n';
    return l1d_cache_size();
}

被调用的程序将 return 程序退出时 l1d_cache_size() 产生的值。这是我要存储在 runProgram()cache_size 变量中的值。程序退出后如何得到这个return值呢?在 "CacheQuerry.h" 中找到的函数调用的实现在这里应该无关紧要,但如果您需要查看它的实现,请不要犹豫,尽管询问。这是同一解决方案中的两个独立项目。在它自己的项目中的第一个 main.cpp 依赖于它自己项目中的第二个 main.cpp。

您可以通过调用 GetExitCodeProcess (pi.hProcess) 来获取它,在等待句柄之后但在关闭它之前。

您需要的确切代码是:

DWORD exit_code;
BOOL ok = GetExitCodeProcess (pi.hProcess, &exit_code);

奇怪 CreateProcess 的备注部分根本没有提到这一点。