Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringList An Dll übergeben... (https://www.delphipraxis.net/134411-stringlist-dll-uebergeben.html)

Sir K 21. Mai 2009 16:59


StringList An Dll übergeben...
 
Hallo,

Ich hab n Problem beim übergeben von StringListen an eine Dll.
Und zwar bekomme ich immer eine Zugriffsverletzung wenn ich auf die count eigenschafft zugreifen möchte... weis einer woran das liegt?

Hier mal ein einfaches Beispiel

Quelltext im Programm welches auf die dll zugreift:
Delphi-Quellcode:
var
  StringList1, StringList2: StringList;
  i: Integer;
begin
  StringList1:= TStringList.Create;
  StringList2:= TStringList.Create;

  for i:=0 to Memo1.Lines.Count - 1 do
    StringList1.Add(Memo1.Lines[i]);
 
  // CompareLists ist die function in der dll.
  if CompareLists(StringList1, StringList2) then
    ShowMessage('Die Listen Stimmen überein!');
Quelltext in der Dll:
Delphi-Quellcode:
function CompareLists(List1, List2: TStringList): Boolean; stdcall;
var
  i: Integer;
begin
  Result:=true;
  if List1.Count <> List2. Count then
    Result:=false
  else
   ...
end;

Fridolin Walther 21. Mai 2009 17:02

Re: StringList An Dll übergeben...
 
Ja, daran das Du Objekte nicht so einfach an eine DLL übergeben kannst ;).

Apollonius 21. Mai 2009 17:03

Re: StringList An Dll übergeben...
 
Eigentlich sollte es in diesem speziellen Fall keine Probleme geben. Hast du möglicherweise im Programm das stdcall vergessen?

Sir K 21. Mai 2009 17:05

Re: StringList An Dll übergeben...
 
Jop das steht da... Was genau meinst du mit "diesem speziellen Fall"?

lg

Sir K

Fridolin Walther 21. Mai 2009 17:06

Re: StringList An Dll übergeben...
 
Nunja, nur wenn wirklich die gleichen RTTI verwendet werden, was aber nirgendwo steht. Von daher wäre ich vorsichtig zu sagen, daß in diesem Fall kein Problem besteht.

himitsu 21. Mai 2009 17:07

Re: StringList An Dll übergeben...
 
Grund: bei Klassen hat jedes Modul (EXE und DLL) eine eigene RTTI und da dort die Klassen über Pointer und nicht über Namen verifiziert werden, ist TStringList (EXE) <> TStringList (DLL)

du kannst aber die Eigenschaft .Text als String (mit ShareMem und Co.) oder als PChar übergeben und drüben in eine andere StringList reinfüllen.

Apollonius 21. Mai 2009 17:15

Re: StringList An Dll übergeben...
 
Der Trick liegt darin, die RTTI nicht zu verwenden. Solange man also die Operatoren is und as konsequent nicht verwendet, gibt es auch keine Probleme. Auch nur-Lesen Zugriff auf die Strings ist in Ordnung. Man muss nur darauf achten, die die Strings nicht "einfach so" längerfristig (d.h. nach dem Ende des ursprünglichen Aufrufs) zu speichern; man muss dann UniqueString() verwenden, um eine DLL-eigene Kopie zu erstellen.

mschaefer 21. Mai 2009 18:13

Re: StringList An Dll übergeben...
 
Bei TStringList bietet sich allerdings auch noch der triviale
Weg über die Text-Eigenschaft die ganze Liste als String via
PChar zu übergeben.

Grüße /// Martin

PS: Dafür muß die StringListe dann in der dll neu intantziert
werden und mit die Texteigenschaft dann zugewiesen werden.

Sir K 23. Mai 2009 12:23

Re: StringList An Dll übergeben...
 
Zitat:

Zitat von mschaefer
Bei TStringList bietet sich allerdings auch noch der triviale
Weg über die Text-Eigenschaft die ganze Liste als String via
PChar zu übergeben.

Grüße /// Martin

PS: Dafür muß die StringListe dann in der dll neu intantziert
werden und mit die Texteigenschaft dann zugewiesen werden.

Danke!! Hab das ganze mal so probiert und klappt ohne Probleme und Einschränkungen. xD

Auch allen anderen Danke für die Hilfe!!


lg

Sir K


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz