Article View: pl.comp.lang.delphi
Article #346856Re: dispintertface - Jak się dostać do metod
From: mwitkowski2b
Date: Thu, 15 Nov 2018 09:49
Date: Thu, 15 Nov 2018 09:49
68 lines
5009 bytes
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-mailReferences:
<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