Работа с cards.dll

Tower

Бродя по бескрайним строкам кодов одного из западных серверов, я обнаружил описание вызова функций cards.dll. Эта DLL содержит в себе работу с колодой карт, которую мы можем обнаружить на практически любом компьютере при установленных пасьянсах. Вызов функций был простой и по этой причине я решил поэкспериментировать с dll. иже приведены определения вызова функций.

Declare Function CdtInit Lib "CARDS.DLL" (nWidth As Integer, nHeight As Integer) As Integer
Declare Function CdtDraw Lib "CARDS.DLL" (ByVal hDC As Integer, ByVal xOrg As Integer, ByVal yOrg As Integer, ByVal nCard As Integer, ByVal nDraw As Integer, ByVal nColor&) As Integer
Declare Function CdtDrawExt Lib "CARDS.DLL" (ByVal hDC As Integer, ByVal xOrg As Integer, ByVal yOrg As _ Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal nCard As Integer, ByVal nDraw As Integer, ByVal nColor&) As Integer
Declare Function CdtTerm Lib "CARDS.DLL" () As Integer

К моему удивлению, я обнаружил, что программа не работает, хотя, судя по отзывам, все должно быть нормально. Программа ругалась на то, что таких функций не существует. Пришлось воспользоваться программой Dependency Walker, которая дала удивительное открытие: функции переименованы. Оказывается, что в состав NT и Windows 2000 входит уже 32 разрядная dll, в отличие от 16 разрядной, которая шла вплоть до Windows 98. Переправить название dll оказалось простым делом и все должно было начать работать, но… Но не начало. Вторым изменением, которое произошло в Windows 2000 - определение параметров вызова функций. В результате изучения вызовов функций, была произведена корректировка, которая заставила простенькую программку работать. Читайте правильное определение функций 32 разрядной cards.dll.


Declare Function cdtInit Lib "CARDS.DLL" (nWidth As Integer, nHeight As Integer) As Integer
Declare Function cdtDraw Lib "CARDS.DLL" (ByVal hDC As Long, ByVal xOrg As Long, ByVal yOrg As Long, ByVal nCard As Integer, ByVal nDraw As Integer, ByVal nColor&) As Integer
Declare Function cdtDrawExt Lib "CARDS.DLL" (ByVal hDC As Long, ByVal xOrg As Long, ByVal yOrg As Long, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal nCard As Integer, ByVal nDraw As Integer, ByVal nColor&) As Integer
Declare Function cdtTerm Lib "CARDS.DLL" () As Integer


Это было об определениях, а теперь немного о самих функциях и работе с ними. Используются следующие константы.

Тип начертания карты
Global Const C_FACES = 0 - лицом
Global Const C_BACKS = 1
- обложкой
Global Const C_INVERT = 2
- инвертированное изображение (например, при выделении в игре "Свободная ячейка").

Номера карт меняются по порядку от 0 до 51 в порядке возрастания и по мастям: крести, бубни, черви, трефы. Для того, чтобы задать обложку карты, необходимо установить Начертание карты в 1, а карту задать одним из следующих значений.


Global Const crosshatch = 53
Global Const weave1 = 54
Global Const weave2 = 55
Global Const robot = 56
Global Const flowers = 57
Global Const vine1 = 58
Global Const vine2 = 59
Global Const fish1 = 60
Global Const fish2 = 61
Global Const shells = 62
Global Const castle = 63
Global Const island = 64
Global Const cardhand = 65
Global Const UNUSED = 66
Global Const THE_X = 67
Global Const THE_O = 68


Теперь переходим к описанию функций.

Declare Function cdtInit Lib "CARDS.DLL" (nWidth As Integer, nHeight As Integer) As Integer

Инициализирует работу dll и должна быть вызвана перед ее началом. В переменные nWidth и nHeight пишется размер карты.

Declare Function cdtTerm Lib "CARDS.DLL" () As Integer

Освобождает dll. Вызывать желательно и эту функцию.

Declare Function cdtDraw Lib "CARDS.DLL" (ByVal hDC As Long, ByVal xOrg As Long, ByVal yOrg As Long, ByVal nCard As Integer, ByVal nDraw As Integer, ByVal nColor&) As Integer

Собственно и рисует карту. Параметры:

hDC - указатель на окно, где рисовать карту.
xOrg и yOrg - координаты верхнего левого угла карты.
nCard - номер карты по порядку
nDraw - начертание карты
nColor& - цвет карты в шестнадцатеричном исчислении.

Declare Function cdtDrawExt Lib "CARDS.DLL" (ByVal hDC As Long, ByVal xOrg As Long, ByVal yOrg As Long, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal nCard As Integer, ByVal nDraw As Integer, ByVal nColor&) As Integer

Отличается от cdtDraw только возможностью задать размеры карты в параметрах nWidth и nHeight.

Вот и все, пора писать карточные игры.

 

В начало

Назад

Copyright ©, 2000 - 2001 'Азбука Технологий Программирования'. Все права защищены