Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить адрес функции у класса 
V
    Опции темы
Alexeis
Дата 2.12.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



WaveOutOpen(@hwo, WAVE_MAPPER, @wfx, Cardinal(@PWaveOutProc), 0, CALLBACK_FUNCTION);
сразу за PWaveOutProc


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 2.12.2007, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Тут просто неудачно назвал код то такой вышел у меня
Код

constructor TSoundPlayObject.Create;
var
  ...
  WaveOutProc2: TwaveOutProc;
begin
...
  WaveOutProc2:= Self.WaveOutProc;
  WaveOutOpen(@hwo, WAVE_MAPPER, @wfx, Cardinal(@WaveOutProc2), Cardinal(@Self), CALLBACK_FUNCTION);

Код

  TwaveOutProc = procedure (hwo: HWAVEIN; uMsg: UINT; dwInstance: DWORD; dwParam1: DWORD; dwParam2: DWORD) of object; stdcall;


Добавлено через 13 минут и 14 секунд
При выполнении этого кода получаю один вызов Self.WaveOutProc (это CallBack функция) с параметрами 
Цитата

hwo: 955
uMsg: 1244680
dwInstance: 0
dwParam1: 0
dwParam2: 1926305213

Как видно 955 должно быть у uMsg, а не у hwo.
955 соотвествует MM_WOM_OPEN.
Шас после двойного вызова Self.WaveOutProc получаю ошибку
Цитата

Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 0014DBB8. Write of address 00000001'. Process stopped. Use Step or Run to continue.


Это сообщение отредактировал(а) Ak47black - 2.12.2007, 20:18
PM MAIL   Вверх
Alexeis
Дата 2.12.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Cardinal(@Self) - не нужно брать адрес. Self и так адрес

Добавлено через 54 секунды
Ak47black, приатач тестовый проект, проще будет разобраться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 2.12.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Alexeis, лан тут наверно нереально сделать.
Попробую через по другому какому-нибудь пути сделать, спасибо всем за участвие.

Это сообщение отредактировал(а) Ak47black - 2.12.2007, 20:55
PM MAIL   Вверх
Alexeis
Дата 3.12.2007, 14:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(Ak47black @  2.12.2007,  20:53 Найти цитируемый пост)
Alexeis, лан тут наверно нереально сделать.

  Если так быстро будешь сдаваться, то плохой из тебя выйдет программист.
Вот полностью рабочий код
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MMSystem, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

    Hdr  : TWaveHdr;
    WO   : HWAVEOUT;
    Data : Pointer;
    Size : Integer;

    procedure WaveOutProc(uMsg : UINT; dwInstance : PDWORD;
                          dwParam1 : PDWORD; dwParam2 : PDWORD); stdcall;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WaveOutProc(uMsg : UINT; dwInstance : PDWORD;
                             dwParam1 : PDWORD; dwParam2 : PDWORD);
{var
  hwo : HWAVEOUT;  }

Begin // hwo := Integer(self); //åñëè ïàðàìåòð íóæåí
  Self := TForm1(dwInstance);
  if uMsg = WOM_DONE
  then
    Begin
      waveOutUnprepareHeader(WO, @Hdr, SizeOf(Hdr));
      waveOutClose(WO);
      FreeMem(Data, Size);
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
    Fmt : tWAVEFORMATEX;
    Ch  : ^SmallInt;
    i   : Integer;
begin
  Size := 88200;
  GetMem(Data, Size);
  Ch := Data;
  For i := 0 to 22050 do
   begin
    Ch^ := SmallInt(Round(32000 * Sin(20 / pi * i)));
    Ch  := Ptr(Cardinal(Ch) + 2);
    Ch^ := SmallInt(Round(32000 * Sin(20 / pi * i + pi/4)));
    Ch  := Ptr(Cardinal(Ch) + 2);
   end;

  ZeroMemory(@Fmt, SizeOf(Fmt));
  ZeroMemory(@Hdr, SizeOf(Hdr));

  Fmt.wFormatTag      := WAVE_FORMAT_PCM;
  Fmt.nChannels       := 2;
  Fmt.nSamplesPerSec  := 22050;
  Fmt.wBitsPerSample  := 16;
  Fmt.cbSize          := SizeOf(Fmt);
  Fmt.nBlockAlign     := 4;
  Fmt.nAvgBytesPerSec := 88200;

  waveOutOpen(@WO, 0, @Fmt, Cardinal(@TForm1.WaveOutProc),
                 Cardinal(self), CALLBACK_FUNCTION)

  Hdr.lpData         := Data;
  Hdr.dwBufferLength := Size;

  waveOutPrepareHeader(WO, @Hdr, SizeOf(Hdr));
  waveOutWrite(WO, @Hdr, SizeOf(Hdr));
end;

end.




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 3.12.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Ёмаё @ ненадо оказывается.  smile 
Спасибо тебе большое, я уже думал что просто неподерживается просто с классами.  smile 

Это сообщение отредактировал(а) Ak47black - 3.12.2007, 17:08
PM MAIL   Вверх
Ak47black
Дата 3.12.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Хмм ты еше и
Код

    procedure WaveOutProc(uMsg : UINT; dwInstance : PDWORD;
                          dwParam1 : PDWORD; dwParam2 : PDWORD); stdcall;

Поменял.

Это сообщение отредактировал(а) Ak47black - 3.12.2007, 17:41
PM MAIL   Вверх
Alexeis
Дата 3.12.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



  Да чтобы не нужно было сдвигать параметры.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ak47black
Дата 3.12.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



 smile Ну ок вроде роботает.
Надеюсь будет работать стабильно.

Это сообщение отредактировал(а) Ak47black - 3.12.2007, 18:02
PM MAIL   Вверх
MetalFan
Дата 3.12.2007, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Ak47black, а куда оно денеца?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 3.12.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



MetalFan, есть куда. Этот метод вызывается в чужом потоке, потому круг действий которые можно в нем производить ограничен, либо нужно синхронизировать, так что шанс заглючить еще есть  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 3.12.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Цитата(Alexeis @  3.12.2007,  18:24 Найти цитируемый пост)
в чужом потоке

ого) пусть автор про это не забудет)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.