![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
В чем ошибка загрузки Waw-файла ? [D7, WinXP]
kyn66 © (2006-03-14 16:00:00)Загружаю вавик из Dll, ошибки нет, но и звука тоже. В чем может быть дело? ВОт функция загрузки:
procedure PlayWaveRes(const LibName, ResName: String);
var
hLib: THandle;
begin
hLib := LoadLibrary(PAnsiChar(LibName));
if hLib <= 32 then
exit;
PlaySoundA(PAnsiChar(Resname), hLib, SND_RESOURCE or SND_SYNC);
FreeLibrary(hLib);
end;
...
PlayWaveRes('Sound.dll', 'S5');
...
kyn66 (2006-03-15 17:25:00) [1]Все, получилось. Помогла твоя последняя ссылка и вот ешшо эта
http://mech.math.msu.su/~vfnik/WinApi/p/playsound.html
Оказывается, как я и думал, прочитав статью по ссылке(которую сейчас даю), нужно действительно варьировать последним параметром. И тем не менее, заработал только вот этот код, где я явно указываю место хранения звуков :
procedure PlayWaveRes(const LibName, ResName: String);
var
FindHandle, ResHandle: THandle;
ResPtr: Pointer;
hLib : THandle;
begin
hLib := LoadLibrary(PAnsiChar(LibName));
FindHandle := FindResource(hLib, ResName, 'WAVES');
if FindHandle <> 0 then
begin
ResHandle := LoadResource(hLib, FindHandle);
if ResHandle <> 0 then
begin
ResPtr := LockResource(ResHandle);
if ResPtr <> nil then
SndPlaySound(PChar(ResPtr), snd_ASync or snd_Memory);
UnlockResource(ResHandle);
end;
FreeResource(FindHandle);
end;
end;
kyn66 (2006-03-15 16:32:00) [2]Да, действительно, премер толковый. Я и хотел сказать, что технология должна быть такой:
1) Нати ресурс
2) Залочить
3) Использовать
4) Освободить.
Оказывается, если верить написанному, то эта функция (PlaySound) все это уже выполняет. Остается дело за малым. А именно, немного подправить
PlaySound('S1', HInstance, SND_RESOURCE or SND_ASYNC);
на
PlaySound(PAnsiChar('S1'), HLib, SND_RESOURCE or SND_ASYNC);
^^^^^^^^^^^^^^^^^^^
??????????????????????????????
А вот тут - обломс. Возможно эта комбинация предполагает загрузку из родного ресурса, прилинкованного к программе. И еще, хранить звуки можно в любом(мне кажется) названии типа ресурса ("Sound", "WAVE" и т.д.)
Главное правильно указать его имя при поиске. Если сделать так :
S0 ZVUK "0.wav"
S1 ZVUK "1.wav"
S2 ZVUK "2.wav"
S3 ZVUK "3.wav"
...
то где тогда в функции PlaySoundуказать, что ресурс мой нужно искать в секции ZVUK???
ЗЫ:
Сергей, звиняй, если достал уже .... Просто очень нужно добиться рабочего результата. ;-)
Сергей М. (2006-03-15 15:47:00) [3]http://delphiworld.narod.ru/base/wave_resource.html
kyn66 (2006-03-15 15:14:00) [4]И в дополнение... RT_WAVE - нет такого вида ресурса. Т.е.
kyn66 (2006-03-15 15:11:00) [5]Короче, мы пришли к тому, с чего начинали, выходит вызов будет правильный
...
Win32Check(PlaySound(PChar(Resname), hLib, SND_RESOURCE or SND_SYNC));
...
PlayWaveRes('Sound.dll', 'S5');
в файле ресурса у меня записано так
S0 RCDATA "0.wav"
S1 RCDATA "1.wav"
S2 RCDATA "2.wav"
S3 RCDATA "3.wav"
S4 RCDATA "4.wav"
S5 RCDATA "5.wav"
S6 RCDATA "6.wav"
S7 RCDATA "7.wav"
S8 RCDATA "8.wav"
S9 RCDATA "9.wav"
S10 RCDATA "10.wav"
Сергей М. (2006-03-15 14:36:00) [6]
> вданном случае MyWave - это как раз и есть имя ресурса ?
> ?? Или я не прав?
Не прав.
В д.с. идентификатор MyWave как раз и примет ц/ч значение будущего ид-ра указанного ресурса.
> FindResource('MyWave') и должен выдать его ID
Вот и проверь сие предположение ... И сравни со значением ид-ра MyWave .. Разве это проблематично ?
kyn66 (2006-03-15 14:32:00) [7]> MyWave - это и есть тот самый идентификатор
Пардонс... Я так понимаю, что ID -должен быть числовым, а вданном случае MyWave- это как раз и есть имя ресурса ??? Или я не прав?
А вот FindResource('MyWave') и должен выдать его ID. Мне так каацца...
Сергей М. (2006-03-15 13:59:00) [8]
> kyn66
Ну и грузить чисто ресурсный модуль лучше средствами LoadLibraryEx (DONT_RESOLVE_DLL_REFERENCES) (NT), нежели LoadLibrary
Сергей М. (2006-03-15 13:55:00) [9]
> kyn66 © (15.03.06 13:52) [23]
Так точно.
kyn66 (2006-03-15 13:52:00) [10]> Локализовать ресурс по его ID проще и надежней, нежели по его NAME.
Вот для этого наверное и нужно использовать FindResorce?
Сергей М. (2006-03-15 13:52:00) [11]MyWave RT_WAVE 'MyWave.wav'
MyWave - это и есть тот самый идентификатор
kyn66 (2006-03-15 13:47:00) [12]А как я узнаю его ID ? Я ведь просто добавляю ресурс и прописываю его имя.
Сергей, может у тебя ася есть, чтобы более быстрее можно было решить эту проблем, не заходя сюда на сайт, а то столько времени теряется в ожидании ответа 8-(
Сергей М. (2006-03-15 13:39:00) [13]
> как раз и следует
Точнее - как раз и желательно..
Локализовать ресурс по его ID проще и надежней, нежели по его NAME.
Сергей М. (2006-03-15 13:31:00) [14]Вообще говоря, идентификаторресурса (тот самый что требуется 1-ым параметром ф-ции PlaySound при проигрывании из ресурса) не есть тоже самое чтот и имяресурса.
Каждый ресурс в составе ресурсов РЕ-модуля имеет уникальный целочисленныйидентификатор, его, очевидно по описанию в справке, как раз и следует передавать параметром.
См., например, http://flinflon.brandonu.ca/richards/gamehtm/using_resources.htm
kyn66 (2006-03-15 13:18:00) [15]Ну вроде уже и так переделал - ошибка та-же
http://yurec66.narod.ru/vopros.gif(тока сделай Refresh)
Может как-то в параметрах PlaySoundуказывать чего, типа SND_...
Сергей М. (2006-03-15 13:03:00) [16]
> kyn66 © (15.03.06 12:59) [16]
Тип этого ресурса должен быть RT_WAVE !
kyn66 (2006-03-15 12:59:00) [17]Но ресурс в биьлиотеке присутствует, вот тому доказательство:
http://yurec66.narod.ru/vopros.gif
Сергей М. (2006-03-15 12:39:00) [18]
> kyn66 © (15.03.06 12:29) [13]
Значит он действительно отсутствует.
Проверяй, делай выводы ..
> как правильно вызывать ?
2-й вариант в любом случае неправилен, потому что Paramstr(0) содержит полный абсолютный путь к файлу вызвавшего эту ф-цию приложения, включая имя и расширение имени этого файла.
Если бы путь к ресурсной библ-ке был тобой указан неправильно, ты бы получил совершенно иное исключение (типа "файл не найден") на строчке Win32Check(hLib > 0);
kyn66 (2006-03-15 12:35:00) [19]Немного ошибся,
2)
PlayWaveRes('Полный путь к библиотеке' + '\Sound.dll', 'S5');
kyn66 (2006-03-15 12:29:00) [20]>>Сергей М.
Теперь выдает такую ошибку :
Указанный тип ресурса в файле образа отсутствует
А вот интеремно, как правильно вызывать ?
1)
PlayWaveRes('Sound.dll', 'S5');
2)
PlayWaveRes(Paramstr(0) + 'Sound.dll', 'S5');