16位.com可执行文件可以调用win32 API吗?

时间:2010-01-28 04:07:16

标签: api winapi com dos

16bit .com的任何最小示例都在Windows上使用Win32 API显示窗口GUI?

3 个答案:

答案 0 :(得分:6)

Win16 - >的Win32

可以使用CallProc32W

完成此操作
  • 调用LoadLibraryEx32W()加载Win32 DLL。
  • 调用GetProcAddress32W()以获取DLL例程的地址。
  • 使用CallProc32W()CallProcEx32W调用DLL例程。

Code Example

Concept

Dos - >的Win32

http://www.ragestorm.net/tutorial?id=27

答案 1 :(得分:4)

Multiplex Interrupt(中断0x2f)可用于从Windows中的DOS会话访问各种Windows功能,但它只能访问选定数量的功能;据我所知,没有办法通过它使用任意API调用。

答案 2 :(得分:1)

那不行。假设你的目标是创建一个可以在普通DOS或Windows中运行的程序,你有几个选择:

最简单的选择是使用DOS扩展程序HX,它允许您使用DOS下的大部分Win32 API运行应用程序。基本上,您只需像往常一样创建一个win32应用程序,然后在可执行文件上运行PEstub工具以允许它在DOS下运行。 PEstub通过将DOS存根替换为调用HX来加载和运行win32程序。这种方法有两个缺点:

  1. 它仅适用于386或更高的CPU,因为如果没有win32程序,你无法完全运行它。

  2. 您必须分发其他几个文件;至少:

    • DPMILD32.EXE - PE二进制加载器(由EXE上的DOS存根自动调用)

    • DKRNL32.DLL - 模仿KERNEL32.DLL

    • DUSER32.DLL - 模拟USER32.DLL

    如果您不能指望DPMI服务器已经处于活动状态(或者不知道这意味着什么),您最好还包括:

    • HDPMI.EXE - DPMI服务器(如果尚未加载服务器,则由DPMILD32自动加载)
  3. win32可执行文件中的DOS存根通常会打印出一条消息“Haha,sucker,你不能在你的小DOS中运行这个程序!试试Windows 95吧!”当你在DOS下运行Windows程序时。但是,它不必这样做;它可以是你喜欢的任何MZ格式的MS-DOS可执行文件:我见过自解压zip压缩文件,用于在DOS上提取,但在win32系统上提供GUI。

    这引出了另一个选择:您可以自己编写win32应用程序及其DOS存根,并指示链接器使用您的存根而不是默认存根。例如,如果您使用MSVC构建win32应用程序,则可以使用link.exe的/STUB option。我假设您可以弄清楚如何生成MS-DOS .exe以自行传递给链接器。这种方法也有两大缺点:

    1. 您基本上必须编写两个不同的程序,但要小心它们可以共享源文件。

    2. 您需要生成一个MS-DOS可执行文件,这意味着您需要使用可以创建它们的工具,或者至少为汇编程序代码添加一些杂乱的样板文件。