Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2017, 11:19   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию Несколько SampleGrabber callback в одном процессе

Здравствуйте.
Написал вот такой класс : https://pastebin.com/8bDruPkh
Юзать так:
Код:
unit Unit_MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, Winapi.ActiveX, Winapi.DirectShow9, Unit_VideoPlayerTest;

function init1:boolean;

const
myclass = 'MyPikrogs';
mytitle = 'Nj4ame';

var
  wc : TWndClassEx;
  form1 : HWND;
  VidPlayers : array of TVideoPlayer;
  Player : TVideoPlayer;

implementation

function AddPlayer(x,y : Integer; prt, MainWnd : HWND) : TVideoPlayer;
var
  n : Integer;
begin
  n := Length(VidPlayers);
  SetLength(VidPlayers,n+1);
  VidPlayers[n] := TVideoPlayer.Create(x,y,prt,MainWnd);
  Result := VidPlayers[n];
end;

function WindowProc1(wnd:HWND; Msg : uint; Wpar:Wparam; Lpar:LPARAM):Lresult; stdcall;
var
  i : Integer;
  ps : TPaintStruct;
Begin
  Result := 0;
  case msg of

    WM_PAINT:
    begin
      BeginPaint(wnd,ps);
      if Length(VidPlayers)>0 then
      for I := 0 to Length(VidPlayers)-1 do
//      begin
        VidPlayers[i].Redraw;
//      end;
      EndPaint(wnd,ps);
    end;

    WM_KEYDOWN:
    begin
      SendMessage(wnd, WM_DESTROY,0,0);
    end;

    WM_CREATE:
    begin
      CoInitialize(nil);
	  {создаём экземпляр}
      player := AddPlayer(0,0,wnd,wnd);
      Player.UseCallback := True; //включаем SampleGrabber callback
      player.fileName := 'video1.mp4';
      player.Play;

	  {создаём еще экземпляр}
      player := AddPlayer(310,0,wnd,wnd);
      Player.UseCallback := True; //и тоже включаем SampleGrabber callback
      player.fileName := 'video2.mp4';
      player.Play;
    end;

    WM_DESTROY:
    Begin
      if Length(VidPlayers)>0 then
      for I := 0 to Length(VidPlayers)-1 do
      VidPlayers[i].Free; //убиваем все экземпляры в массиве
      CoUninitialize;
      unregisterclass(myclass,hinstance);
      postquitmessage(0);
      Result:=0;
      exit;
    End;

    WM_QUERYENDSESSION:
    result := integer(true);
	
    WM_ENDSESSION:
    if wpar=integer(true) then
      sendmessage(wnd,wm_destroy,0,0);

   else Result:=DefWindowProc(wnd,msg,wpar,lpar);
  end;
End;
Если включить callback у обоих экземпляров, то программа вылетит с ошибкой (иногда сразу, иногда через несколько секунд):

а дебаггер встанет здесь: http://i90.fastpic.ru/big/2017/0423/...3c48ac064f.jpg
Почему так происходит? Ошибка в моем коде или вообще так делать нельзя?
BLACK_RAIN вне форума Ответить с цитированием
Старый 26.06.2017, 12:09   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

up _
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько COUNT() в одном запросе Tahoma SQL, базы данных 2 27.01.2017 19:33
PageControl. в процессе проектировки формы создать несколько вкладок. GN_ Помощь студентам 7 15.11.2011 20:56
несколько языков в одном приложении nactuxa Помощь студентам 1 03.02.2011 00:11
Несколько запросов в одном ADOQuery1 XKsandrX Общие вопросы Delphi 3 31.05.2010 14:28
Несколько файлов в одном архиве boostman Общие вопросы Delphi 1 06.12.2009 11:22