Autor Beitrag
barana
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Sa 12.05.07 15:50 
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...


Zuletzt bearbeitet von barana am Sa 12.05.07 17:33, insgesamt 1-mal bearbeitet
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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 ?

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
barana Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Sa 12.05.07 16:43 
Naja viel Quelltext gibt es da wie gesagt nicht...

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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).

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
barana Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Sa 12.05.07 19:25 
probier mal, rtl / vcl dynamisch zu linken

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
barana Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
barana Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: So 13.05.07 14:30 
Achso... nein hat auch nichts gebracht.
Delphi macht immer noch was es will.
_frank_
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 343
Erhaltene Danke: 1

Win XP
Delphi 3 Prof / Turbo Delphi Explorer
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
PChar(list[10]);					


sollte es nicht eigentlich so sein:
ausblenden Delphi-Quelltext
1:
PChar(list.strings[10]);					

?

(obwohl, wenn ers kompiliert...)

HTH Frank