🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #346856

Re: dispintertface - Jak się dostać do metod

#346856
From: mwitkowski2b
Date: Thu, 15 Nov 2018 09:49
68 lines
5009 bytes
Może rzeczywiście zbyt mało opisałem, przepraszam. Już to naprawiam.

Mam API, dzięki któremu łączę się kamerą i otrzymuję z niej obraz. SDK to zestaw plików DLL oraz API oparte na klasach i interfejsach. Obraz jest 
prezentowany w kontrolce ActiveX (i to jest mój OLE server).
Wczytuje się pliki *.TLB i powstaje całe API. Dysponuję działającymi przykładami w C#, które należy przenieść do Delphi (D2007). Oczywiście nieco inne API powstaje w C#, a nieco inne w Delphi.

Interesuje mnie fragment, za pomocą którego przeprowadza się wyszukiwanie historycznych nagrań (kamera ma swoja pamięć). W C# jest to zrealizowane następująco:
Jest obiekt za pomocą którego wykonuje się poszukiwanie:
  SearchSession f_trackSearch;
przy czym typ SearchSession to typ dzieddziczący po 2 interfejsach:
  public interface SearchSession : ISearchSession, 
                                   _ISearchSessionEvents_Event
drugi z nich ma metody istotne dla procesu poszukiwania:
  public interface _ISearchSessionEvents_Event
  {
  ...
  // czy już wszystko znalazl, wtedy Progress = 100
  event _ISearchSessionEvents_ProgressEventHandler Progress; 
  // jeśli są dostępne nagrania to program tu wchodzi, można je pobrać
  event _ISearchSessionEvents_TrackAvailableEventHandler TrackAvailable; 
  ..
  }

W C# akcja jest prosta:
tworzony jest obiekt do poszukiwania:
  f_trackSearch = mdb.CreateSearchSession(steTrack);
a metody z interfejsu _ISearchSessionEvents_Event są podpięte jako zdarzenia:
  f_trackSearch.TrackAvailable += new Bosch.VideoSDK.GCALib._ISearchSessionEvents_TrackAvailableEventHandler(OnTrackAvailable);
  f_trackSearch.Progress += new Bosch.VideoSDK.GCALib._ISearchSessionEvents_ProgressEventHandler(OnProgress);
uruchom poszukiwanie:
  f_trackSearch.Start();
	

Teraz przenoszę ww. kod do Delphi.
Mam obiekt za pomocą ktorego wykonuje się poszukiwanie:
  f_trackSearch: SearchSession;
przy czym SearchSession to interfejs:
  ISearchSession = interface(IDispatch)
    ['{7EA4139D-5EFE-4BD2-9EF7-211F199DA18C}']
    ...
  end;
W C# mieliśmy:
public interface SearchSession : ISearchSession, _ISearchSessionEvents_Event
a więc brakuje nam podpięcia _ISearchSessionEvents_Event, który zawiera istotne metody Progress() i TrackAvailable()
w powstałym w Delphi po wczytaniu plików *.TLB API jest odpowiadający mu interfejs (istotny fragment):
  _ISearchSessionEvents = dispinterface
    ['{E421B6DF-86ED-47ED-8EFE-54D69BFA4D7D}']
    procedure Progress(Progress: Integer; const pSearchSession: 
    ISearchSession); dispid 1;
    procedure TrackAvailable(Type_: SearchTypeEnum; const pResult: ITrack; 
    const pSearchSession: ISearchSession); dispid 4;
    ...
  end;

Proszę zauważyć, że jest to nie jest interface tylko dispintertface.

Teraz analogiczny kod jak w c#.
Tworzymy obiekt poszukiwania:
  f_trackSearch := mdb.CreateSearchSession(steTrack);
dla 
  var
    f_dispinterface: _ISearchSessionEvents; 
    // interfejs z naszymi brakującymi metodami Progress i TrackAvailable
    // wykonujemy sprzężenie IDispatch z dispinterface wykonując:		
    f_dispinterface := _ISearchSessionEvents(f_trackSearch);
	
I w tym miejscy jest pytanie. Co zrobić, aby wykonały się metody z interfejsu _ISearchSessionEvents: Progress() i TrackAvailable()?
W jaki sposób podpiać je do moich obiektów? Jak z nich skorzytać?
Technical Details
Message-ID: <7c891ed9-bc5c-4a93-ae0a-76282d3bb9cd@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!feeds.phibee-telecom.net!newsfeed.xs4all.nl!newsfeed9.news.xs4all.nl!85.12.16.68.MISMATCH!peer01.ams1!peer.ams1.xlned.com!news.xlned.com!peer01.am4!peer.am4.highwinds-media.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!z5-v6no279292ite.0!news-out.google.com!y103-v6ni413ita.0!nntp.google.com!g188-v6no281611itg.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <6b30eb9c-c06f-40fd-8894-b7ee3c347c59@googlegroups.com>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a24:130b:: with SMTP id 11-v6mr4257179itz.33.1542275345286;        Thu, 15 Nov 2018 01:49:05 -0800 (PST)
X-Received: by 2002:a9d:5403:: with SMTP id j3mr151352oth.2.1542275345174; Thu, 15 Nov 2018 01:49:05 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!feeds.phibee-telecom.net!newsfeed.xs4all.nl!newsfeed9.news.xs4all.nl!85.12.16.68.MISMATCH!peer01.ams1!peer.ams1.xlned.com!news.xlned.com!peer01.am4!peer.am4.highwinds-media.com!peer03.iad!feed-me.highwinds-media.com!news.highwinds-media.com!z5-v6no279292ite.0!news-out.google.com!y103-v6ni413ita.0!nntp.google.com!g188-v6no281611itg.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.delphi
Date: Thu, 15 Nov 2018 01:49:04 -0800 (PST)
In-Reply-To: <6b30eb9c-c06f-40fd-8894-b7ee3c347c59@googlegroups.com>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=91.192.196.210; posting-account=E-z6ZwoAAACYsJZxZNjBCrM3zzyF6Vo_
NNTP-Posting-Host: 91.192.196.210
References: <6b30eb9c-c06f-40fd-8894-b7ee3c347c59@googlegroups.com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <7c891ed9-bc5c-4a93-ae0a-76282d3bb9cd@googlegroups.com>
Subject: Re: dispintertface - Jak się dostać do metod
From: mwitkowski2b@gmail.com
Injection-Date: Thu, 15 Nov 2018 09:49:05 +0000
X-Received-Bytes: 5159
X-Received-Body-CRC: 3040794623
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit