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;

{ Wichtiger Hinweis ... }


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

user profile iconHelgeLange 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:

Delphi-Quelltext
1:
PChar(list[10]);                    


sollte es nicht eigentlich so sein:

Delphi-Quelltext
1:
PChar(list.strings[10]);                    

?

(obwohl, wenn ers kompiliert...)

HTH Frank