c# - 在 C++ 中使用 system() 来防止触发新进程的替代方法

标签 c# c++ dll

我遇到了一个供我使用的 C++ 程序,其中使用一些文件和 exe 完成了一些处理。在我的 C++ 程序中,我有一个像这样的片段

system(exe1 exe2 > TestFile1.txt  exe3 > TestFile2.txt)
system(exe2 exe3 > TestFile3.txt  exe3 > TestFile4.txt)
system(exe3 exe2 > TestFile5.txt  exe3 > TestFile6.txt)
system(exe4 exe1 > TestFile7.txt  exe3 > TestFile8.txt)

现在,我通过 P/Ivoke (Dllimport) 从这个 C++ 程序中生成了一个 .dll 用于我的 C# 应用程序,但是因为 C++ 有这些 system 正在使用,当我在我的 C# 程序中使用此 .dll 时,它会触发不同的进程和新的 cmd 窗口。

我想通过生成所有 exe(exe1、exe2、exe3 等)的 dll 并从这些 dll 中触发主要功能来摆脱这个问题,但我并没有想到我将如何做到这一点在 C++ 程序中?

我可以从 C++ 导出主函数(exe1 dll、exe2 dll、exe3 dll 等)并通过 C# P/Invoke 调用它,但我想要 C++ 的替代方案。替换上面的 4 行代码片段。怎么办?

最佳答案

您可以在不打开控制台窗口的情况下启动进程(包括那些以文本模式运行的进程)。请不要在细节上让我失望,因为自从我上次这样做以来已经很久了(在 Windows 上,我在 *nix 系统上定期这样做)。我可以告诉您的是,您必须查看函数 CreateProcessEx。您还必须重新实现 stdout 到这些文本文件的重定向。

我强烈建议不要将这些进程放入 DLL 中,因为那样它们会运行到您的主进程地址空间并且把事情搞砸(顺便说一句:您可以像加载 DLL 一样加载 EXE,但是调用它们的入口函数会阻塞你的主进程,所以不要这样做)。

关于c# - 在 C++ 中使用 system() 来防止触发新进程的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908948/

相关文章:

c# - 如何在 C# 中实现对数组执行的 "function"

c++ - 如何初始化一个类的引用成员变量?

c++ - 基于自动机的 re2 替代方案

c# - Mono/Ubuntu 上的 SQLite : DllNotFoundException SQLite. Interop.dll

vb.net - 两台不同计算机上的不同互操作引用不起作用

c# - 如何使用 Entity Framework 将静态数据植入数据库?

c# - 方法在每个请求中被调用 2 或 3 次 .NET MVC

C#/XNA 扩展设置实例属性

Qt 项目中的 C++ 语法

C# 将 DLL 限制为只有一个实例