【问题标题】:Load exe file and call function from them in dos在dos中加载exe文件并从中调用函数
【发布时间】:2011-08-12 19:38:04
【问题描述】:

我有一个程序(A),并且在同一个文件夹中有另一个可执行文件(B)。我必须在我的程序(A)中从这个另一个程序(B)调用函数。而这一切都必须在dos中完成。我该怎么做或者我应该读什么来做到这一点?请帮忙。

【问题讨论】:

  • 哪一个?微软DOS?博士-DOS? VxWorks?
  • 你确定是DOS吗?
  • 它应该可以在 MS-DOS 下工作。
  • 您真正想通过调用链接到另一个 EXE 的函数来做什么?

标签: c dos


【解决方案1】:

如果你的两个程序是单独的可执行文件,那么很可能会在两个不同的进程中运行,你不能只在两个不同的进程之间调用函数,你需要使用一些进程间通信机制。

您需要开始了解基础知识并从某个地方开始,this 似乎是这样做的好地方。

既然你提到DOS作为目标平台,DOS是一个非抢占单用户单处理环境,但DOS环境中的TSR仍然模拟多处理现象。要在 DOS 中实现 IPC,您必须安排 TSR 接收软件中断,然后通过它与之通信。

【讨论】:

  • 我应该使用第二个可执行文件作为 dll 或类似 dll
  • @Nerses:检查更新后的答案,通读链接,如果您仍有问题,请回来询问,我们很乐意回答您的具体问题。
  • MS-DOS 不是唯一可能的 IPC 在单个活动进程和 TSR 之间吗?
  • 谢谢。我不知道它将如何在 ms-dos 中工作。由于 MS-DOS 不是多任务操作系统。
【解决方案2】:

MS-Dos 是一个 16 位操作系统。在 MS-Dos 中运行的可执行文件有两种形式:“.exe”和“.com”。将“.com”视为具有许多操作系统假定的默认值的“.exe”。 “.exe”文件包含一个头文件,操作系统读取该文件头以确定各种参数。这些参数之一是入口点地址。仅定义了一个入口点地址(对于“.com”,它始终为 cs:0x100),这是加载程序时操作系统跳转到的地址。

MS-Dos 具有加载另一个可执行文件并运行它的功能,但它只能从标题中给出的地址运行。没有导出其他函数地址,因此您不能只调用其他可执行文件中的任意函数。 MS-Dos中没有DLL系统。

因此,为了在第二个可执行文件中调用一些任意函数,您需要创建自己的 DLL 样式系统。这不是微不足道的,因为操作系统使用分段内存模型,也就是说,内存被划分为 64k 页,地址是由添加到偏移量的段地址形成的,例如段*16 + 偏移量。因此,有 2^12 种方式来表示相同的物理地址。在加载过程中,MS-Dos 必须修正这些段值以反映程序已加载到的内存中的实际位置。请记住,在 MS-Dos 中没有虚拟内存。如果您要创建自己的 DLL 系统,则需要自己修复大于 64k 的代码(小于 64k 的代码+数据可以忽略段并将所有地址视为仅 16 位偏移量)。

如果您知道地址,使用 MS-Dos API 加载“.exe”仍然很棘手,因为您需要知道可执行文件已加载到的 CS(代码段)地址。

【讨论】:

  • 谢谢。你的回答真好。它对我帮助很大,但这些信息对我解决问题的作用不大。
  • @Nerses:我试图给出的答案是:在 MS-Dos 中做到这一点真的非常非常困难。还有其他方法可以使用吗?也许使用命令行(例如 b.exe 函数名 param1 param2)?
  • 必须以编程方式执行第一个 exe 必须使用第二个 exe 中的函数。
  • @Nerses:也许你可以更详细地了解这个问题。第二个“.exe”是否包含状态信息?您对应用程序的源代码有任何控制权吗?为什么要使用第二个“.exe”?为什么不能将两个“.exe”合并为一个“.exe”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2020-11-25
相关资源
最近更新 更多