Шаг 23 - Win16 и Win32

Эти два набора API появились в следствие развития операционной системы Windows и отражают переход от 16 разрядной операционной системы к 32 разрядной.

Windows 3.1    16 разрядов Win16 API
Windows 95     32 разряда Win 32 API

Если представить полную картину, то WIN API в количестве модификаций больше. Нельзя говорить о полной совместимости WIN32 API для WIN 95, WIN NT и 32 разрядного расширения WINDOWS 3.1 32s. Я бы сказал, что существуют три 32 разрядных API очень близких, но имеющих некоторые различия. Ну например, я сталкивался с проблемой, что один и тот же код работает в WIN95 и не работает в NT и связано это с тем, что для NT обязательно надо обнулить структуру для данной операции.

Естественно, что есть отличия Win16 и Win32. Давайте посмотрим.

Типы данных при переходе к 32 разрядам типы данных естественно меняются. Например, тип INT становится 32 разрядным. То есть имеет длину 32 бита.

NEAR и FAR типы указателей. Они теперь не нужны, так как память линейная и любой указатель может добраться до любой ячейки памяти.

Вызов API функций. Их вызовы тоже изменились. Когда Вы пользуетесь каркасной библиотекой типа MFC или OWL это не всегда заметно, так как различия максимально скрываются при программировании на чистом C это видно. Например, ко многим функциям прибавлено расширение Ext, которое говорит о том, что вызывается функций WIN 32, так как для совместимости со старыми приложениями необходимо оставить вызов фунции как он был для 16 разрядов. Вот пример.

	WIN16			WIN32
ScaleWindowExt 		ScaleWindowExtEx 
SetBitmapDimension 	SetBitmapDimensionEx

Одновременно в связи с новыми возможностями операционной системы была реализована поддержка потоковой многозадачности, созданы новые элементы интерфейса.

Следствием перехода на 32 разпрядный код явилось то, что не стало возможно легко совмещать код 16 и 32. Ну и что скажете Вы ? Будем писать только на 32. Так-то оно так, только компьютеризация началась не вчера и до нас было написано много, в том числе и под Win16 всяких DLL. И наверно, часть из них уже без исходного кода. Что прикажите делать ??? Этим вопросом естественно заинтересовались и в Microsoft, наверно потому, что сами его и создали :-))))

Давайте внимательнее посмотрим на различия в адресации. Адрес в Win32 формируется как 0:32, то есть есть только смещение, в то время как в Win16 адрес формируется как 16:16, то есть сегмент:смещение. Механизм преобразования адресов должен быть по факту.

При передаче данных существует проблема с округлением и восстановлением INT. Но и это не все, так как данные могут возвращаться через стек и стек должен быть корректно очищен. Хотя дело еще хуже, так как 16 разрядный код для этого пользуется регистрами SS:SP, в то время как 32 регистрами SS:ESP. Ну даже так вкратце понятно, что вопрос не тривиальный. Так как решать его надо было, то выработали метод, который называется thunk. Этот механизм используется для каждого вызова кода разной разрядности. Для данного вида работ был выпущен thunk компилятор.

Ну, давайте делайте выводы. WIN API для разных платформ не является совершенно одинаковым. Второе, что никто не запрещает использовать DLL 16 bit в приложениях 32.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 07.08.2000