Использование рисунков из dll

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
CaptW
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 10.08.2004 (Вт) 9:34

Использование рисунков из dll

Сообщение CaptW » 10.08.2004 (Вт) 9:36

есть в виндовсе такой файл cards.dll, в нём лежат битмапы карт.
Вот как бы мне эти самые битмапы вытащить себе в прогу.
Для умников:Ресторатр и прочие не предлагать

Rouch
Новичок
Новичок
Аватара пользователя
 
Сообщения: 41
Зарегистрирован: 30.07.2004 (Пт) 7:26
Откуда: Немного отовсюду

Сообщение Rouch » 10.08.2004 (Вт) 10:19

Т.е. ты кочешь юзать картинки прямо из DLL?
Be all that you want be.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 10.08.2004 (Вт) 10:41

Ммм. Попробуй покопать апишку LoadImage(). Там если с флагами поиграться, кажется, можно вытянуть графику из ресурсной секции произвольного файла на диске...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Использование рисунков из dll

Сообщение tyomitch » 10.08.2004 (Вт) 11:30

CaptW писал(а):есть в виндовсе такой файл cards.dll, в нём лежат битмапы карт.
Вот как бы мне эти самые битмапы вытащить себе в прогу.
Для умников:Ресторатр и прочие не предлагать

1. В Win9x эта библиотека 16-битная, т.е. ничего путного ты с ней сделать не сможешь.
2. Если тебе нужны сами картинки, т.е. BMP-шки, то их много где можно скачать в Интернете. Например, в дистрибутиве Wine - там есть своя версия cards.dll
3. Можно не вытаскивать картинки в свою прогу, а сразу рисовать их средствами cards.dll. Подойдёт?

4. Если всё-таки решишь вытаскивать картинки из cards.dll, то LoadLibrary / LoadBitmap / FreeLibrary.

CaptW
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 10.08.2004 (Вт) 9:34

Сообщение CaptW » 10.08.2004 (Вт) 12:54

Rouch: да
Ennor: ок, попробую
tyomitch:90 уже устарели. Рисовать средствами кардс? там функция есть что ли? пойдёт.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2004 (Вт) 13:15

CaptW писал(а):tyomitch:90 уже устарели. Рисовать средствами кардс? там функция есть что ли? пойдёт.

Конечно, и не одна ;-) Ты думаешь, библиотеку ради одних картинок создали?

Декларации с комментариями: http://groups.google.com/groups?selm=4a ... put=gplain

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.08.2004 (Вт) 14:15

Тёмич, ты вредный и нехороший человек :)
Я тут, понимаешь, в дизасм с головой ушёл, а ты?
Нет уж, что сам сейчас нарыл, то и выложу! :twisted:

Код: Выделить всё
Option Explicit

Private Declare Function cdtInit Lib "C:\WINDOWS\system32\cards.dll" (ByRef width As Long, ByRef height As Long) As Long
Private Declare Sub cdtTerm Lib "C:\WINDOWS\system32\cards.dll" ()
Private Declare Function cdtDraw Lib "C:\WINDOWS\system32\cards.dll" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal CardNumber As Long, ByVal DrawWhat As cdtDrawWhat, ByVal BackColor As Long) As Long
Private Declare Function cdtDrawExt Lib "C:\WINDOWS\system32\cards.dll" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long, ByVal CardNumber As Long, ByVal DrawWhat As cdtDrawWhat, ByVal BackColor As Long) As Long

Private Enum cdtDrawWhat
  [Сама карта, как она есть]
  [Сама карта, на фоне указанного цвета]
  [Негатив карты]
  [Рубашка указанного цвета]
  [Прямоугольник указанного цвета размером с карту]
  [Рубашка указанного цвета, но темнее]
  [Рубашка с крестом]
  [Рубашка с кругом]
End Enum

Private Enum cdtSuits
  [Трефы]
  [Бубны]
  [Червы]
  [Пики]
End Enum

Private Enum cdtValues
  [Туз] = 1
  [Двойка]
  [Тройка]
  [Четвёрка]
  [Пятёрка]
  [Шестёрка]
  [Семёрка]
  [Восьмёрка]
  [Девятка]
  [Десятка]
  [Валет]
  [Дама]
  [Король]
End Enum

Private w As Long, h As Long

Private Sub Command1_Click()
  cdtDraw Me.hDC, 0, 0, GetCardNumber([Червы], [Дама]), [Сама карта, как она есть], 0
End Sub

Private Function GetCardNumber(ByVal Suit As cdtSuits, ByVal Value As cdtValues) As Long
  GetCardNumber = (Value - 1) * 4 + Suit
End Function

Private Sub Form_Load()
  cdtInit w, h
End Sub

Private Sub Form_Unload(Cancel As Integer)
  cdtTerm
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2004 (Вт) 16:21

GSerg писал(а):Тёмич, ты вредный и нехороший человек :)
Я тут, понимаешь, в дизасм с головой ушёл, а ты?
Нет уж, что сам сейчас нарыл, то и выложу! :twisted:

А у меня есть переходник-dll-ка, которая "внутри себя" 32-битная и вызывает 16- либо 32-битную cards.dll - смотря какая установлена в системе. Так что "смотрите, завидуйте" (с)
Код: Выделить всё
.NOLIST
.486
.MODEL FLAT, STDCALL
OPTION CASEMAP: NONE   
INCLUDE \masm32\include\windows.inc
INCLUDE \masm32\include\kernel32.inc
INCLUDELIB \masm32\lib\kernel32.lib
INCLUDE \masm32\include\wow32.inc
INCLUDELIB \masm32\lib\wow32.lib
INCLUDE \masm32\include\cards16.inc
INCLUDELIB \masm32\lib\cards16.lib
BREAK equ ;int 3
PUBLIC cdtInit, cdtTerm, cdtDraw

    .DATA?
hLib dd   ?
hLib16 dd   ?
QT_Thunk dd   ?
p_cdtInit dd   ?
p_cdtTerm dd   ?
p_cdtDraw dd   ?
p16_cdtInit dd   ?
p16_cdtTerm dd   ?
p16_cdtDraw dd   ?

    .CODE
CardsName db   "cards.dll", 0
KernelName db   "kernel32", 0
ThunkName db   "QT_Thunk", 0
f_cdtInit db   "cdtInit", 0
f_cdtTerm db   "cdtTerm", 0
f_cdtDraw db   "cdtDraw", 0

    .LIST

LibMain PROC hInstDll: DWORD, reason: DWORD, unused: DWORD
    push ebx
    cmp reason, DLL_PROCESS_DETACH
    je detach
    cmp reason, DLL_PROCESS_ATTACH
    jne success
    push offset CardsName
    call LoadLibrary
    or eax, eax
    jz _16bit
    mov hLib, eax
    xchg eax, ebx
    push offset f_cdtInit
    push ebx
    call GetProcAddress
    mov p_cdtInit, eax
    push offset f_cdtTerm
    push ebx
    call GetProcAddress
    mov p_cdtTerm, eax
    push offset f_cdtDraw
    push ebx
    call GetProcAddress
    mov p_cdtDraw, eax
    jmp success
_16bit:
    call GetLastError
    cmp eax, ERROR_DLL_NOT_FOUND
    je fail
    cmp eax, ERROR_GEN_FAILURE
    jne fail
    push offset KernelName
    call GetModuleHandle
    push offset ThunkName
    push eax
    call GetProcAddress
    mov QT_Thunk, eax
    push offset CardsName
    call LoadLibrary16
    or eax, eax
    jz fail
    mov hLib16, eax
    xchg eax, ebx
    push offset f_cdtInit
    push ebx
    call GetProcAddress16
    mov p16_cdtInit, eax
    push offset f_cdtTerm
    push ebx
    call GetProcAddress16
    mov p16_cdtTerm, eax
    push offset f_cdtDraw
    push ebx
    call GetProcAddress16
    mov p16_cdtDraw, eax
success:
    pop ebx
    mov eax, TRUE
    ret
fail:
    pop ebx
    xor eax, eax
    ret
detach:
    mov eax, hLib
    or eax, eax
    jz free16
    push eax
    call FreeLibrary
    jmp success
free16:
    mov eax, hLib16
    or eax, eax
    jz fail
    push eax
    call FreeLibrary16
    jmp success
LibMain ENDP

Proxy:
    push eax
    ret

;Private Declare Function cdtInit Lib "CARDS32.DLL" (nWidth As Long, nHeight As Long) As Long
cdtInit:
    mov eax, p_cdtInit
    or eax, eax
    jnz Proxy
    BREAK
    push ebp
    mov ebp, esp
    sub esp, 40h
    push ebx
    push 0
    push 32
    push GMEM_FIXED + GMEM_ZEROINIT + GMEM_SHARE
    call WOWGlobalAllocLock16
    xchg eax, ebx
    push 1
    push 32
    push ebx
    call WOWGetVDMPointerFix
    push esi
    xchg eax, esi
    push ebx
    add ebx, 4
    push ebx
    mov edx, p16_cdtInit
    call QT_Thunk
    push edi
    mov edi, [ebp + 8]
    movsd
    mov edi, [ebp + 0ch]
    movsd
    pop edi
    xchg eax, esi
    push ebx
    call WOWGlobalUnlockFree16
    xchg eax, esi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret 8

;Private Declare Function cdtTerm Lib "CARDS32.DLL" () As Long
cdtTerm:
    mov eax, p_cdtTerm
    or eax, eax
    jnz Proxy
    BREAK
    sub esp, 40h
    mov edx, p16_cdtTerm
    call QT_Thunk
    add esp, 40h
    ret

;Private Declare Function cdtDraw Lib "CARDS32.DLL" (ByVal hDC As Long, ByVal xOrg As Long, ByVal yOrg As Long, ByVal nCard As Long, ByVal nDraw As Long, ByVal nColor As Long) As Long
cdtDraw:
    mov eax, p_cdtDraw
    or eax, eax
    jnz Proxy
    BREAK
    push ebp
    mov ebp, esp
    sub esp, 40h
    push WOW_TYPE_HDC
    push dword ptr [ebp + 8]
    call WOWHandle16
    push ax
    push word ptr [ebp + 0ch]
    push word ptr [ebp + 10h]
    push word ptr [ebp + 14h]
    push word ptr [ebp + 18h]
    push dword ptr [ebp + 1ch]
    mov edx, p16_cdtDraw
    call QT_Thunk
    mov esp, ebp
    pop ebp
    ret 18h

END LibMain

А у тебя-то такого нету, бе-бе-бе :-P

Но если тебя даже и это не уязвит, то статья "how cards.dll works", по сути - комментарий к дизассемблированной dll-ке - написана неким Jonathan Wilson (jonwil_at_tpgi.com.au) ещё в Mon Jul 28 2003 - 06:53:12. Линк у меня не сохранился, только копия статьи на винте.
Т.е. даже и дизассемблировал ты зря. Вот такой я вредный и нехороший человек :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.08.2004 (Вт) 20:01

Я забыл указать копирайт на 32-в-16-битный переходник: Catch22 Productions, 2001. Перевод с Си на Асм - мой.
И ещё, любителям покопаться в дисассемблированных системных библиотеках. Исходники винды же уже спёрты, чего же усложнять себе жизнь? В частности, доступен полный исходник cards.dll на Си.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 179

    TopList