16bit .com的任何最小示例都在Windows上使用Win32 API显示窗口GUI?
答案 0 :(得分:6)
Win16 - >的Win32 强>
可以使用CallProc32W
LoadLibraryEx32W()
加载Win32 DLL。GetProcAddress32W()
以获取DLL例程的地址。CallProc32W()
或CallProcEx32W
调用DLL例程。 Dos - >的Win32 强>
答案 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程序。这种方法有两个缺点:
它仅适用于386或更高的CPU,因为如果没有win32程序,你无法完全运行它。
您必须分发其他几个文件;至少:
DPMILD32.EXE
- PE二进制加载器(由EXE上的DOS存根自动调用)
DKRNL32.DLL
- 模仿KERNEL32.DLL
DUSER32.DLL
- 模拟USER32.DLL
如果您不能指望DPMI服务器已经处于活动状态(或者不知道这意味着什么),您最好还包括:
HDPMI.EXE
- DPMI服务器(如果尚未加载服务器,则由DPMILD32自动加载)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以自行传递给链接器。这种方法也有两大缺点:
您基本上必须编写两个不同的程序,但要小心它们可以共享源文件。
您需要生成一个MS-DOS可执行文件,这意味着您需要使用可以创建它们的工具,或者至少为汇编程序代码添加一些杂乱的样板文件。