Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem beim ansprechen einer DLL
Physikerpepe - Fr 13.08.04 17:54
Titel: Problem beim ansprechen einer DLL
Hallo, ich habe hier eine Dll, die sich nicht ansprechen lassen will :(
Unter VisualBasic wird sie folgendermassen angesprochen und funktioniert auch:
Quelltext
1: 2: 3:
| Declare Function OPENCOM Lib "ELEXS" (ByVal OpenString$) As Integer Declare Sub CLOSECOM Lib "ELEXS" () Declare Sub DTR Lib "ELEXS" (ByVal b%) |
Nun habe ich mir das nach Delphi übersetzt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function Open_com(param: String):Integer; external 'elexs.dll' name 'OPENCOM'; procedure Close_com(); external 'elexs.dll' name 'CLOSECOM'; procedure dtr_com(a: integer); external 'elexs.dll' name 'DTR';
procedure TForm1.Button1Click(Sender: TObject); begin close_com; i := open_com('COM2:'); dtr_com(1); end;
procedure TForm1.Button2Click(Sender: TObject); begin close_com; end; |
die prozedur close_com läuft ohne Probleme (wahrscheinlich weil bei ihr keine Parameter übergeben werden).
open_com und dtr_com funktionieren nicht :(
Wo ist mein Fehler? Habe ich viel. die Typen der Variablen nicht richtig gesetzt? Kenne mich mit VB nicht aus, habe aber irgendwo gelesen, das "$" für String und "%" für Integer steht!
raziel - Fr 13.08.04 17:57
Probiers mal mit der Direktive stdcall:
Delphi-Quelltext
1: 2: 3:
| function Open_com(param: String):Integer; stdcall; external 'elexs.dll' name 'OPENCOM'; procedure Close_com(); stdcall; external 'elexs.dll' name 'CLOSECOM'; procedure dtr_com(a: integer); stdcall; external 'elexs.dll' name 'DTR'; |
evtl. hilft das ja.
raziel
Physikerpepe - Fr 13.08.04 20:23
Sensationell! Das war´s! 1000 Dank! :lol:
Kannst mir viell. in ein zwei Sätzen beschreiben, was diese Direktive bewirkt!?
Pepe
raziel - Fr 13.08.04 20:34
Die bewirkt, dass die Parameter in einer anderen Reihenfolge auf den Stack geworfen werden - und zwar C-like. in Pascal werden die Parameter von links nach rechts auf den Stack gepusht, in C von rechts nach links.
Allerdings frage ich mich gerade, wie das bei dir so wichtig sein kann, da eh nur ein Parameter übergeben wird... :gruebel: :mrgreen:
[edit] Mir is grad wieder eingefallen: Die Standarddirektive in Pascal ist
register (siehe unten) und da werden Parameter in Registern übergeben. Deshalb kam in den DLL Funktionen nichts an![/edit]
Es gibt auch noch andere Direktiven:
Delphi-Hilfe hat folgendes geschrieben:
1: 2: 3: 4: 5: 6:
| Direktive Parameterreihenfolge Bereinigung Parameterübergabe in Registern? register Von links nach rechts Routine Ja (Delphi Standard) pascal Von links nach rechts Routine Nein cdecl Von rechts nach links Aufrufer Nein stdcall Von rechts nach links Routine Nein safecall Von rechts nach links Routine Nein |
Parameterreihenfolge is klar, Bereinigung heißt, wer dafür verantwortlich ist, dass der Stack aufgeräumt wird (Parameter & lokale Variablen löschen), Parameterübergabe in Registern dürfte auch klar sein.
raziel
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!