【问题标题】:Execute a C program from within another C program as if it was a function call (in Windows)?从另一个 C 程序中执行一个 C 程序,就好像它是一个函数调用(在 Windows 中)?
【发布时间】:2020-10-20 05:05:45
【问题描述】:

是否可以在 C 程序中调用单独的 C 程序(.exe 文件),就像它是一个函数一样?

我希望能够将任何类型的参数(与任何其他函数一样)传递给这个单独的程序,并获得返回值(以便它可以在宿主程序中使用)。

我想可以使用int argc, char *argv[]传递参数,但不知道是否可以传递整数、数组、指向结构的指针等等。

另一方面,我了解到主函数的返回值是系统特定的。由于我使用的是 Windows,所以这个返回值(类型、大小等)是否有任何限制?它可以是任何可以用作任何普通函数的返回值的东西吗?

谢谢!

【问题讨论】:

  • 所以基本上你需要在这里学习三件事。 1)如何调用外部程序。 2)如何获取该程序的返回码。 3) 理解命令行参数。一次拿一个。
  • 您可以从 C 程序执行()另一个 .exe 并通过 argc、argv 传递参数。这不是调用另一个 C 函数,而是调用整个程序。您可以使用 .dll 文件并在运行时动态链接它们。猜猜我们需要知道你想在这里完成什么。
  • 这种在运行时链接 dll 文件的想法听起来是解决我问题的更好方法。谢谢你的想法
  • 我只是想知道我是否能够像处理函数一样处理不同的 C 程序。了解所有输入和输出后,您无需在编译后更改它们,只需在“主机”程序中“连接”它们即可。

标签: c function parameter-passing return-value


【解决方案1】:

你所描述的,是Unix操作系统的基本前提。 Unix 旨在通过链接多个命令来完成非常复杂的任务,将命令的(文本)输出作为下一个命令的输入进行管道传输(这在当时是相当革命性的)。

正如 klutt 已经建议的那样,您可以使用 Windows 可执行文件完成相同的操作。在他的列表中,我将添加学习如何redirect the input/output of a program to a file handle

Windows PowerShell 扩展了这一概念,允许将 different data-types(而非文本)传递给一些称为 cmdlets 的特殊可执行文件,但是,要编写自己的可执行文件,您需要 .Net Framework 或 .Net Core 基础架构的支持,因此您必须使用托管语言(例如 C# 或 C++/CLI)执行此操作。

请记住,生成整个进程是一项极其昂贵的操作(与简单地调用链接函数相比),因此您需要注意一些重大开销。

【讨论】:

  • 感谢 BlueStrat。它似乎比我想象的要复杂。正如您所说,它看起来是一个缓慢的操作,因为您每次调用它们时都需要生成完整的进程。也许值得在运行时研究这个 DLL 动态链接?我还是不确定。
  • 不客气@Marcos。 DLL 链接确实非常灵活。它们有两个主要目的,您可以进行后期代码绑定,也就是说,在需要之前您不会将代码实际加载到内存中;并且您可以实现库的简单文件交换版本控制 - 如果您保持版本之间的公共接口稳定。此外,您还可以通过接收您想要的任何数据类型。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2012-02-25
  • 2011-01-08
相关资源
最近更新 更多