Могут ли 16-битные исполняемые файлы .com вызывать Win32 API? - PullRequest
3 голосов
/ 28 января 2010

Какой-нибудь минимальный пример 16-битного .com отображения оконного графического интерфейса с использованием Win32 API в Windows?

Ответы [ 3 ]

6 голосов
/ 28 января 2010

Win16 -> Win32

Это можно сделать с помощью CallProc32W

  • Вызовите LoadLibraryEx32W(), чтобы загрузить Win32 DLL.
  • Вызовите GetProcAddress32W(), чтобы получить адрес подпрограммы DLL.
  • Вызовите подпрограмму DLL, используя CallProc32W() или CallProcEx32W.

Пример кода

Концепция

Dos -> Win32

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

4 голосов
/ 28 января 2010

Мультиплексное прерывание (прерывание 0x2f) может использоваться для доступа к различным функциональным возможностям Windows из сеанса DOS в Windows, но оно дает доступ только к выбранному количеству возможностей; насколько я знаю, нет никакого способа использовать произвольный вызов API.

1 голос
/ 01 июля 2010

Это не сработает. Предполагая, что ваша цель состоит в том, чтобы создать программу, которая может работать либо в простой DOS, либо в Windows, у вас есть несколько вариантов:

Самый простой вариант - использовать расширитель DOS HX , который позволяет запускать приложения, используя большое подмножество Win32 API под DOS. По сути, вы просто создадите приложение win32 как обычно, а затем запустите инструмент PEstub на исполняемом файле, чтобы он мог работать под DOS. PEstub работает, заменяя заглушку DOS на ту, которая вызывает HX для загрузки и запуска вашей программы win32. У этого подхода есть два недостатка:

  1. Он работает только с процессором 386 или выше, так как без него невозможно запустить программу win32.

  2. Вы должны будете распространять несколько дополнительных файлов; как минимум:

    • DPMILD32.EXE - двоичный загрузчик PE (автоматически вызывается заглушкой DOS на вашем EXE)

    • DKRNL32.DLL - эмулирует KERNEL32.DLL

    • DUSER32.DLL - эмулирует USER32.DLL

    Если вы не можете рассчитывать на то, что сервер DPMI уже активен (или не знаете, что это значит), вам лучше включить:

    • HDPMI.EXE - Сервер DPMI (автоматически загружается DPMILD32, если сервер еще не загружен)

Заглушка DOS в исполняемом файле win32 - это та часть, которая обычно выводит сообщение в виде строки: «Ха-ха, сосунок, вы не можете запустить эту программу в своем маленьком DOS! Попробуйте вместо этого Windows 95!» когда вы запускаете программу Windows в DOS. Это не должно делать это, хотя; это может быть любой исполняемый файл MS-DOS в формате MZ: я видел самораспаковывающиеся zip-архивы, которые использовали его для извлечения в DOS, но с графическим интерфейсом в системах win32.

Это приводит нас к другому варианту: вы можете написать как приложение win32, так и его заглушку DOS, и указать компоновщику использовать вашу заглушку вместо стандартной. Например, если вы используете MSVC для создания приложения win32, вы должны использовать опцию link.exe / STUB . Я предполагаю, что вы можете выяснить, как создать MS-DOS .exe для самостоятельной передачи компоновщику. Этот подход также имеет два больших недостатка:

  1. По сути, вам нужно написать две разные программы, хотя с осторожностью они могут обмениваться исходными файлами.

  2. Вам необходимо создать исполняемый файл MS-DOS, что означает, что вам нужно либо использовать инструмент, который может их создать, либо хотя бы добавить какой-нибудь грязный шаблон к вашему коду ассемблера.

...