DLLs einbinden

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: DLLs einbinden

Beitrag von Theozh »

aha... ahnte ich's doch, dass es an mir liegt...
ein kleines '@' am richtigen Ort macht den Unterschied.
Danke, es funktioniert jetzt... bis auf weiteres...

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: DLLs einbinden

Beitrag von Theozh »

sorry, ich muss Euch noch mal belästigen:

Eine etwas komplexere Funktion lautet in der Doku:

int SDCM_GetGeneralSingle (char *electronic[9], int *channels, int *pixels, int *preheat, int *tint, float fit[5])

Wie übernehme ich die Funktionsdefinition in FreePascal?

Meine Interpretation der Parameter:

Code: Alles auswählen

 
type
  AElectronic = array[1..9] of char;
  Afit = array[1..5] of double;  // oder single? woher soll ich das wissen?
 
function SDCM_GetGeneralSingle(Electronic: Pointer; Channels,Pixels,Preheat,Tint:Pinteger; Fit: Afit): integer; stdcall; external InsionDLL name '_SDCM_GetGeneralSingle@144';
...
var Electronic: AElectronic;
    i,Channels,Pixels,Preheat,Tint: integer;
    Fit: Afit;
 
i:= SDCM_GetGeneralSingle(@Electronic,@Channels,@Pixels,@Preheat,@Tint,Fit);
 

Es kommt die Fehlermeldung Funktion in DLL nicht gefunden.
Woher soll ich wissen wie der korrekte Name zu lauten hat?
Wenn ich die Chars und Integers zusammenzähle komme ich auf 144 Bytes, so vermute ich, dass es heiße müsste... name '_SDCM_GetGeneralSingle@144';
Fehlt da nicht etwas in der Dokumentation? Danke für Hinweise...

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: DLLs einbinden

Beitrag von Socke »

Theozh hat geschrieben:int SDCM_GetGeneralSingle (char *electronic[9], int *channels, int *pixels, int *preheat, int *tint, float fit[5])

Achtung: Ein Array in C ist entspricht nicht einem Array in Pascal. Such dir dazu die Sprachreferenzen heraus.

Theozh hat geschrieben:Woher soll ich wissen wie der korrekte Name zu lauten hat?
Wenn ich die Chars und Integers zusammenzähle komme ich auf 144 Bytes, so vermute ich, dass es heiße müsste... name '_SDCM_GetGeneralSingle@144';
Fehlt da nicht etwas in der Dokumentation? Danke für Hinweise...

Eigentlich sollte das die Dokumentation hergeben. Alternativ sagt dir ein ein Tool wie PE Explorer oder CFF Explorer, welche Funktionen verfügbar sind.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: DLLs einbinden

Beitrag von Theozh »

die DLL habe ich mir mal mit einem HEX-Viewer angesehen und da hatte ich gefunden, dass Definition offenbar hinten eine "@24" benötigt.
Das Muster, das ich zu erkennen glaube, ist, dass man pro Parameter eine @4 spendieren muss. Das macht bei 6 Parametern folglich @24
Mit dem CFF Tool sieht man das auch etwas komfortabler. Danke für den Tipp.

Code: Alles auswählen

function SDCM_GetGeneralSingle(Electronic: Pointer; Channels,Pixels,Preheat,Tint:Pinteger; Fit: Afit): integer; stdcall; external InsionDLL name '_SDCM_GetGeneralSingle@24';

Achtung: Ein Array in C ist entspricht nicht einem Array in Pascal. Such dir dazu die Sprachreferenzen heraus.

Ein Array in C ist kein Array in Pascal??? Was denn dann? Verstehe ich nicht. Ich kenne mich in C gar nicht aus. Welche Sprachreferenzen meinst Du?

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: DLLs einbinden

Beitrag von Theozh »

also... nun tut's. :D Ich bekomme die Parameter nun aus dem Gerät...
"...name '_SDCM_GetGeneralSingle@24';" war der "Trick". Für mich allerdings nicht ganz offensichtlich...

Code: Alles auswählen

...
type
  AElectronic = array[1..9] of char;
  Afit = array[1..5] of single;  // single oder double? Angabe fehlt in Doku der DLL. Double führt allerdings zu unsinnigen Zahlen.
 
function SDCM_GetGeneralSingle(Electronic: Pointer; Channels,Pixels,Preheat,Tint:Pinteger; Fit: Afit): integer; stdcall; external InsionDLL name '_SDCM_GetGeneralSingle@24';
 
implementation
 
procedure TForm1.Button1Click(Sender: TObject);
var Electronic: AElectronic;
    i,Channels,Pixels,Preheat,Tint: integer;
    Fit: Afit;
begin
  i:= SDCM_GetGeneralSingle(@Electronic,@Channels,@Pixels,@Preheat,@Tint,Fit);
  ShowMessage(
  'Electronic: ' + Electronic + #10#13 +
  'Channels: ' + IntToStr(Channels) + #10#13 +
  'Pixels: ' + IntToStr(Pixels)+ #10#13 +
  'Preheat: ' + IntToStr(Preheat)+ #10#13 +
  'Tint: ' + IntToStr(Tint) + #10#13 +
  'Fit1: ' + FloatToStr(Fit[1]) + #10#13 +
  'Fit2: ' + FloatToStr(Fit[2]) + #10#13 +
  'Fit3: ' + FloatToStr(Fit[3]) + #10#13 +
  'Fit4: ' + FloatToStr(Fit[4]) + #10#13 +
  'Fit5: ' + FloatToStr(Fit[5]));
end;   

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: DLLs einbinden

Beitrag von Socke »

Theozh hat geschrieben:

Code: Alles auswählen

  Afit = array[1..5] of single;  // single oder double? Angabe fehlt in Doku der DLL. Double führt allerdings zu unsinnigen Zahlen.
 

Der Datentyp float aus C ist 32 Bit groß; das entspricht in Pascal einem Single.

Theozh hat geschrieben:
Achtung: Ein Array in C ist entspricht nicht einem Array in Pascal. Such dir dazu die Sprachreferenzen heraus.

Ein Array in C ist kein Array in Pascal??? Was denn dann? Verstehe ich nicht. Ich kenne mich in C gar nicht aus. Welche Sprachreferenzen meinst Du?

In einer Sprachreferenz wird erklärt, wie der Compiler den Quelltext versteht: https://www.google.de/search?q=c+sprachreferenz und http://www.freepascal.org/docs-html/ref/ref.html

Der Grundgedanke bei Arrays ist in Pascal und C der gleiche: Ein Array ist eine Abfolge von Variablen des gleichen Datentyps. Auf die einzelnen Variablen kann über einen gemeinsamen Namen und einen Index zugegriffen werden.
Der Unterschied ist, wie die Daten im Speicher abgelegt werden. Pascal speichert zusätzlich zu den eigentlichen Daten noch die Länge des Arrays und einen Referenzzähler (wie viele Variablen zeigen auf diesen Array), während C wirklich nur die Daten hat. Außerdem gibt es in Pascal Unterschiede zwischen den Verschiedenen Array-Typen, siehe http://www.freepascal.org/docs-html/prog/prog.html
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: DLLs einbinden

Beitrag von mschnell »

Socke hat geschrieben:Der Unterschied ist, wie die Daten im Speicher abgelegt werden. Pascal speichert zusätzlich zu den eigentlichen Daten noch die Länge des Arrays und einen Referenzzähler ...

nur bei offenen Arrays. "Normale" Arrays mit fester Länge funktionieren wie in C.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: DLLs einbinden

Beitrag von Socke »

Ja, ich weiß. War aber zu Faul das nochmal zu ändern. Wenn man statische/normale Arrays wie dynamische behandelt, kann man die später leichter austauschen :D
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten