处理两个可执行文件之间通信的正确方法是什么?

问题描述 投票:0回答:1

我已经编写了自己的编程语言和自托管编译器。我目前正在为编译器后端创建 ide,并且正在努力使编译器与 ide 一起工作。

IDE 并不是一个大窗口,在客户端空间中带有一个文本编辑器。我有一个菜单栏、一个工具栏、一个文件窗口、一个在选项卡式窗口中打开新文件的文本编辑器和一个输出窗口。我什至有一个下拉菜单,显示命令行上的内容。

我目前正在使用 LPCWSTR exePath 在按下运行按钮时运行编译器可执行文件,但应用程序之间没有进行通信。我可以在 Visual Studio 输出中看到我的编译器 .exe 正在运行,但我还没有实现任何从编译器获取所需信息到 IDE 的功能。

这样做的正确方法是什么?使用.dll 是唯一的方法吗?我在网上搜索了很多,甚至还找到了 Charles Petzold 的大书,但似乎没有人真正深入探讨这个主题。此时,代码太长,无法提供一个最小的示例,因此我更感兴趣的是如何正确处理应用程序之间的通信的深入解释。

问题1 在 ide 之前,我正在使用 printf 测试编译器输出,以在控制台中获取调试和输出信息,但现在它已经发展了,我需要将这些信息获取到 ide,所以 Windows 方式,在输出窗口或新的控制台窗口。我该如何正确地做到这一点?不确定我是否可以在编译器本身中使用 Windows 函数,或者反之亦然,很确定在大多数情况下你不能像 printf 那样进入 Windows 代码?

我的想法是创建一个经常使用的函数的 .dll,然后重写一些编译器以使用这些函数而不是 printf 进行输出和调试,然后从 ide 按名称调用这些新的 .dll 函数,以检索信息。有更好的方法来处理这个问题吗?请原谅我,这就是我问的原因。

问题2 我可能想得太多了,但是当我按下运行按钮时,如何让编译器 .exe 在创建并在自己的选项卡式窗口中打开的文件上运行其程序?默认情况下,ide本身是命令行上的第一个参数或数组中的零,当按下运行按钮时,编译器是命令行上的下一个参数,即1或创建的另一个命令行,并将其放置在0 ?那么所有文件都需要放入辅助命令行才能提供给编译器 .exe 吗? 之前,只需将需要编译和调试的文件提供给编译器的单个 .exe 就很容易了,但现在涉及另一个程序,这似乎有点棘手。

我以前尝试过使用.dll,但我想我可能没有完全理解它,不得不删除它,因为它没有提供我想要的结果。这可能是由于缺乏对应用程序之间连接的全面了解,这就是我现在问的原因。

c windows winapi compiler-construction ide
1个回答
0
投票

通常的方法是通过命令行和标准输出。

在命令行上指定子进程的参数,并将 STARTUPINFO 参数传递给 CreateProcess,在 dwFlags 中设置 STARTF_USESTDHANDLES 并根据需要设置 hStdOutput 和 hStdError 句柄。

在子流程中,使用这些句柄写入父流程所需的任何信息。

当子进程完成时,使用这些句柄来读取进程写入的任何内容。

这假设通常的非交互式编译器进程,您只需将其设置为运行,它就会工作然后返回,而不需要用户输入。

© www.soinside.com 2019 - 2024. All rights reserved.