Autor Beitrag
PattyPur
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: So 18.08.02 13:33 
Hi ich hoffe hoer kann mir einer helfen!
also ich habe eine DLL geschrieben:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
var started, destset:boolean;
    dataset:tstrings;
    destfilename:String;

procedure setDestination; stdcall;
var sd:TSavedialog;
begin
  sd:=Tsavedialog.Create(sd);
  sd.DefaultExt:='txt';
  sd.Filter:='Text-Dateien|*.txt|Alle-Dateien|*.*';
  sd.Title:='Bitte Wählen Sie eine Zieldatei:';
  if sd.execute then begin
    destfilename:=sd.FileName;
    destset:=true;
  end else destset:=false;
  sd.Free;
end;

function start:boolean; stdcall;
begin
  if not started then begin
    dataset.Clear;
    setDestination;
    if destset then begin
      started:=true;
      start:=true;
    end else
      start:=false;
  end else
    start:=false;
end;

procedure stop; stdcall;
begin
  if started then begin
    dataset.SaveToFile(destfilename);
    started:=false;
  end;
end;

procedure addData(id,data:pchar); stdcall;
var line:string;
i:integer;
begin
  line:='';
  if dataset.Count <> 0 then begin
    dataset.Add('==========================================================================================');
    dataset.Add('');
  end;
  for i:= 1 to length(string(id)) do line:=line+'-';
  dataset.Add(string(id));
  dataset.Add(line);
  dataset.Add(String(data));
end;

exports
  start,
  stop,
  addData;

begin
  destset:=false;
  started:=false;
  dataset:=tstrings.Create;
end.


was sie mach soll sollte ganz einfach zu erkennen sein.

nun egal ob ich sie dynamisch oder statisch einbinde bekome ich beim ausführen der funktionen und proceduren einen fehler (EAbstractError)
es ist zwar nicht die Erste DLL die ich programmiere aber ich bekomm es einfach nicht gepeilt wo der fehler liegt.

Die dynamische einbindung sieht so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type
  TStart_F = function: boolean;
  TStop_P = procedure;
  TaddData_p = procedure(id,data:pchar);

var
  Form1: TForm1;
  lib:cardinal;
  Start_F:TStart_F = nil;
  Stop_P :TStop_P= nil;
  addData_p:TaddData_p = nil;

// hier habe ich jetzt für das problem unwichtigen code rausgelassen.

begin
  lib := LoadLibrary('meine.dll');
  if lib <> INVALID_HANDLE_VALUE then begin
    @start_f := GetProcAddress(lib, pchar('start'));
    @stop_p := GetProcAddress(lib, 'stop');
    @addData_p := GetProcAddress(lib, 'addData');
  end else showmessage('ERROR');
end;


im voraus schonmal vielen dank an diejenigen , die hier antworten!
PattyPur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: So 18.08.02 13:52 
ok das Problem mit dem EAbstractError ist gelöst das hing mit der Klasse TStrings zusammen habs in Tstringlist geändert und nu klappt es nun hab ich aber ein anderes problem :

die Übergabe an dei Prozedur addData funzt nicht also übergeben tu ich etwas so:
ausblenden Quelltext
1:
 addData_p(pchar('Hallo'),pchar('text zu hallo'))					

und in der DLL kommt das an :
ausblenden Quelltext
1:
2:
id='|ö'
data='éÀÅùÿëð[Y]ËÀU‹ìÿX¬F'


Zuletzt bearbeitet von PattyPur am So 18.08.02 15:18, insgesamt 1-mal bearbeitet
Ex0rzist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: So 18.08.02 14:43 
Hallo,

ich weiss nicht, ob es hilft,aber beim Erstellen einer DLL steht doch zu Anfang ein von Delphi generierter Kommentar, dass du beim Arbeiten mit Strings die Unit ShareMem einfügen musst. Vielleicht klappt es dann. :?

___________

Ex0rzist
PattyPur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: So 18.08.02 14:57 
hab ich auch schon ausprobiert und ich benutze ja schon absichtlich Pchar als übergabe
trotzdem danke.

So hab noch was rumprobiert und folgendes festgestellt:
wenn ich die dll statisch einbinde stimmen die übergaben die die Dll-proceduren (funktionen) vom hauptprogramm bekommt ruf ich sie aber dynamisch auf stimmen die übergaben nicht.
beispiel:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
library myDll;

{ Important ... }

uses
  SysUtils,
  Classes;
  
{$R *.res}

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result:=zahl1+zahl2;
end;

exports
  addiere;

begin
end.


bei statischem aufruf rechnet die funktion addiere 1+2 = 3
bei dynamischem aufruf x+y = 5860313
(x und y deshalb weil es egal ist was man übergibt)
was aus der DLL zurückkommt ist in sofern korrekt,
da die dll mit den werten rechnet die sie bekommt also das was die dll bekommt ist falsch - warum auch immer.
PattyPur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: So 18.08.02 22:43 
Ok für alle die auch mal darüber stolpern sollten hier die Lösung:
ausblenden Quelltext
1:
2:
3:
4:
type 
  TStart_F = function: boolean; 
  TStop_P = procedure; 
  TaddData_p = procedure(id,data:pchar);

muss folgender maßen abgeändert werden:
ausblenden Quelltext
1:
2:
3:
4:
type 
  TStart_F = function: boolean; stdcall;
  TStop_P = procedure; stdcall;
  TaddData_p = procedure(id,data:pchar); stdcall;


habe nach langem suchen endlich eine stelle gefunden wo stand das man dort das stdcall auch eintragen muss.

vielleicht werden einige jetz denken "ist doch klar" aber manchmal sieht man halt den wald vor lauter bäumen nicht.
Ex0rzist
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: Mo 19.08.02 13:19 
Dieses stdcall hat mich auch schon ein paar Nerven gekostet.
Beim Vergleichen von Code überliest man das eigentlich immer.

Und jetzt funktioniert alles?
_______

Ex0rzist
PattyPur Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 80

Win98, WinXP
Delphi 7
BeitragVerfasst: Mo 19.08.02 14:10 
jo funzt alles so wie es soll!
- danke