在dos中加载exe文件并从中调用函数

时间:2011-08-12 10:46:10

标签: c dos

我有一个程序(A),并且在同一个文件夹中有一个anather可执行文件(B)。我必须在我的程序(A)中调用这个花药程序(B)的功能。所有这一切都必须在dos中完成。我该怎么做或我应该读什么呢?请帮忙。

2 个答案:

答案 0 :(得分:1)

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

您需要开始了解基础知识&在某个地方开始, this 似乎是一个好地方。

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

答案 1 :(得分:0)

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

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

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

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