![]() |
TWideStriblist kann nicht zu TStringlist zugewiesen werden
Ich habe mir eine DLL geschrieben mit einigen Datenbankfunktionen und habe mit einer Procedure ein Problem bei der Übergabe.
Ich versuche eine TSringlist Variable von der DLL an das aufrufende Programm zu übertragen. Dabei kommt der Fehler "TWideStriblist kann nicht zu TStringlist zugewiesen werden" Folgendermaßen sieht der Aufruf im Programm aus:
Delphi-Quellcode:
In der DLL sieht es so aus:
Procedure DBListTables(var Liste:TStringList);
external DllPath; . . procedure TForm1.btnListTablesClick(Sender: TObject); var xListe:TStringList; begin lstTables.Clear; // ListBox löschen xListe:=TStringList.Create; DBListTables(xListe); lstTables.Items:=xListe; xListe.Free end;
Delphi-Quellcode:
Wenn beides in einem Programm eingebunden ist, dann funktioniert es.
Procedure ListTables(Var Liste: TStringList);
Var i : Integer; Begin Liste.Clear; Con1.GetTableNames(Liste, False); i := 0; Repeat Begin If (Pos('Cellinfo', Liste[i])) > 0 Then Liste.Delete(i); Inc(i); End; Until Liste.Count = i; i := 0; Repeat Begin Liste[i] := Copy(Liste[i], 1, Length(Liste[i]) - 4); Inc(i); End; Until Liste.Count = i; End; Wenn ich die Procedure über die DLL-Schnittstelle aufrufe, dann kommt beim Aufruf DBListTables(xListe); die Fehlermeldung. Scheinbar gibt es Probleme mit der Übergabe von Stringlisten. Kann mir dabei jemand helfen ? |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
jetzt müssten wir nur noch wissen wo in der DLL der fehler kommt. setz da mal n breakpoint rein.
und/oder versuch den code mal in deine exe zu kopieren und da auszuführen. Und schau ob deine DB(?) eventuell mit widestrings operiert. |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
Der Fehler kommt nicht in der DLL, sondern beim Aufruf der DLL.
In der DLL kann ich keinen Breakpoint setzen, da diese ja extern ist. Wie ich schon erklärt habe, habe ich den SourceCode des DLL-Programmes zusammen mit der Procedure aus meinem Aufrufprogramm in einem Projekt getestet, dort funktioniert es ohne Probleme. Es muss was mit der Übergabe von DLL-Prog an Aufrufprog zu tun haben. Möglicherweise kann man keine Stringlist aus einem DLL-Prog übergeben. |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
Zitat:
Zitat:
|
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
Ich arbeite zum ersten mal mit DLLs und es hat mit den anderen Parametern bisher prima funktioniert, sogar Records mit vielen Variablen drin lassen sich problemlos übergeben.
Die sind aber eben alle genau definiert von der Größe. Bei der Stringlist kann ich beim Aufruf noch nicht wissen wie viele Werte übergeben werden müssen. Gibt es vielleicht eine andere Möglichkeit eine Liste zu übergeben, deren Anzahl der Elemente man beim Aufruf noch nicht kennt ? |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
Verwendest du gemeinsame Laufzeitpackages? Falls nein hast du zweit RTTI's und DLL.TObject <> Exe.TObject und jeder as/is Vergleich/Cast wird fehlschlagen.
|
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
Ich habe beide Programmteile mit dem selben Entwicklungssystem erstellt und die DLL-Datei dann in das andere Projektverzeichnis kopiert.
Was sind RTTIs ? |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
EXE-DLL-übergreifende Dinge im Zusammenhang mit String, TStringList und anderen Sachen ergeben meistens Probleme.
die RTTI und der Standard-Speichermanager arbeiten da jeweils unabhängig und vertragen sich nicht untereinander. es gibt schon mehrere Theman zu diesem Problem ... einfach mal etwas umschauen :stupid: du könntest mal versuchen die Daten z.B. per PChar, statt per TStringList rauszubekommen. z.B. DLL-intern den StringList-Inhalt in den übergebenen Puffer kopieren und dann wieder zurück
Delphi-Quellcode:
[add]
Procedure DBListTables(Liste: PChar; MaxLength: Integer);
external DllPath; DBListTables(@Buffer, BufferSize); xListe := TStringList.Create; xListe.CommaText := {Buffer}; lstTables.Items:=xListe; xListe.Free; // [add] warum so umständlich ??? *grübel* // sollte auch direkt gehn *kopfauftischhau* DBListTables(@Buffer, BufferSize); lstTables.Items.CommaText := {Buffer}; ![]() oder halt mal die Maus über RTTI :zwinker: |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
hmmm. da gibt es natürlich unschöne lösungen, in denen du z.B. hart auf TStringList castest.
Delphi-Quellcode:
Funktioniert garantiert solange, wie alle Module gegen die selbe VCL kompiliert werden (glaube ich).
Procedure ListTables(Var StrangeList: TObject);
Var i : Integer; Liste: TStringList; Begin Liste := TStringList(StrangeList); Liste.Clear; Con1.GetTableNames(Liste, False); i := 0; //... End; Ansonsten: Alles in einen TMemoryStream packen und per WM_COPYDATA die Rohdaten "verschicken". |
Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd
Das Beispiel von himitsu gefällt mir, das werde ich mal ausprobieren.
Als MemoryManager benutze ich FASTMM4 in der DLL, da das mit dem Delphieigenen ja nicht so gut funktionieren soll. Die umständliche Programmierung mit dem erstellen und löschen der Stringlist im Aufrufprogramm habe ich gemacht, da ich das ListenObjekt ja nur im Aufrufprogramm erzeugen und wieder freigeben kann. Wenn ich es in der DLL erstellen und wieder freigeben würde, dann wäre das etwas ungünstig. Wie ist das jetzt mit der Methode von himitsu? Wo wird der Buffer angelegt, im Aufrufprogramm oder in der DLL. Wie sieht das ganze dann in der DLL aus, dort muss die Stringlist mit den Daten ja auch erst noch in Commaseparated umgewandelt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz