Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktionsaufruf aus einer Headerdatei (https://www.delphipraxis.net/128972-funktionsaufruf-aus-einer-headerdatei.html)

oli_a 10. Feb 2009 13:53


Funktionsaufruf aus einer Headerdatei
 
Hallo,

ich habe ein Verständnisproblem. Ich habe ein USB-Board, welches ich Delphi mit Hilfe einer DLL und der dazugehörigen Headerdatei ansprechen kann. Nun gibt es vom Hersteller eine neue DLL mit anderen Funktionen, welche ich gern nutzen möchte.
Ich stelle die Frage hier, weil der Hersteller bei Supportfragen leider etwas langsam ist.

Diese sehen laut Beschreibung meist so aus:
Zitat:

function SetDefaultGpifParams(MHz48 : Boolean; Divider : Byte; BitWidth : Byte) : Boolean; stdcall;
Dies ruft man einfach mit den gewünschten Parametern auf und fertig. Bsp.:
Delphi-Quellcode:
SetDefaultGpifParams(True, 12, 16);

Ich weiss leider nicht, wie ich folgende Funktion in Delphi richtig aufrufe.
Zitat:

function SetCallBack(CallBack : TUsbDataCallbackProc) : Boolean; stdcall;

Set a callback function. Calling this function before starting streaming action is mandatory. The callback function needs to have the following signature:

procedure Callbackname(pData : pointer; DatLen : DWord; PcToDevice : Boolean); stdcall;

The callback function receives 3 parameters when beeing called:
pData: Pointer to a data array that needs to be read or written depending on stream direction. This can either be a Byte pointer (when Bitwidth = 8) or a Word pointer (when Bitwidth = 16)
DatLen (indicates how many bytes need to be read or written.
IMPORTANT: When streaming is stopped due to an error or on user-request the callback function gets called one time with the parameter DatLen set to zero).
PcToDevice: Depending of the stream direction that you specified when executing the StartStream function, this value will be set to true (Data transfer from computer to usb device) or false (Data transfer from usb device to computer).
Ich habe es so probiert:
Delphi-Quellcode:
var
schreibwort : Word;
begin
schreibwort := 32;
Callback(@schreibwort, 1, True);
SetCallBack(CallBack); //Initialisierung des USB-Boards
end;
Damit bekomme ich einen Zugriffsverletzung als Fehlermeldung.

himitsu 10. Feb 2009 14:03

Re: Funktionsaufruf aus einer Headerdatei
 
ich würd mal grob in diese Richtung tendieren
Delphi-Quellcode:
type TUsbDataCallbackProc = procedure (pData : pointer; DatLen : DWord; PcToDevice : Boolean); stdcall;

function SetCallBack(CallBack : TUsbDataCallbackProc) : Boolean; stdcall;
  external .......

procedure MyCallback(pData : pointer; DatLen : DWord; PcToDevice : Boolean); stdcall;
  begin
    // mach irgendwas
  end;



SetCallBack(MyCallBack);

oli_a 10. Feb 2009 14:17

Re: Funktionsaufruf aus einer Headerdatei
 
also was du geschrieben hast, steht in ähnlicher Form in der Headerdatei, welche ich eingebunden habe.

Delphi-Quellcode:
type
  TUsbDataCallbackProc = procedure(pData : pByte; DatLen : DWord; PcToDevice : Boolean); stdcall;

  function SetCallBack(CallBack : TUsbDataCallbackProc) : Boolean; stdcall; external USB2STREAMDLLNAME

himitsu 10. Feb 2009 14:36

Re: Funktionsaufruf aus einer Headerdatei
 
tja, dann brauchst'e nur noch diese Header-Datei einzubinden und deine Callback-Funktion zu übergeben? :angel2:
Delphi-Quellcode:
procedure MyCallback(pData: pByte; DatLen: DWord; PcToDevice: Boolean); stdcall;
  begin
    // mach irgendwas
  end;

SetCallBack(MyCallBack);

oli_a 10. Feb 2009 14:52

Re: Funktionsaufruf aus einer Headerdatei
 
wie oben beschrieben, hab ich natürlich die headerdatei eingebunden und bereits wie ebenfalls beschrieben, funktionen aus der headerdatei erfolgreich aufgerufen.

nur mit dieser speziellen bekomm ich's mit meinen zugegebenermaßen bescheidenen delphi-skills nicht hin.

NormanNG 10. Feb 2009 14:59

Re: Funktionsaufruf aus einer Headerdatei
 
Hi,

Delphi-Quellcode:
var
schreibwort : Word;
begin
schreibwort := 32;
Callback(@schreibwort, 1, True);
SetCallBack(CallBack); //Initialisierung des USB-Boards
end;
Eine Callback-Funktion wird (normalerweise) nicht selbst aufgerufen,
sondern durch eine DLL.

Du musst also zuerst der anderen DLL mitteilen, was deine Callback-Funktion ist.
Dann rufst du (andere) Funktionen der DLL auf, die sich wiederum bei dir über die
Callback-Funktion melden...

oli_a 10. Feb 2009 15:10

Re: Funktionsaufruf aus einer Headerdatei
 
jetzt check ich's langsam.

Also die
Delphi-Quellcode:
procedure MyCallback(pData: pByte; DatLen: DWord; PcToDevice: Boolean); stdcall;
  begin
    // mach irgendwas
  end;
ist sozusagen, die Callbackfunktion, die durch die DLL aufgerufen wird.
Und mit dem Befehl
Delphi-Quellcode:
SetCallBack(MyCallBack);
sag ich der DLL also, wie diese aussieht.

In der Funktion selber muss ich dann sozusagen die Werte der Variablen pData: pByte; DatLen: DWord; PcToDevice: Boolean bestimmen.
Also:
Delphi-Quellcode:
procedure MyCallback(pData: pByte; DatLen: DWord; PcToDevice: Boolean); stdcall;
  begin
    pData := @Schreib_Daten;
    DatLen := 1;
    PcToDevice := True;  
  end;

NormanNG 11. Feb 2009 08:50

Re: Funktionsaufruf aus einer Headerdatei
 
HI,

Zitat:

In der Funktion selber muss ich dann sozusagen die Werte der Variablen pData: pByte; DatLen: DWord; PcToDevice: Boolean bestimmen.
Fast :wink:

Du muss nur beachten, das die Werte keine var-Parameter sind, also nicht an die DLL zurückgegeben werden.
In DatLen sagt dir die DLL, wie groß das Array ist, auf das pData zeigt.
In PcToDevice sagt dir die DLL, ob du Werte aus dem Array lesen oder in das Array schreiben sollst.

Das hier
Delphi-Quellcode:
procedure MyCallback(pData: pByte; DatLen: DWord; PcToDevice: Boolean); stdcall;
  begin
    pData := @Schreib_Daten;
    DatLen := 1;
    PcToDevice := True;  
  end;
wird also nicht funktionieren.

himitsu 11. Feb 2009 09:31

Re: Funktionsaufruf aus einer Headerdatei
 
hab mir mal die Beschreibung dazu etwas angesehn und es ist eher so:
Delphi-Quellcode:
Procedure MyCallback(pData: PByte; DatLen: DWORD; PcToDevice: Boolean); StdCall;
  Begin
    If PcToDevice Then Begin
      // von PC zu Device
      Move(Schreib_Daten, pData^, DatLen);
    End Else Begin
      // von Device zu PC
      Move(pData^, Lese_Daten, DatLen);
    End;
  End;

Delphi-Quellcode:
Procedure MyWriteCallback(pData: PByte; DatLen: DWORD; PcToDevice: Boolean); StdCall;
  Begin
    Move(Schreib_Daten, pData^, DatLen);
  End;

SetCallBack(MyWriteCallBack);
SetDefaultGpifParams(...);
StartStream(True);

NormanNG 11. Feb 2009 12:08

Re: Funktionsaufruf aus einer Headerdatei
 
Zitat:

Zitat von himitsu
...und es ist eher so...

hab´ ich jetzt etwas anderes behauptet :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 Uhr.
Seite 1 von 2  1 2      

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