AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TDirectory.GetLogicalDrives

Ein Thema von Willie1 · begonnen am 11. Nov 2020 · letzter Beitrag vom 19. Nov 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: TDirectory.GetLogicalDrives

  Alt 18. Nov 2020, 01:39
Funktionell stimmt es ja, aber TAnsiStrings und Dest.Add(string(...)) passt ja garnicht
und soeinen sinnlosen Fehler hätte ich nicht von den JEDI erwartet, vor allem da der Compiler das eigentlich auch bemängeln sollte. (diese String-Zuweisung an einen AnsiString-Parameter, seit D2009+)


Da hier das Problem eh nur bei der Unicode-Version passieren sollte:
Das ANSI und die string(AnsiString(-Casts weg, schon ergibt das eine PChar-Version. (ab D2009 somit Unicode)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Nov 2020 um 01:42 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TDirectory.GetLogicalDrives

  Alt 18. Nov 2020, 04:38
Hallo,
mir ging es eher um das StrEnd statt StrLen.
Ich glaube der Buffer entspricht nicht Vorgaben.
Aber mit einer lokalen Variable für StrLen ähnlich dem JEDI-Code sollte das rauszufinden sein.
Und wenn das noch schön reproduzierbar ist, sollte der Fehler schnell zu finden sein.

PS: Mein JEDI ist schon ziemlich alt.
Viell. wurdeder String-TypeCastbschon gefixt, falls es ein Fehler ist.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#3

AW: TDirectory.GetLogicalDrives

  Alt 18. Nov 2020, 11:26
mir ging es eher um das StrEnd statt StrLen.
himitsu hatte ja eine Variante mit StrEnd gepostet - es ändert nichts.

Da die Unit ja ein paar zusätzliche Funktionen bereitstellt, kann man kann die Funktion DriveDisplayNames auch so schreiben:
Delphi-Quellcode:
procedure DriveDisplayNames(const List: TStrings);
  {Gets list of display names for all the system's drives and stores in a given
  string list.}

var i: byte;
begin
    for i:= 0 to 25 do begin
        if IsValidDriveNum(i) then
            List.Add(DriveDisplayName(DriveRootPath(i)));
    end;
end;
Das funktioniert bei mir zuverlässig und ohne AV nach dem x-ten Aufruf.

@Willie1:
Such dir einen Weg aus, es sind ja bereits genügend Varianten gepostet worden.

Grüße
Dalai
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
747 Beiträge
 
Delphi 10.1 Berlin Starter
 
#4

AW: TDirectory.GetLogicalDrives

  Alt 18. Nov 2020, 17:13
Hallo,
da hat sich mein Thema verselbständigt. Die Methode hat einen tief versteckten Fehler.
Warum soll ich mich damit herumschlagen. Ich habe eine Lösung siehe # 21.
Willie.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#5

AW: TDirectory.GetLogicalDrives

  Alt 18. Nov 2020, 17:52
Es ist zwar nicht auszuschließen, dass die Funktion MultiSzToStrings einen Fehler hat, aber andererseits haben jetzt mehrere kundige Leute drübergeschaut, rumprobiert und diskutiert und keiner hat ein grundlegendes Problem erkennen können.

Aber meine Variante benutzt diese Funktion eben nicht, um dem Problem aus dem Weg zu gehen. Letztlich ist deine Lösung sehr ähnlich, nur eben gekapselt in der Klasse TDirectory und als Rückgabe TStringDynArray statt TStringList.

Von "Herumschlagen" kann da also keine Rede sein.

Grüße
Dalai
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
747 Beiträge
 
Delphi 10.1 Berlin Starter
 
#6

AW: TDirectory.GetLogicalDrives

  Alt 18. Nov 2020, 18:32
Aber meine Variante benutzt diese Funktion eben nicht, um dem Problem aus dem Weg zu gehen. Letztlich ist deine Lösung sehr ähnlich, nur eben gekapselt in der Klasse TDirectory und als Rückgabe TStringDynArray statt TStringList.
Hallo Dalai, ich wollte eure Kompetenz absolut nicht in Frage stellen.
Du hast Recht, man kan auch TStringList nehmen. Das Abfragen der Lw hab' ich schon mit Delphi 6 unternommen nur die Volume-Namen nicht.

Bleibt gesund und schönen Abend
Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
641 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: TDirectory.GetLogicalDrives

  Alt 19. Nov 2020, 08:44
PS: Mein JEDI ist schon ziemlich alt.
Viell. wurdeder String-TypeCastbschon gefixt, falls es ein Fehler ist.
Ja. Jetzt gibt es in 3 Funktionen in 3 Units:
In JclAnsiStrings.pas steht procedure MultiSzToStrings(const Dest: TJclAnsiStrings; const Source: PAnsiMultiSz);
In JclWideStrings.pas steht procedure MultiSzToStrings(const Dest: TJclWideStrings; const Source: PWideMultiSz);
In JclStrings.pas steht procedure MultiSzToStrings(const Dest: TStrings; const Source: PMultiSz);

Und in keiner der Varianten werden Strings gecastet.
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:47 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