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; stdcallexternal 'elexs.dll' name 'OPENCOM';
procedure Close_com(); stdcallexternal 'elexs.dll' name 'CLOSECOM';
procedure dtr_com(a: integer); stdcallexternal '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