Entwickler-Ecke
Sonstiges (Delphi) - Simpelste DLL erzeugt 'Ungültige Zeigeroperation'??
JayEff - Sa 23.04.05 16:54
Titel: Simpelste DLL erzeugt 'Ungültige Zeigeroperation'??
Tag Leute.
Ich will für mein Programm eine Dll schreiben, was beim Updaten wohl recht praktisch ist, dann ich dann nur die dll oder die exe updaten muss, die jeweils ja kleiner sind, als wenn ich alle funktionen zusammen in der EXE lassen würde.
Mein Problem: ich wollte mich in der DLL Programmierung mit einem absolut einfachen Programm einarbeiten:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| library RMCfuncs;
{$R *.res}
function get(URL:String):String; begin Result:='was denn...?'; end;
exports get;
begin end. |
Die Hostanwendung sieht etwa so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| unit Unit1;
function get(URL:String):String stdcall; external 'RMCfuncs.dll';
procedure Button1Click(Sender: TObject); begin Edit1.Text:=get('asd'); end; |
Wundert euch nicht, dass meine Funktion einen Parameter hat, den sie nicht verwendet, ich wollte vorher was anderes machen, und dachte, ich versuche das ganze mal so simpel wie möglich zu gestalten.
Gerade getestet: ganz ohne Parameter gibts ne zugriffsverletzung...
Habe ich (Idiot) irgentwie den Wald vor lauter Bäumen nicht gesehen, als ich Asserbads Tutorial überflogen habe? oder was mach ich denn nur falsch...? :'(
uall@ogc - Sa 23.04.05 17:19
wenn du stdcall; benutzt musst du das auch in der dll benutzen!
AXMD - Sa 23.04.05 17:33
Außerdem: keine Strings in DLLs wenn du borlndmm nicht einbindest!
AXMD
JayEff - Sa 23.04.05 17:36
Compiler hat folgendes geschrieben: |
[Fataler Fehler] RMCfuncs.dpr(4): Datei nicht gefunden: 'borlndmm.dcu' |
Vierte zeile:
uses borlndmm;
Sicher, dass die so heist?
Compilieren tut er ja. aber bei aufruf der Funktion kommt deine Zugriffsverletzung. Meine funktion sieht nun so aus:
Delphi-Quelltext
1: 2: 3: 4:
| function get:String stdcall; begin Result:='was denn...?'; end; |
AXMD - Sa 23.04.05 17:44
JayEff hat folgendes geschrieben: |
Compiler hat folgendes geschrieben: | [Fataler Fehler] RMCfuncs.dpr(4): Datei nicht gefunden: 'borlndmm.dcu' |
Vierte zeile: uses borlndmm;
Sicher, dass die so heist? |
Eigentlich ja :gruebel:
JayEff hat folgendes geschrieben: |
Compilieren tut er ja. aber bei aufruf der Funktion kommt deine Zugriffsverletzung. Meine funktion sieht nun so aus:
Delphi-Quelltext 1: 2: 3: 4:
| function get:String stdcall; begin Result:='was denn...?'; end; | |
Darf ich fragen, warum du das stdcall unbedingt brauchst? Da mit der AV liegt 100%ig an den Strings. Ersetz mal durch ShortString und du wirst sehen es geht. Für große Strings brauchst du allerdings den Borland Memory Manager (borlndmm)
AXMD
Muetze1 - Sa 23.04.05 18:28
Moin!
Die BorlandMM.DLL ist der Borland Speichermanager (Heap) und der wird von der Unit ShareMem benutzt. Und wenn du eine neue DLL erstellst (Datei->Neu->Andere...->DLL), dann schreibt dir Delphi nicht umsonst oben in die DLL einen Kommentar rein wo er drauf hinweist: Wenn in der DLL Strings als Parameter übergeben oder als Rückgabewerte zurück gegeben werden, dann muss die Unit ShareMem in der DLL wie auch in deinem Projekt als aller erste Unit eingebunden werden.
MfG
Muetze1
AXMD - Sa 23.04.05 18:32
Muetze1 hat folgendes geschrieben: |
Moin!
Die BorlandMM.DLL ist der Borland Speichermanager (Heap) und der wird von der Unit ShareMem benutzt. Und wenn du eine neue DLL erstellst (Datei->Neu->Andere...->DLL), dann schreibt dir Delphi nicht umsonst oben in die DLL einen Kommentar rein wo er drauf hinweist: Wenn in der DLL Strings als Parameter übergeben oder als Rückgabewerte zurück gegeben werden, dann muss die Unit ShareMem in der DLL wie auch in deinem Projekt als aller erste Unit eingebunden werden.
MfG
Muetze1 |
Sorry :autsch: sharemem einbinden, weil das die borlndmm.dll einbindet - so wars ;)
AXMD
JayEff - Sa 23.04.05 18:33
he he he ook sorry ;) ich hab die dll nicht so erstellt, wollte erst was anderes machen, dann dachte ich.. "ach. machma mal ne dll..." und zack, einfach mal "program" mit "library" ersetzt... ok. mal schaun obs nun klappt *test* ok folgendes Problem: die Zeigeroperation (hab von zeigern kein plan, drum benutze ich sie (bewusst jedenfalls) nie. Mein Source:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function get:String ; external 'RMCfuncs.dll';
procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:= get; end; |
die DLL:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| library RMCfuncs;
{$R *.res} uses ShareMem;
function get:String; begin Result:='was denn...?'; end;
exports get;
end. |
Er SCHREIBT in das Editfeld was er soll, zeigt aber trotzdem die Ungültige Zeigerop.
AXMD - Sa 23.04.05 18:43
Klar, weil du in dem Prog., das die DLL aufruft ebenfalls das "sharemem" brauchst. Und zwar immer als erste in der uses-Klausel! Tja, manchmal zahlt sich das Lesen dieser Kommentare auch aus ;)
AXMD
JayEff - Sa 23.04.05 19:07
oha sehr schön dann klappts ja jetzt. :D Ich hab noch ne 2. Frage die ich jetzt stellen werd (neuer Topic natürlich ^^)
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!