|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
bass.dll Не могу понять в чем ошибка
Код, который не работает:
Код:
type TMyClass = class private FURL: string; FFile: TFileStream; procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; public property URL: string read FURL write FURL; procedure Play; constructor Create(); destructor Destroy; override; end; constructor TMyClass.Create(); begin inherited; FURL := ''; if not BASS_Init(-1, 44100, 2, 0, nil) then raise Exception.Create('Не могу инициализировать звук') else BASS_Start; end; destructor TMyClass.Destroy; begin BASS_Free; inherited; end; procedure TMyClass.StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (buffer <> nil) and (len = 0) then FFile.Write(Buffer^, Len); end; procedure TMyClass.Play; var Stream: HSTREAM; begin FreeAndNil(FFile); FFile := TFileStream.Create('C:\temp.mp3', fmCreate); Stream := BASS_StreamCreateURL(PAnsiChar(FURL), 0, BASS_STREAM_STATUS, @TMyClass.StatusProc, nil); //Ошибка if BASS_ErrorGetCode = 0 then begin BASS_ChannelPlay(Stream, true); end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); var My: TMyClass; begin My := TMyClass.Create; My.URL := 'http://cs4587.vkontakte.ru/u2026045/audio/62c024dfa750.mp3'; My.Play; end; Код который работает (без класса): Код:
var FS: TFileStream; .... procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (buffer <> nil) and (len = 0) then FS.Write(Buffer^, Len); end; procedure TForm1.SpeedButton1Click(Sender: TObject); var Stream: HSTREAM; begin if not BASS_Init(-1, 44100, 2, 0, nil) then raise Exception.Create('Не могу инициализировать звук') else begin BASS_Start; FS := TFileStream.Create('C:\temp.mp3', fmCreate); Stream := BASS_StreamCreateURL('http://cs4587.vkontakte.ru/u2026045/audio/62c024dfa750.mp3', 0, BASS_STREAM_STATUS, @StatusProc, nil); if BASS_ErrorGetCode = 0 then begin BASS_ChannelPlay(Stream, true); end; end; end; И в чем ошибка? |
#2
|
||||
|
||||
Жээсть, а чего у тебя на деструкторе объекты не грохаются?
Конкретно, на какой строчке сваливается? Возможно, что на строчке FreeAndNil(FFile); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
Валится скорее всего вот на этой строчке:
Код:
FreeAndNil(FFile); Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
|||
|
|||
Я же написал что на строчке BASS_StreamCreateURL )
И как это не грохаются? Деструктор же есть. А не вызывал я его потому что это только пример. Или я что-то не понял? P.S. убирай не убирай FreeAndNil все тоже самое Последний раз редактировалось ART, 10.11.2011 в 12:32. |
#5
|
||||
|
||||
Вы всмотритесь в исходник то, там же показано место свала.
Код:
Stream := BASS_StreamCreateURL(PAnsiChar(FURL), 0, BASS_STREAM_STATUS, @TMyClass.StatusProc, nil); //Ошибка Скорее всего, нельзя по указателю передавать в dll методы классов. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
||||
|
||||
Код:
@TMyClass.StatusProc Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#7
|
|||
|
|||
Я пробовал и так:
Код:
procedure TMyClass.Play; procedure StatusProc(buffer: Pointer; len, user: DWORD); stdcall; begin if (buffer <> nil) and (len = 0) then FFile.Write(Buffer^, Len); end; var Stream: HSTREAM; begin FFile := TFileStream.Create('C:\temp.mp3', fmCreate); Stream := BASS_StreamCreateURL(PAnsiChar(FURL), 0, BASS_STREAM_STATUS, @StatusProc, nil); //Ошибка if BASS_ErrorGetCode = 0 then begin BASS_ChannelPlay(Stream, true); end; end; |
#8
|
||||
|
||||
А так она вложена в метод класса. Сделай её отдельной вообще. Там же есть параметр user, вот и передавай через него указатель на объект (self), и... дальше догадаешься, как.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#9
|
|||
|
|||
Спасибо. Почему-то не подумал на user ))
|