Entwickler-Ecke
Dateizugriff - Problem mit DLL
PattyPur - So 18.08.02 13:33
Titel: Problem mit DLL
Hi ich hoffe hoer kann mir einer helfen!
also ich habe eine DLL geschrieben:
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:
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 - 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:
Quelltext
1:
| addData_p(pchar('Hallo'),pchar('text zu hallo')) |
und in der DLL kommt das an :
Quelltext
1: 2:
| id='|ö' data='éÀÅùÿëð[Y]ËÀU‹ìÿX¬F' |
Ex0rzist - 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 - 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:
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 - So 18.08.02 22:43
Ok für alle die auch mal darüber stolpern sollten hier die Lösung:
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:
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 - 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 - Mo 19.08.02 14:10
jo funzt alles so wie es soll!
- danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 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!