Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: А ТЫ маньяк?
Да, я маньяк 10 40.00%
Нет, я маньяк 5 20.00%
Эй вы, не спорьте! Я маньяк 10 40.00%
Голосовавшие: 25. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2012, 08:02   #21
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

текст самого проигрывателя
Код:
.586
.model tiny,stdcall
;for WinXP - 1546 bytes
include windows.inc
exebase equ 400000h
MENU_FILE            equ 0
MENU_CD              equ 1
MENU_VIDEODISK       equ 2
MENU_VIDEOPLAYER     equ 3
MENU_FULLSCREEN      equ 4
MENU_ABOUT           equ 5
   
.code
main:
include capito.asm
;---------------------------------------------------------
start:	xchg ebx,eax
	sub esp,124
	mov pBuffer+exebase,esp;указатель на временный буфер под имя файла
        invoke MCIWndCreate,ebx,\ ;идентификатор родитеьского окна
			exebase, \ ;идентификатор приложения
        WS_VISIBLE or WS_OVERLAPPEDWINDOW or MCIWNDF_NOMENU,\;стиль 
	offset MediaFileName+exebase;имя устройства или путь к файлу
        mov mcihWnd+exebase,eax
;-параметры для SetWindowLong----------------------------
	push offset WndProc+exebase
	push GWL_WNDPROC
	push eax;mcihWnd 
;-параметры для GetSystemMenu----------------------------
	push ebx;FALSE
	push eax;mcihWnd  
;-параметры для DragAcceptFiles--------------------------
	push TRUE
	push eax;mcihWnd
        invoke DragAcceptFiles
;-----------------------------------------------
        invoke GetSystemMenu
        xchg edi,eax	; в edi handleMenu
	xor esi,esi	; в esi идентификаторы меню и номер строчки в меню
        push offset szAbout+exebase
        push offset szFullScreen+exebase
        push offset szVideoPlayer+exebase
        push offset szVideoDisk+exebase
	push offset szCD+exebase
	push offset szFile+exebase
@@:	push esi	; дописываю новые пункты в системное меню
	push MF_BYPOSITION
	push esi
	push edi
        invoke InsertMenu
	inc esi
	cmp esi,5
	jna @b	
        invoke SetWindowLong
        mov prevWindow+exebase,eax
	mov ebp,esp	; в регистре ebp адрес структуры msg
;---------------------------+
; entering the message loop |
;---------------------------+
message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
	invoke DispatchMessage,ebp
	jmp message_loop
;----------------------+
; the window procedure |
;----------------------+
WndProc proc
hWnd	equ dword ptr [ebp+8]
uMsg	equ dword ptr [ebp+12]
wParam	equ dword ptr [ebp+16]
lParam	equ dword ptr [ebp+20]
	push ebp
	mov ebp,esp
	xor ebx,ebx
	mov esi,offset SendMessage+exebase 
	mov eax,uMsg
	mov edi,hWnd
	dec eax
	dec eax		; cmp dword ptr [esp+08],WM_DESTROY
	je wmDESTROY
	sub eax,WM_CLOSE-WM_DESTROY
	je short wmCLOSE
	sub eax,WM_SYSCOMMAND-WM_CLOSE
        je short wmSYSCOMMAND
	sub eax,WM_DROPFILES-WM_SYSCOMMAND
	je wmDROPFILES
	sub eax,MM_MCINOTIFY-WM_DROPFILES
	jne default 
mmMCINOTIFY:invoke ShowWindow,edi,SW_MINIMIZE or SW_SHOWNORMAL
	push ebx; FALSE
	push MCIWNDF_NOMENU
	push MCIWNDM_CHANGESTYLES
	push edi;hWnd
        call dword ptr [esi];SendMessage
	push offset szStop+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi;hWnd
        call dword ptr [esi];SendMessage
	jmp default
wmCLOSE:push offset szStop+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi;hWnd
	call dword ptr [esi];SendMessage
	push offset szClose+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi	;hWnd
        call dword ptr [esi];SendMessage 
	invoke DestroyWindow,edi
	jmp default
wmSYSCOMMAND:mov eax,wParam
	cmp eax,MENU_ABOUT
	ja default
	jmp dword ptr [handle+eax*4+exebase]
wmDROPFILES: invoke DragQueryFile,wParam,ebx,pBuffer+exebase,124
        invoke DragFinish,wParam
	jmp a1
mnuFILE:mov edx,pBuffer+exebase
	mov [edx],ebx	; ноль в начало буфера для названия файла
;заполняю OPENFILENAME
	push ebx;lpTemplateName
	push ebx;lpfnHook
	push ebx;lCustData
	push ebx;lpstrDefExt
	push ebx;nFileOffset
	push OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
	push ebx;lpstrTitle
	push ebx;lpstrInitialDir
	push ebx;nMaxFileTitle
	push ebx;lpstrFileTitle
	push 124;nMaxFile
	push edx;lpstrFile
	push ebx;nFilterIndex
	push ebx;nMaxCustFilter
	push ebx;lpstrCustomFilter
	push offset LoadFileFilter+exebase;lpstrFilter
	push exebase	;hInstance
	push edi;hwndOwner
	push sizeof(OPENFILENAME);lStructSize
;----------------------------------------------------
	push esp;адрес OPENFILENAME
        invoke GetOpenFileName
	test eax,eax
	jz wmCLOSE	; если не выбран никакой файл
        movzx edx,word ptr [esp+OPENFILENAME.nFileExtension]
        add edx,[esp+OPENFILENAME.lpstrFile];offset LoadFileBuffer+exebase
	add esp,4Ch; удаляю OPENFILENAME
        mov eax,[edx]	; в регисре еах расширение файла
        or eax,202020h	; приводим к нижнему регистру
        cmp eax,"adc"
	jnz a1
mnuCD:  push offset cdaudioDev+exebase
	jmp @f
mnuVIDEODISK: push offset videodiscDev+exebase
	jmp @f;wmBYE
mnuVIDEOPLAYER: push offset szVideoPlayer+exebase
@@:	invoke lstrcpy,pBuffer+exebase
Mikl___ вне форума Ответить с цитированием
Старый 15.10.2012, 08:03   #22
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Код:
a1:	push offset szStop+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi;hWnd
        call dword ptr [esi];SendMessage
	push pBuffer+exebase
	push ebx
	push MCIWNDM_OPEN
	push edi;hWnd
        call dword ptr [esi];SendMessage
        test eax,eax
	jnz NoMedia	; .if eax = 0
	push offset szPlay+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi;hWnd
        call dword ptr [esi];SendMessage
        test eax,eax
	jnz NoMedia	; .if eax = 0
        invoke ShowWindow,edi,SW_SHOWNORMAL
	push ebx
	push MCIWNDF_NOPLAYBAR
	push MCIWNDM_CHANGESTYLES
	push edi;hWnd
        call dword ptr [esi];SendMessage
	push 100
	push ebx
	push MCIWNDM_SETZOOM
	push edi;hWnd
        call dword ptr [esi];SendMessage
	push TRUE
	pop flag_fullscreen+exebase
        jmp @f
NoMedia:mov flag_fullscreen+exebase,ebx;FALSE
	push offset szClose+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi;hWnd
        call dword ptr [esi];SendMessage
	push MCIWNDF_NOPLAYBAR
	push MCIWNDF_NOPLAYBAR
	push MCIWNDM_CHANGESTYLES
	push edi;hWnd
        call dword ptr [esi];SendMessage
@@:     invoke DragAcceptFiles,mcihWnd+exebase,TRUE
	jmp default
mnuFULLSCREEN:invoke ShowWindow,edi,SW_SHOWNORMAL
	push offset szPlayfullscreen+exebase
	push ebx
	push MCIWNDM_SENDSTRING
	push edi;hWnd
        call dword ptr [esi];SendMessage
        test eax,eax	;.if eax=0
	jnz default
	push MCIWNDF_NOPLAYBAR
	push MCIWNDF_NOPLAYBAR
	push MCIWNDM_CHANGESTYLES
	push edi;hWnd
        call dword ptr [esi];SendMessage
        jmp default
mnuABOUT:invoke MessageBox,edi,offset szAboutText+exebase,\
	offset szAbout+exebase,ebx;MB_OK+MB_ICONINFORMATION
default:invoke CallWindowProc,prevWindow+exebase,edi,uMsg,wParam,lParam
	leave
	retn 16
wmDESTROY:invoke ExitProcess,ebx
;-------------------------------
handle dd mnuFILE+exebase,mnuCD+exebase,mnuVIDEODISK+exebase,\
	mnuVIDEOPLAYER+exebase,mnuFULLSCREEN+exebase,mnuABOUT+exebase
WndProc endp
;---------------------------------------------
mcihWnd                 dd ?
prevWindow              dd ?    
pBuffer			dd ?
flag_fullscreen		dd FALSE
szFile                  db "Файл",0
szCD                    db "Аудио CD",0
szVideoDisk             db "Video CD",0
szVideoPlayer           db "vcr",0
szFullScreen            db "Полный экран",0
LoadFileFilter          db "Все файлы",0,"*",0,0;
szAbout                 db "О программе...",0
szPlay                  db "PLAY",0
szStop                  db "STOP",0
szClose                 db "CLOSE",0
szPlayfullscreen        db "PLAY FULLSCREEN NOTIFY",0
szAboutText             db "Mini-media player",0Dh,0Ah,\
                           "Based on JTG coding",0
cdaudioDev              db "cdaudio",0
vcrExt                  db "UNKNOWN",0     
videodiscDev            db "videodisk",0
MediaFileName           db "skeleton.avi"
;-------------------------------------------------------
import:	
dd 0,0,0,user32_dll
dd user32_table
dd 0,0,0,shell32_dll
dd shell32_table
dd 0,0,0,kernel32_dll
dd kernel32_table
dd 0,0,0,msvfw32_dll
dd msvfw32_table
dd 0,0,0,comdlg32_dll
dd comdlg32_table
dd 0
kernel32_dll		db 'kernel32'
dd 0
comdlg32_table:
GetOpenFileName		dd _GetOpenFileName,0
msvfw32_table:
MCIWndCreate		dd _MCIWndCreate,0
kernel32_table:
lstrcpy			dd _lstrcpy
ExitProcess             dd _ExitProcess,0
shell32_table:
DragAcceptFiles		dd _DragAcceptFiles
DragFinish		dd _DragFinish
DragQueryFile		dd _DragQueryFile,0
user32_table:
CallWindowProc		dd _CallWindowProc
DestroyWindow		dd _DestroyWindow
InsertMenu		dd _InsertMenu
GetMessage              dd _GetMessage
SendMessage             dd _SendMessage
DispatchMessage         dd _DispatchMessage
ShowWindow		dd _ShowWindow
GetSystemMenu		dd _GetSystemMenu
MessageBox		dd _MessageBox
SetWindowLong		dd _SetWindowLong
                        dw 0
_DestroyWindow		db 0,0,'DestroyWindo'
_GetMessage		db 'w',0,'GetMessage'
_DispatchMessage	db 'A',0,'DispatchMessage'
_ShowWindow		db 'A',0,'ShowWindo'
_SendMessage            db 'w',0,'SendMessage'
_MessageBox		db 'A',0,'MessageBox'
_CallWindowProc		db 'A',0,'CallWindowProc'
_InsertMenu		db 'A',0,'InsertMenu'
_GetSystemMenu		db 'A',0,'GetSystemMen'
_SetWindowLong		db 'u',0,'SetWindowLongA',0
user32_dll		db 'user3'
_ExitProcess		db '2',0,'ExitProces'
_lstrcpy		db 's',0,'lstrcpy'
_GetOpenFileName	db 'A',0,'GetOpenFileNameA',0
comdlg32_dll		db 'comdlg3'
_DragAcceptFiles	db '2',0,'DragAcceptFile'
_DragFinish		db 's',0,'DragFinis'
_DragQueryFile		db 'h',0,'DragQueryFileA',0
shell32_dll		db 'shell3'
_MCIWndCreate		db '2',0,'MCIWndCreate',0
msvfw32_dll		db 'msvfw32'
end_import:
end main
две ложки дегтя к коду JTG
1) правильно будет
Код:
MCIWNDF_NOPLAYBAR    equ 2
MCIWNDF_NOMENU       equ 8
а не наоборот
2) на WinXP если запустить какой либо avi-файл на воспроизведение, то если проигрыватель закрыть процесс microplaymm.exe продолжает висеть в памяти, в моем проигрывателе та же ошибка
Mikl___ вне форума Ответить с цитированием
Старый 15.10.2012, 09:42   #23
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

он в любом случае останется висетьв памяти, ибо бесконечный цикл сообщений.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.10.2012, 11:21   #24
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Кстати, открыв первую попавшуюся avi'шку обнаружил, что нет звука (в "больших" проигрывателях такой проблемы не было), у другой avi'шки звук был.
Arigato вне форума Ответить с цитированием
Старый 15.10.2012, 12:02   #25
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
он в любом случае останется висеть в памяти, ибо бесконечный цикл сообщений.
Пепел Феникса, чего ради? Если речь о моем коде, то по WM_DESTROY будет вызвана ExitProcess, которая благополучно прихлопнет приложение, если, конечно, не был запущен просмотр авишки (в других приложениях всё это работает прекрасно, проверено!), у JTG, кстати, тот же недуг, хотя WM_DESTROY у него кошерно вызывает PostQuitMessage, которое отправляет ноль функции GetMessage, которае и вызывает ExitProcess, но приложение-то висит в памяти

Последний раз редактировалось Mikl___; 15.10.2012 в 14:00.
Mikl___ вне форума Ответить с цитированием
Старый 15.10.2012, 20:09   #26
Vort
Пользователь
 
Аватар для Vort
 
Регистрация: 10.07.2012
Сообщений: 16
По умолчанию

есть ещё один довольно интересный метод минимизации размера кода
суть в том, что вместо имён функций записывается их хеш
затем сканируются таблицы спроецированных в память библиотек и ищутся соответствующие имена
---
когда-то давным давно тоже увлекался минимизацией и прочими подобными трюками
тогда же написал простенькую программу, предназначенную для запуска плейлиста на воспроизведение
если кому-то интересно, вот она
(используется ли тут трюк с хешами - уже не помню. но шанс есть )
Вложения
Тип файла: rar Autorun.rar (560 байт, 21 просмотров)
Vort вне форума Ответить с цитированием
Старый 18.10.2012, 13:43   #27
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Vort,
конечно используется, вызываешь исключение и переходишь на 4010С1 далее ксоришь код числом 52h, в результате находишь в памяти kernel32 функцию LoadLibrary через нее загружается shell32.dll из которой вызывается ShellExecuteA которой передается Playlist.m3u
Mikl___ вне форума Ответить с цитированием
Старый 20.10.2012, 10:33   #28
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Идею Vort'а в массы! Щелкаю по первому попавшемуся avi-файлу правой клавишей мыши, выбираю "Открыть с помощью" "Выбрать программу" выбираю "Media player classic", ставлю галочку "Использовать ее для всех файлов такого типа". Сажусь за написание программы, буду использовать в своем микроплейере функцию ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile, LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd);
Параметры:
Код:
hwnd		 | дескриптор родительского окна 
lpOperation	 | строка, описывающая операцию: 
                 |"open" - открытие (запуск),  
		 | "print" - печать, 
                 |"explore" - открыть окно с заданной папкой 
lpFile		 | имя файла 
lpParameters| параметры командной строки 
lpDirectory	 | текущая директория для запускаемой программы 
nShowCmd	 | параметр, указывающий, как будет показано приложение при  открытии. 
                 |Имеет тот же смысл, что и nCmdShow в WinMain
текст программы
Код:
.586p
.model tiny
;for WinXP - 336 bytes
include windows.inc
exebase equ 400000h
.code
main:
include capito.asm
;--------------------------------------------------------------------
start:	xor ebx,ebx
	invoke ShellExecute,ebx,offset szOpen+exebase,\
	offset szFilm+exebase,ebx,ebx,SW_SHOWNORMAL
	invoke ExitProcess,ebx
;----------------------------------------------------------------------
szFilm db 'hic_cup_pup.avi',0
szOpen db 'open'
import:
dd 0,0,0,kernel32_dll
dd ExitProcess
dd 0,0,0,shell32_dll
dd ShellExecute,0,0			 
ShellExecute	dd _ShellExecute
		dw 0          
_ShellExecute	db 0,0,'ShellExecuteA',0
ExitProcess	dd _ExitProcess,0
shell32_dll	db 'shell3'
_ExitProcess	db '2',0,'ExitProcess',0
kernel32_dll	db 'kernel32' 
end_import:
end main
Получаем экзе размером 335 байт. Если хотите модифицировать программу -- тогда вставьте в нее вызов функции GetOpenFileName и передавайте полученный файл вторым параметром вместо фиксированного szFilm, если хотите полноэкранного воспроизведения, тогда вместо SW_SHOWNORMAL передавайте SW_SHOWMAXIMIZED.
Не останавливаясь на достигнутом, запускаем наш плейер через Ollydbg и как только программа доходит до ShellExecuteA нажимаем не F8, а F7. Внутри ShellExecuteA авишку воспроизводит функция ShellExecuteExA. Снова дорабатываем наш плейер. Функция ShellExecuteEx работает с единственным параметром -- указателем на структуру LPSHELLEXECUTEINFO
Формат структуры SHELLEXECUTEINFO:
Код:
DWORD 	cbSize		| размер структуры   SHELLEXECUTEINFO
ULONG 	fMask		|маска, может принимать комбинации следующих значений
						SEE_MASK_CLASSNAME       equ 1h
						SEE_MASK_CLASSKEY        equ 3h
						SEE_MASK_IDLIST          equ 4h
						SEE_MASK_INVOKEIDLIST    equ 0Ch
						SEE_MASK_ICON            equ 10h
						SEE_MASK_HOTKEY          equ 20h
						SEE_MASK_NOCLOSEPROCESS  equ 40h
						SEE_MASK_CONNECTNETDRV   equ 80h
						SEE_MASK_FLAG_DDEWAIT    equ 100h
						SEE_MASK_DOENVSUBST      equ 200h
						SEE_MASK_FLAG_NO_UI      equ 400h    
HWND 	hwnd            |
LPCTSTR lpVerb		| "open"
LPCTSTR lpFile		| имя файла         
LPCTSTR lpParameters	| параметры командной строки    
LPCTSTR lpDirectory	| текущая директория    
int 	nShow		| SW_SHOW параметр, указывающий, как будет показано приложение при открытии.       |SW_SHOWNORMAL
HINSTANCE hInstApp      | сюда будет записан hInstance приложения     
;Optional members     
LPVOID	lpIDList	| IDL, определяющий файл для выполнения    
LPCSTR	lpClass         | имя класса файла или GUID    
HKEY	hkeyClass	| дескриптор ключа в реестре для класса файла    
DWORD	dwHotKey	| горячая клавиша    
union
HANDLE	hIcon		| иконка для класса файла
DWORD   hMonitor        |
ends    
HANDLE	hProcess	| дескриптор процесса
Пишем текст для нового плейера
Код:
.586p
.model tiny
;for WinXP - 354 bytes
include windows.inc
exebase equ 400000h
.code
main:
include capito.asm
;--------------------------------------------------------------------
start:	xor ebx,ebx
	invoke ShellExecuteEx,esp,sizeof(SHELLEXECUTEINFO),1500h,ebx,\
	offset szOpen+exebase,offset szFilm+exebase,ebx,ebx,SW_SHOWNORMAL,\
	ebx,ebx,ebx,ebx,ebx,ebx,ebx,ebx
	invoke ExitProcess,ebx
;----------------------------------------------------------------------
szFilm db 'hic_cup_pup.avi',0
szOpen db 'open'
import:
dd 0,0,0,kernel32_dll
dd ExitProcess
dd 0,0,0,shell32_dll
dd ShellExecuteEx,0,0			 
ShellExecuteEx	dd _ShellExecuteEx
		dw 0          
_ShellExecuteEx	db 0,0,'ShellExecuteExA',0
ExitProcess	dd _ExitProcess,0
shell32_dll	db 'shell3'
_ExitProcess	db '2',0,'ExitProcess',0
kernel32_dll	db 'kernel32'
end_import:
end main
Размер чуть больше, но тоже не 3 к!

Последний раз редактировалось Mikl___; 20.10.2012 в 11:06.
Mikl___ вне форума Ответить с цитированием
Старый 20.10.2012, 11:07   #29
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Внутри ShellExecuteExА находится функция ShellExecuteExW ее параметры практически не отличающаяся от параметров ShellExecuteExА, но требуют названия файла и команды в unicode, снова переписываем программу
Код:
.586p
.model tiny
;for WinXP - 376 bytes
include windows.inc
exebase equ 400000h
;--------macros-----------------
du	macro string
	irpc c,<string>
	if '&c'gt 127
	db ('&c'- 0B0h),4
	else
	dw '&c'
	endif
	endm
	dw 0
	endm
;----------------------------------------
.code
main:
include capito.asm
;--------------------------------------------------------------------
start:	xor ebx,ebx
	invoke ShellExecuteEx,esp,sizeof(SHELLEXECUTEINFO),1500h,ebx,\
	offset szOpen+exebase,offset szFilm+exebase,ebx,ebx,SW_SHOWNORMAL,\
	ebx,ebx,ebx,ebx,ebx,ebx,ebx,ebx
	invoke ExitProcess,ebx
;----------------------------------------------------------------------
szFilm: du <hic_cup_pup.avi>
szOpen: du <open>
import:
dd 0,0,0,kernel32_dll
dd ExitProcess
dd 0,0,0,shell32_dll
dd ShellExecuteEx,0,0			 
ShellExecuteEx	dd _ShellExecuteEx
		dw 0          
_ShellExecuteEx	db 0,0,'ShellExecuteExW',0
ExitProcess	dd _ExitProcess,0
shell32_dll	db 'shell3'
_ExitProcess	db '2',0,'ExitProcess',0
kernel32_dll	db 'kernel32'
end_import:
end main
Вот и всё!
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как наложить иконку с исходным размером 16х16 на битмап с размером 32х32? SkAndrew Мультимедиа в Delphi 1 26.04.2008 14:44
Проблема с размером :) Exel_Wild Microsoft Office Excel 5 14.04.2008 12:47
MP3-плеер Egych Софт 10 14.01.2008 20:54
Флэш-плеер Pretty Woman Софт 5 16.09.2007 22:39