· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› FindResource?

Посл.отвђт Сообщенiе


Дата: Июн 18, 2003 13:59:34

Запихиваю в ресурсы xm-файл, потом пытаюсь его найти
функцией FindResource, но она почему-то возвращает в
eax=0, чего то я не догоняю в чём проблема? В ресурсах
файл лежит.

-----------------------------------------------------------------
start:
invoke GetModuleHandle,NULL
mov hModule,eax
invoke FindResource,hModule,addr SoundResource,RT_RCDATA
mov hResource1,eax
invoke LoadResource,hModule,hResource1
mov hResource2,eax
invoke LockResource,hResource2
mov hResource3,eax
invoke SizeofResource,hModule,hResource1
mov hResource4,eax
invoke FMUSIC_LoadSongMemory,hResource3,hResource4
mov handle,eax
invoke FMUSIC_PlaySong,handle
invoke FMUSIC_StopSong,handle
invoke FMUSIC_FreeSong,handle
-----------------------------------------------------------------


Дата: Июн 18, 2003 16:07:01

Asterix
А что такое xm файлы?


Дата: Июн 18, 2003 16:41:56

You have a music file or a sound you want to play.
What FMOD API should you use to load and play it?
If it is a sequenced music file such as .MOD, .S3M, .XM,
.IT or .MID, then use the FMUSIC API. :-))))))))))))))))


Дата: Июн 18, 2003 18:54:55

Asterix
Возможно ты неверно определяешь его?
А что говорит Дизассемблер:
Он попадает в раздел ресурсов?


Дата: Июн 18, 2003 19:33:30

А как он должен собственно туда попадать? Разве это прямо так заметишь?
Имя ресурса грузится на стек всё нормально, да и вообще этот код не я придумал,
я его выдрал из C-шного исходника. Код вроде рабочий.
Вот работающий пример, но файл грузится с диска, а хотелось бы из ресурсов:
-----------------------------------------------------------
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\fmod.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fmod.lib

.data
MsgCaption db "message",0
MsgBoxText db "The project is loaded successfully!",0
SoundResource db "sound.xm",0

.data?
handle dd ?

.code
start:

invoke FSOUND_Init,7D00h,40h,1h
invoke FMUSIC_LoadSong,addr SoundResource
mov handle,eax
invoke FMUSIC_PlaySong,handle

invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
-----------------------------------------------------------


Дата: Июн 18, 2003 21:48:15

"addr SoundResource" - этот параметер может быть передан двойственно:
1. обычный UINT
2. как адрес реальной строки
===
Зависит это от того каким образом этот RCDATA объявлен в RC
файле. Самое нехорошее - это то, что, если имя ресурса без
двойных кавычек и нет ID, то имя автоматически становится
текстом:

IDC_MYSOUND1 RCDATA
...

если 'IDC_MYSOUND1' нигде не объявлен, то в FindResource()() надо передавать адрес
"IDC_MYSOUND1", а если объявлен как:

#define IDC_MYSOUND1 1024

тогда надо передать это целое значение (1024), а не адрес.

...ммда... что-то я заболтался...


Дата: Июн 18, 2003 21:56:14

Вот те рабочий пример:

; *.asm
.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

IDR_TXT equ 1000

.data
szResourseName db "txt", 0

.code

start proc

local hResInfo:HRSRC

local cb:UINT
local pRes:LPVOID

invoke FindResource, NULL, IDR_TXT, addr szResourseName
.if eax != NULL
mov hResInfo, eax

invoke LoadResource, NULL, hResInfo
.if eax != NULL
mov pRes, eax

invoke SizeofResource, NULL, hResInfo
mov cb, eax

invoke LockResource, hResInfo
invoke MessageBox, NULL, pRes, NULL, MB_OK
.endif
.endif

invoke ExitProcess, 0

start endp

end start



; rsrc.rc
#include <\masm32\include\resource.h>
#define IDR_TXT 1000
IDR_TXT txt DISCARDABLE "text.txt"



; text.txt
Тут сам ченить напишешь ;-)


Дата: Июн 19, 2003 07:11:03

Всем спасибо, теперь код рабочий :-), но, как можно заметить,
прога использует fmod.dll, которая не маленьких размеров.
Как можно от неё избавится, если я правильно понимаю, то
статическая линковка должна взять только нужные мне API, а всё
остальное в код не попадёт или я заблуждаюсь?

---------------------------------------------------------------------- -
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\fmod.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fmod.lib

IDB_SOUND equ 1


.data
MsgCaption db "message",0
MsgBoxText db "The project is loaded successfully!",0

.data?
hResource1 dd ?
hResource2 dd ?
hResource3 dd ?
hResource4 dd ?
handle dd ?

.code
start:

invoke FSOUND_Init,7D00h,40h,1h
invoke FindResource,NULL,IDB_SOUND,RT_RCDATA
.if eax != NULL
mov hResource1,eax
invoke LoadResource,NULL,hResource1
.if eax != NULL
mov hResource2,eax
invoke LockResource,hResource2
mov hResource3,eax
invoke SizeofResource,NULL,hResource1
mov hResource4,eax
invoke FMUSIC_LoadSongMemory,hResource3,hResource4
mov handle,eax
invoke FMUSIC_PlaySong,handle
.endif
.endif
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
;---------------------------------------------------------------------
; Файл ресурсов
;---------------------------------------------------------------------
#define IDB_SOUND 1
IDB_SOUND RCDATA "sound.s3m"


Дата: Июн 19, 2003 08:40:38

использует fmod.dll ... если я правильно понимаю, то статическая линковка должна взять только нужные мне API
Из dll'ки ничего в Ваш код не попадает.
Она (dll'ки) должна присутствовать при старте программы, как kernel32.dll и т.п.
В код попадает из "настоящей" библиотеки. Например, masm32.lib.


Дата: Июн 20, 2003 15:49:19 · Поправил: Asterix

[ P2M: Из dll'ки ничего в Ваш код не попадает.
Она (dll'ки) должна присутствовать при старте программы, как kernel32.dll и т.п.
В код попадает из "настоящей" библиотеки. Например, masm32.lib.
]

Это понятно, но нельзя ли из этой DLL сконвертить как-нить
нормальную статическую lib'у?
Или это только нужно вручную код в IDA рипать?


Дата: Июн 20, 2003 16:24:21

Есть такая софтина "DLL to Lib" http://www.binary-soft.com/
Как то один раз я с ней экспериментировал и вроде что-то даже получилось. Попробуй.


Дата: Июн 20, 2003 16:32:05

Спасибо, Four-F, попробую :-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.070