![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Код, который не работает:
Код:
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); |
|
#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 методы классов. |
|
#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), и... дальше догадаешься, как.
|
|
#9
|
|||
|
|||
|
Спасибо. Почему-то не подумал на user ))
|