Autor Beitrag
Physikerpepe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 13.08.04 17:54 
Hallo, ich habe hier eine Dll, die sich nicht ansprechen lassen will :(

Unter VisualBasic wird sie folgendermassen angesprochen und funktioniert auch:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Fr 13.08.04 17:57 
Probiers mal mit der Direktive stdcall:
ausblenden 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

_________________
JSXGraph
Physikerpepe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: 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:

ausblenden 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

_________________
JSXGraph