Работа с cards.dll
Бродя по бескрайним строкам
кодов одного из западных серверов, я обнаружил описание вызова функций
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.
Вот и
все, пора писать карточные игры.
|