AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TWideStriblist kann nicht zu TStringlist zugewiesen werden
Thema durchsuchen
Ansicht
Themen-Optionen

TWideStriblist kann nicht zu TStringlist zugewiesen werden

Ein Thema von Smiley · begonnen am 11. Aug 2008 · letzter Beitrag vom 12. Aug 2008
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#1

TWideStriblist kann nicht zu TStringlist zugewiesen werden

  Alt 11. Aug 2008, 16:32
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:
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;
In der DLL sieht es so aus:

Delphi-Quellcode:
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 beides in einem Programm eingebunden ist, dann funktioniert es.
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 16:42
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 16:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 17:03
Zitat:
Der Fehler kommt nicht in der DLL, sondern beim Aufruf der DLL.
Diese zwei Aussagen schließen sich ja gegenseitig nicht aus.

Zitat:
Möglicherweise kann man keine Stringlist aus einem DLL-Prog übergeben.
Im Zweifelsfalle extrem möglich. Die VCL, die in die Exe einkompiliert ist, erkennt die VCL in der DLL nicht an. Laufzeitpackages helfen. Ein bisschen. DLL-Hölle ftw!
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 17:10
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.173 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 17:18
Verwendest du gemeinsame Laufzeitpackages? Falls nein hast du zweit RTTI's und DLL.TObject <> Exe.TObject und jeder as/is Vergleich/Cast wird fehlschlagen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 17:23
Ich habe beide Programmteile mit dem selben Entwicklungssystem erstellt und die DLL-Datei dann in das andere Projektverzeichnis kopiert.
Was sind RTTIs ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.226 Beiträge
 
Delphi 12 Athens
 
#8

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 17:24
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


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:
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};
[add]
Hier im Forum suchenRTTI
oder halt mal die Maus über RTTI
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#9

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 17:26
hmmm. da gibt es natürlich unschöne lösungen, in denen du z.B. hart auf TStringList castest.

Delphi-Quellcode:
Procedure ListTables(Var StrangeList: TObject);
Var
  i : Integer;
  Liste: TStringList;
Begin
  Liste := TStringList(StrangeList);

  Liste.Clear;
  Con1.GetTableNames(Liste, False);

  i := 0;
  //...
End;
Funktioniert garantiert solange, wie alle Module gegen die selbe VCL kompiliert werden (glaube ich).

Ansonsten: Alles in einen TMemoryStream packen und per WM_COPYDATA die Rohdaten "verschicken".
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: TWideStriblist kann nicht zu TStringlist zugewiesen werd

  Alt 11. Aug 2008, 18:53
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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