DLLs einbinden
Re: DLLs einbinden
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...
ein kleines '@' am richtigen Ort macht den Unterschied.
Danke, es funktioniert jetzt... bis auf weiteres...
Re: DLLs einbinden
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:
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...
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...
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: DLLs einbinden
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.
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?
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?
Re: DLLs einbinden
also... nun tut's. Ich bekomme die Parameter nun aus dem Gerät...
"...name '_SDCM_GetGeneralSingle@24';" war der "Trick". Für mich allerdings nicht ganz offensichtlich...
"...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;
-
- 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
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
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
-
- 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
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
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein