为什么“这个程序不能在DOS模式下运行”文件存在于.dll文件中?

最近我在编译一个本地C ++ DLL项目时,打开了一个由Visual Studio 9生成的.dll文件,并惊讶地发现“这个程序不能在DOS模式下运行”文本。

为什么在.dll文件中有这个文本?

一个DLL非常像一个具有不同扩展名的可执行文件。 你看到的文本是Windows标准的可执行头的一部分。 它被用来正常放弃从DOS运行Windows可执行文件的尝试。

可移植可执行格式规范声明如下:

MS-DOS存根(stub)是在MS-DOS下运行的有效应用程序。 它被放置在EXE图像的前面。 链接器在这里放置一个默认存根,当图像在MS-DOS中运行时,打印出“这个程序不能在DOS模式下运行”消息。 用户可以使用/ STUB链接器选项指定一个不同的存根。

在位置0x3c处,存根具有到PE签名的文件偏移。 这些信息使Windows能够正确执行映像文件,即使它有一个MS-DOS存根。 链接期间,此文件偏移位于0x3c位置。

从DOS模式运行的Win32程序(即单用户,无图形)打印该文本。 如果您尝试在没有运行Windows的情况下使用它们,DLL也可能会打印该消息。