Entwickler-Ecke
Sonstiges (Delphi) - Seltsame Fehler bei DLL Programmierung.
barana - Sa 12.05.07 15:50
Titel: Seltsame Fehler bei DLL Programmierung.
Hallo Leute,
ich reiße mir gerade die Haare vom Kopf :shock: , weil ich einfach nicht vertstehe, wieso Delphi bei mir totalen Mist veranstaltet, sobald es an DLL Programmierung geht.
Ich programmiere eigentlich mit Delphi 7, aber ich hab es auch schon mit Delphi 2006 (auf Win32 Ebene) versucht und selbige Fehler erhalten.
Ich wollte also einfach nur eine function in der DLL schreiben, die eine StringList erzeugt und daraus dann einfach einen beliebigen String als PChar() zurückgibt.
Jetzt tauchen halt plötzlich völlig unnachvollziehbare Fehler auf. Beim Create der Liste kommt eine AccessVioloation. Wieso auch immer, aber nach ein paar Versuchen ist die Violoation wieder weg und die Liste wird erzeugt. Sobald ich jetzt aber einen neuen String einfügn will, springt der Compiler plötlich wild durch die Zeilen und landet beim END; der function.
Genau so ist es auch bei anderen Komponenten. Beim Create kommen immer wieder Violations, die dann nach ein paar Versuchen wieder verschwinden und die DLL macht nicht das, was sie machen soll.
Was mache ich falsch?
Danke im Voraus...
HelgeLange - Sa 12.05.07 15:56
[OrakelMode=ON]
da steht eine 17
[OrakelMode=OFF]
Wie wäre es denn mit etwas Code, wo man sieht, wie die DLL eingebunden ist etc ?
barana - Sa 12.05.07 16:43
Naja viel Quelltext gibt es da wie gesagt nicht...
Delphi-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:
| library Project2;
uses SysUtils, Classes;
function gettext:pchar ; var list : TStringList ; i : byte ; begin try list := TStringList.Create ; for i:=0 to 15 do list.Add('Hallo') ;
Result := PChar(list[10]) ; finally if Assigned(list) then list.free ; end; end;
exports gettext ;
{$R *.res}
begin end. |
HelgeLange - Sa 12.05.07 16:49
Du solltest :
1. Speicher für den PChar anfordern, den eine Variable vom Typ PChar ist nur ein Zeiger auf nichts.
2. Den Speicher auch in der DLL wieder freigeben (also 2. Einsprung schaffen oder den PChar als Var-parameter übergeben und dann füllen, wenn er leer ist bzw. Speicher freigeben, wenn er nicht leer ist).
barana - Sa 12.05.07 17:30
Selbst wenn ich aus der function eine procedure mache und für die Rückgabe einen var Parameter übergebe, bekomme ich trotzdem die Violations beim Create der StringList.
HelgeLange - Sa 12.05.07 19:25
probier mal, rtl / vcl dynamisch zu linken
barana - So 13.05.07 13:10
HelgeLange hat folgendes geschrieben: |
rtl / vcl dynamisch zu linken |
Wenn ich blos wüsste, was das bedeutet.
Ich hab versucht die DLL sowohl statisch als auch dynamisch einzubinden, falls du das meinst.
Aber es ja wohl nicht normal, oder? Oder verhält sich Delphi immer so bei DLL's?
HelgeLange - So 13.05.07 14:18
nein, das Problem könnte die Speicherverwaltung sein.
VCL/RTL dynamisch zu linken beudeuted, dass Du in den Optionen unter Packages das Häkchen mascht, dass BPL dynamisch geladen werden und im Editfeld trägts du eben nur RTL und VCL ein.
barana - So 13.05.07 14:30
Achso... nein hat auch nichts gebracht.
Delphi macht immer noch was es will.
_frank_ - So 13.05.07 15:37
sicher dass der fehler beim create kommt (das create sollte imho auch nicht in den try-block sondern davor)??
weil das sieht mir verdächtig aus:
sollte es nicht eigentlich so sein:
Delphi-Quelltext
1:
| PChar(list.strings[10]); |
?
(obwohl, wenn ers kompiliert...)
HTH Frank
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!