Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1138280826
Kolan
2006-01-26 16:07
2006.04.16
Помогите разобраться с небольшим участком код...


8-1130421802
Андрей_7
2005-10-27 18:03
2006.04.16
Как программным путем вставлять в Nero Wave Editor волны


2-1144213423
syte_ser78
2006-04-05 09:03
2006.04.16
формат вывода даты и время


1-1142333176
Priest
2006-03-14 13:46
2006.04.16
Приведение класса к интерфейсу


15-1143477441
Serg1981
2006-03-27 20:37
2006.04.16
Глюк или что ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский