Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
ВнизВ чем ошибка загрузки Waw-файла ? Найти похожие ветки
← →
kyn66 © (2006-03-14 16:00) [0]Загружаю вавик из 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");
...
← →
Призрак © (2006-03-14 20:18) [1]Я не помню точно, но помню что что-то говорилось о том что при работе с DLL следует избегать string"ов в качестве параметров функции. Там какой-то геморрой с этим... Попробуй то же самое сделать через PChar?..
← →
kyn66 © (2006-03-15 09:31) [2]Изначально параметры были типа ShortString, но тогда в этом месте hLib := LoadLibrary(PAnsiChar(LibName)); вылетает ошибка Invalid typecast. Чтобы это значило?
← →
deema (2006-03-15 09:44) [3]
> вылетает ошибка Invalid typecast. Чтобы это значило?
LibName[Length(Libname)+1] := #0;
LoadLibrary( PAnsiChar( @Libname[1] ) );
← →
kyn66 © (2006-03-15 09:55) [4]>> LibName[Length(Libname)+1] := #0;
Тоже вылетает ошибка, недопустимое присваивание 8-(
← →
kyn66 © (2006-03-15 09:59) [5]А если сделать так : ?
procedure PlayWaveRes(LibName, ResName: PChar);
var
hLib: THandle;
begin
hLib := LoadLibrary(Libname);
if hLib <= 32 then
exit;
PlaySoundA(Resname, hLib, SND_RESOURCE or SND_SYNC);
FreeLibrary(hLib);
end;
...
PlayWaveRes(PChar("Sound.dll"), PChar("S5"));
...
Это не то-же самое? Хотя и так тоже звук не льется 8-(((((((
← →
Сергей М. © (2006-03-15 10:01) [6]
> ошибки нет
А где собственно проверка на ошибку ?
← →
kyn66 © (2006-03-15 10:46) [7]> Сергей М
см. [4]
← →
Сергей М. © (2006-03-15 11:05) [8]
> kyn66 © (15.03.06 10:46) [7]
Причем здесь [4] ?
Цитрирую тебя:
> Загружаю вавик из Dll, ошибки нет
Вот и спрашиваю, что за ошибку ты ожидал увидеть ..
← →
kyn66 © (2006-03-15 11:21) [9]А, понял. Ошибки были сразу при компиляции, если тип параметров был ShortString. Когда менял на String компиляция без ошибок. Но при выполнении звук не проигрывается. Но что-же еще нужно? И так делал [5]. Где-то читал, что нужно применять FindResurs? Может в этом дело? Неужели это непобедимая проблема? Ведь, если вавы вложить в прогу - все нормально вытягивается. И Dll-ка с ресурсами в PE-explorer загружается нормально, т.е. звуки из нее вытягивабтся.
← →
Сергей М. © (2006-03-15 11:37) [10]
> что-же еще нужно?
Win32Check(PlaySound(...));
← →
kyn66 © (2006-03-15 11:47) [11]Win32Check(PlaySound(...)); ???
Win32Check(PlaySoundA(Resname, hLib, SND_RESOURCE or SND_SYNC)); ?
← →
Сергей М. © (2006-03-15 12:03) [12]procedure PlayWaveRes(const LibName, ResName: String);
var
hLib: THandle;
begin
hLib := LoadLibrary(PChar(LibName));
Win32Check(hLib > 0);
try
Win32Check(PlaySound(PChar(Resname), hLib, SND_RESOURCE or SND_SYNC));
finally
FreeLibrary(hLib);
end;
end;
← →
kyn66 © (2006-03-15 12:29) [13]>>Сергей М.
Теперь выдает такую ошибку :
Указанный тип ресурса в файле образа отсутствует
А вот интеремно, как правильно вызывать ?
1)
PlayWaveRes("Sound.dll", "S5");
2)
PlayWaveRes(Paramstr(0) + "Sound.dll", "S5");
← →
kyn66 © (2006-03-15 12:35) [14]Немного ошибся,
2)
PlayWaveRes("Полный путь к библиотеке" + "\Sound.dll", "S5");
← →
Сергей М. © (2006-03-15 12:39) [15]
> kyn66 © (15.03.06 12:29) [13]
Значит он действительно отсутствует.
Проверяй, делай выводы ..
> как правильно вызывать ?
2-й вариант в любом случае неправилен, потому что Paramstr(0) содержит полный абсолютный путь к файлу вызвавшего эту ф-цию приложения, включая имя и расширение имени этого файла.
Если бы путь к ресурсной библ-ке был тобой указан неправильно, ты бы получил совершенно иное исключение (типа "файл не найден") на строчке Win32Check(hLib > 0);
← →
kyn66 © (2006-03-15 12:59) [16]Но ресурс в биьлиотеке присутствует, вот тому доказательство:
http://yurec66.narod.ru/vopros.gif
← →
Сергей М. © (2006-03-15 13:03) [17]
> kyn66 © (15.03.06 12:59) [16]
Тип этого ресурса должен быть RT_WAVE !
← →
kyn66 © (2006-03-15 13:18) [18]Ну вроде уже и так переделал - ошибка та-же
http://yurec66.narod.ru/vopros.gif (тока сделай Refresh)
Может как-то в параметрах PlaySound указывать чего, типа SND_...
← →
Сергей М. © (2006-03-15 13:31) [19]Вообще говоря, идентификатор ресурса (тот самый что требуется 1-ым параметром ф-ции PlaySound при проигрывании из ресурса) не есть тоже самое чтот и имя ресурса.
Каждый ресурс в составе ресурсов РЕ-модуля имеет уникальный целочисленный идентификатор, его, очевидно по описанию в справке, как раз и следует передавать параметром.
См., например, http://flinflon.brandonu.ca/richards/gamehtm/using_resources.htm
← →
Сергей М. © (2006-03-15 13:39) [20]
> как раз и следует
Точнее - как раз и желательно ..
Локализовать ресурс по его ID проще и надежней, нежели по его NAME.
← →
kyn66 © (2006-03-15 13:47) [21]А как я узнаю его ID ? Я ведь просто добавляю ресурс и прописываю его имя.
Сергей, может у тебя ася есть, чтобы более быстрее можно было решить эту проблем, не заходя сюда на сайт, а то столько времени теряется в ожидании ответа 8-(
← →
Сергей М. © (2006-03-15 13:52) [22]MyWave RT_WAVE "MyWave.wav"
MyWave - это и есть тот самый идентификатор
← →
kyn66 © (2006-03-15 13:52) [23]> Локализовать ресурс по его ID проще и надежней, нежели по его NAME.
Вот для этого наверное и нужно использовать FindResorce ?
← →
Сергей М. © (2006-03-15 13:55) [24]
> kyn66 © (15.03.06 13:52) [23]
Так точно.
← →
Сергей М. © (2006-03-15 13:59) [25]
> kyn66
Ну и грузить чисто ресурсный модуль лучше средствами LoadLibraryEx (DONT_RESOLVE_DLL_REFERENCES) (NT), нежели LoadLibrary
← →
kyn66 © (2006-03-15 14:32) [26]> MyWave - это и есть тот самый идентификатор
Пардонс... Я так понимаю, что ID -должен быть числовым, а вданном случае MyWave - это как раз и есть имя ресурса ??? Или я не прав?
А вот FindResource("MyWave") и должен выдать его ID. Мне так каацца...
← →
Сергей М. © (2006-03-15 14:36) [27]
> вданном случае MyWave - это как раз и есть имя ресурса ?
> ?? Или я не прав?
Не прав.
В д.с. идентификатор MyWave как раз и примет ц/ч значение будущего ид-ра указанного ресурса.
> FindResource("MyWave") и должен выдать его ID
Вот и проверь сие предположение ... И сравни со значением ид-ра MyWave .. Разве это проблематично ?
← →
kyn66 © (2006-03-15 15:11) [28]Короче, мы пришли к тому, с чего начинали, выходит вызов будет правильный
...
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"
← →
kyn66 © (2006-03-15 15:14) [29]И в дополнение... RT_WAVE - нет такого вида ресурса. Т.е.
← →
Сергей М. © (2006-03-15 15:47) [30]http://delphiworld.narod.ru/base/wave_resource.html
← →
kyn66 © (2006-03-15 16:32) [31]Да, действительно, премер толковый. Я и хотел сказать, что технология должна быть такой:
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 ???
ЗЫ:
Сергей, звиняй, если достал уже .... Просто очень нужно добиться рабочего результата. ;-)
← →
kyn66 © (2006-03-15 17:25) [32]Все, получилось. Помогла твоя последняя ссылка и вот ешшо эта
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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.059 c