调用 CreateProcess() 并获取字符串的返回值

Posted

技术标签:

【中文标题】调用 CreateProcess() 并获取字符串的返回值【英文标题】:Call CreateProcess() and get return value of a string 【发布时间】:2020-02-18 20:02:17 【问题描述】:

我有一个 C++ 应用程序,它调用一个用 C# 编写的 EXE,它获取一些信息,我想将它作为字符串传回给调用 C++ 应用程序。

所以我的问题是,“是否可以从使用 CreateProcess() 调用的 EXE 中获取字符串数据的返回值?

我希望我在这里没有违反任何“提问”礼仪。

【问题讨论】:

【参考方案1】:

如果 C# 应用程序将其数据输出到 STDOUT 或 STDERR,则 C++ 应用程序可以在调用 CreateProcess() 时通过重定向 STDOUT/STDERR 来捕获它。有关详细信息和示例,请参阅 MSDN 上的 Creating a Child Process with Redirected Input and Output。

【讨论】:

【参考方案2】:

不用担心,Jeff 是的,有一种方法可以通过 EXE 从一个到另一个获取数据。

您要做的是将 C# 应用程序中的输出写入标准输出。

Console.WriteLine("Your message here.");

基本上,如果您运行 C# 控制台应用程序并将数据打印到屏幕上,那么所有数据都可以在您的 C++ 应用程序中读取。

在您的 C++ 程序中,您需要从标准输入中读取数据。

它可能看起来像这样:

#include <iostream>
#include <string>

int main() 
    // Your code to run the application in a background process

    for (std::string line; std::getline(std::cin, line);) 
        std::cout << line << std::endl;
    

    return 0;

您打破的唯一规则是没有提供足够的细节或代码来更具体地了解解决方案。但是,如果您需要更多帮助,请提供更多详细信息。编码愉快!

如果您需要,这里是有关 c# 代码的更多信息的链接:https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.standardoutput

【讨论】:

【参考方案3】:

我看不到另一个进程如何返回字符串。进程不返回任何内容,它们只是运行。

您可以引用(或链接)某些 DLL 或 EXE,然后调用返回字符串的方法。但这将在您自己的进程中运行,而不是启动另一个进程。

请参阅:Calling C# .NET methods from unmanaged C/C++ code(代码项目)。

【讨论】:

“进程不返回任何内容,它们只是运行” - 不。进程在退出时会向操作系统返回状态码。 main 返回int 是有原因的。 操作系统需要int 返回码。如果您控制 .NET 部分,那么您将创建一个 DLL(即,类库),而不是 EXE。如果您无法控制,那么您将无法更改返回码,并且返回码对您来说只是一个副作用,而不是您期望的结果。但我们确实应该详细了解这个其他应用程序的作用。 @Oliver Jacot-Descombes C# 程序执行 WebResquests 并捕获响应,在这种情况下,它会检查许可证是否在我的网站上处于活动状态。如果它处于活动状态,它会将许可证信息发送到我的 C++ 应用程序,由它处理它,并确定它是否有效并应该启动。

以上是关于调用 CreateProcess() 并获取字符串的返回值的主要内容,如果未能解决你的问题,请参考以下文章

以管理员身份 CreateProcess 并获取其 ProcessInformation Like ProcessID

windows 下在进程中使用createprocess创建一个窗口进程,并获取这个窗口HWND句柄

在 CreateProcess 之后调用 GetModuleFileNameEx 时出现 ERROR_INVALID_HANDLE

使用 CreateProcess 调用 nvcc.exe

不直接使用字符串时CreateProcess@Unhandled异常

在 CreateProcess 之后修改 STARTUPINFO