Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ProcessCallback aus DLL (https://www.delphipraxis.net/26079-processcallback-aus-dll.html)

Steran 17. Jul 2004 18:41


ProcessCallback aus DLL
 
Hallo!

Ich hoffe ich bin hier richtig!
Hab leider nocht nicht viel mit Klassen etc. in Delphi gearbeitet, und stell hier einfach mla die Frage ins Forum:

Ich will ein grabbing tool für meine D-Box schreiben!
Jemand hat eine DLL (WingrabEngine.DLL (dem ein oder andern evtl. bekannt)) erstellt, die ich dann mit meinem Tool ansprechen will!

So weit so gut...grabben funzt auch, nur habe ich das Problem, dass ich es nicht schaffe die Statusinformationen aus der DLL "abzuholen".

Hier hätte ich mal ein VB.NET Beispiel, vielleicht kann mit das jemand bezüglich MessageCallBack für Delphi übersetzen:

Code:
Implements IWinGrabProcessCallback
Public WinGrabLibrary As Object
Public WinGrabGrabControl As Object

Private Sub Form_Load()
   
    Dim video As String
    Dim audio(3) As String

    video = "C:\Recording\Kabel_00.vpes"
    audio(0) = "C:\Recording\Kabel_01.apes"
    audio(1) = "C:\Recording\Kabel_02.apes"

    'z.B. zwei PES-Streams (udrec -pes) zu einem PS-Stream muxen
    Set WinGrabLibrary = CreateObject("WinGrabEngine.WinGrabLibrary")
    Set WinGrabGrabControl = WinGrabLibrary.StartMuxEx(video, -1, -1, audio, "C:\Recording\Kabel.mpg", 0, Me)

End Sub

Public Sub IWinGrabProcessCallback_OnMessage(ByVal sMessage As String)
   
    'Log-Ausgabe (sMessage) wird als String übergeben
   
End Sub

Public Sub IWinGrabProcessCallback_OnStateChange(ByVal sName As String, ByVal sState As String)
   
    'Status-Informationen (z.B. "Muxer" sName, "SCR: 00:00:00.480 Syncs: 1" sState) werden jeweils als String übergeben
   
End Sub
Um das Public Sub IWinGrabProcessCallback_OnMessage(ByVal sMessage As String) bzw. das implements ganz oben gehts mir eigentlich!!!
Hab in meinem Prog schon schon eine procedure eingefügt:
procedure IWinGrabProcessCallback_onMessage(sMessage: String), aber irgendwie wird die procedure nicht aufgerufen, falls daten von der dll kommen!

Irgendwo in meinem Programm (deklarationen?) muss ich ihm sicher noch sagen, dass er die procedure aufrufen soll, oder??

Hoffe das Problem ist nicht zu speziell!

danke für Eure Bemühungen!

MfG

Steran

Steran 19. Jul 2004 18:18

Re: ProcessCallback aus DLL
 
sorry für doppelpost, aber ich habs leider immer noch nicht geschafft!

Was ich noch gefunden hätte:

Der callback ist, wie der name schon sagt, ein callback
soll heißen: Du must selber dieses interface implementieren und eine instanz des interfaces beim startmux aufruf übergeben. Die WinGrabEngine wird dann nach bedarf die methoden des von dir implementierten interfaces aufrufen. Vorsicht: der Callback erfolgt evtl. im context eines anderen threads.


Das hat der Author in einem Forum gepostet, kann mir das jmd. in Delphicode übersetzen bzw. erklären? Leider kann ich ihn persönlich nicht erreichen :-((

ach ja, die DLL hab ich über "Typenbibliothek einbinden" eingebunden, mir wurden dann 3 neue Komponenten in dem ActiveX-Reiter erstellt!

Danke

Steran 27. Jul 2004 19:36

Re: ProcessCallback aus DLL
 
so...da keiner geantwortet hat, erlaube ich mir einfach einen Doppe-Doppelpost mit der Lösung ;-) (evtl. hilfts ja jmd. der die suche benutzt und ein ähnliches prob hat!)


nach den uses:

Code:
  type
  TForm1 = class(TForm, IWinGrabProcessCallBack)
   .
   .
   .
  private
    { Private-Deklarationen }
     procedure OnMessage(const aMessage: WideString); safecall;
     procedure OnStateChange(const aName: WideString; const aState: WideString); safecall;
die proceduren müssen genauso heissen, wie sie im IWinGrabProcessCallBack deklariert wurden!

beim GrabStart geben wir dann als Callback die Klasse an, in der das IWinGrabProcessCallBack Interface eingebunden wurde:

z.B.
Code:
Grab := Form1.WinGrabLibrary.StartMuxGrabEx('192.168.0.25', 68, 69, 'C:\out.m2p', Form1);
im Programm müssen nun die oben deklarierten proceduren vorhanden sein, welche die Aktion ausführen für onMessage z.B. (procedure 1:1 aus wingrabz kopiert!):

Code:
procedure TForm1.OnMessage(const aMessage: WideString); safecall;
var s : string;
begin
  s := '';
  DateTimeToString(s, 'hh:nn:ss.zzz', Now);
  s := Format('%s %s', [s, aMessage]);
  frmStates.mmoMessages.Lines.Insert(0, s);
end;
MfG

Steran


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz