Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Arbeitsplatz Laufwerksbuchstaben auslesen (https://www.delphipraxis.net/134719-arbeitsplatz-laufwerksbuchstaben-auslesen.html)

GoTo0815 27. Mai 2009 16:20


Arbeitsplatz Laufwerksbuchstaben auslesen
 
Hallo,

ich habe folgendes Problem:

Ich möchte alle besetzten Laufwerksbuchstaben ermitteln. Leider ist GetLocalDrives nicht in der Lage einen für ein Netzlaufwerk vergebenen Laufwerksbuchstaben zu ermitteln, wenn die Verbindung nicht aktiv ist.
Das Problem schein bekannt und sorg ja bei vielen Rechnern auch für Probleme beim Anschluss von anderen Removables.

Allerdings kann doch so eine Uraltkomponente wie OpenDialog alle Laufwerksbuchstaben des Arbeitsplatzes anzeigen (auch die nicht aktiven Laufwerke).
Also muss doch irgendwie die möglichkeit bestehen, das ganze auf anderen Wege auszulesen. Hat jemand eine Idee, wie ich, ohne visuelle Komponenten zu benutzen, einfach alle Laufwerke des Arbeitsplatzes in eine StringListe einlese?

Gruß

Hendrik

Phoenix 27. Mai 2009 16:26

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Der von Dir angesprochene Dialog ist eigentlich 'nur' ein Aufruf einer Windows-API-Funktion. Der Dialog selber ist der vom Betriebssystem.

DeddyH 27. Mai 2009 16:39

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Ich kann es gerade nicht ausprobieren, aber evtl. hilft Dir MSDN-Library durchsuchenGetLogicalDriveStrings weiter.

GoTo0815 27. Mai 2009 17:26

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Hallo,

@DeddyH
Hilft leider nicht! Wenn ein Laufwerk innerhalb der Windows-Session einmal aktiv war, dann geht das zwar, aber nicht wenn innerhalb der Session nicht verbunden wurde. Dennoch ist dann der Buchstabe belegt.

@Phoenix
Aber welche API Funktion? Und wie kann man das tatsächlich (Code) umsetzen?

Gruß

Hendrik

RWarnecke 27. Mai 2009 17:37

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Hallo Hendrik,

Du könntest das ganze auch über Hier im Forum suchenWMI auslesen. Mit der folgenden Abfrage bekommst Du genau die Laufwerke die auch im Arbeitsplatz angezeigt werden :

SQL-Code:
SELECT Name, Description, DriveType, FileSystem, FreeSpace, Size, VolumeSerialNumber from Win32_LogicalDisk

Satty67 27. Mai 2009 17:52

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Gib GetDriveType (durchlaufen mit allen Laufwerksbuchstaben) auch nicht den korrekten Typ (RemoteDrive)?

RWarnecke 27. Mai 2009 18:10

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Ja, über den Weg kann man es auch machen, so dass man mit GetDriveType die Laufwerke bestimmt und dann nur die Laufwerksbuchstaben ausgibt, wo eine Erkennung statt gefunden hat.

GoTo0815 27. Mai 2009 18:13

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Leider nein. Ich hatte das direkt mit meinem Laufwerk z:\ getestet.
Mit meinem aktiven Laufwerk T:\ funktioniert das wunderbar.

RWarnecke 27. Mai 2009 18:25

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Zitat:

Zitat von HendrikSturm
Leider nein. Ich hatte das direkt mit meinem Laufwerk z:\ getestet.
Mit meinem aktiven Laufwerk T:\ funktioniert das wunderbar.

Ich verstehe im Moment nicht ganz, was Du unter einem aktiven und einem inaktiven Laufwerk verstehst. Den Link den ich Dir in meinem letzten Posting mitgegeben habe, gibt den Typ des Laufwerks aus. Wird kein Laufwerk gefunden, so gibt es nichts zurück.

Satty67 27. Mai 2009 18:32

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Denke ist wohl das leidige Problem, wenn eine Remote-Laufwerk "mit Netzlaufwerk verbinden" an einen lokalen Laufwerksbuchstaben gekoppelt wird. Da wir die Verbindung (trotz Häkchen, bei Start neu verbinden) immer erst verbunden, wenn ein Programm versucht darauf zuzugreifen, was demnach beim ersten Versuch zu einem Fehler führen kann.

Nur NET USE als Autostart-Script funktioniert da, aber auch nur wenn zuvor die Verbindung mit /Delete zurückgesetzt wurde zu 100% (PS: Übrigens ähnlich, wenn mal LTP1 an eine Netzwerkdrucker bindet...)

Ein Versuch ist es Wert, zumindest sollte ein Zugriff vermutet werden und Laufwerk verbinden...
Delphi-Quellcode:
function GetDriveLetters: String;
var
  i : Integer;
begin
  Result := 'CDEFGHIJKLMNOPQRSTUVWXYZ';
  i := Length(Result);
  while i > 0 do begin
    if not DirectoryExists(Result[i]+':\') then
      Delete(Result,i,1);
    dec(i);
  end;
end;
Nicht installierte Diskettenlaufwerke (also A/B) bringen die alte Meldung Retry/Ignore/Cancel in nie dagewesener Verwirrtheit.

GoTo0815 27. Mai 2009 19:49

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
@RWarnecke: mit nicht aktiv meine ich nicht verbunden. Der Laufwerksbuchstabe wird im Arbeitsplatz mit 'z:\' angezeigt. Da das Laufwerk aber inaktiv ist, schlägt bisher alles fehl.

@Satty67 Die Funktion DirectoryExists liefert bei einem inaktiven Laufwerk 'False'. Und wenn der Netzwerkverbindung nicht zu erreichen ist, kann auch keine Verbindung erstellt werden. Der Laufwerksbuchstabe ist aber dennoch belegt.

Will man nun ein Laufwerk per Software mounten, dann darf das nicht auf den belegten Laufwerksbuchstaben geschehen.

Also erneut die Frage: Wie kann man alle belegten (reservierten) Laufwerksbuchstaben ermitteln?

Gruß

Hendrik

Phoenix 27. Mai 2009 19:51

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Zitat:

Zitat von HendrikSturm
@Phoenix
Aber welche API Funktion? Und wie kann man das tatsächlich (Code) umsetzen?

Guck halt in die VCL-Sourcen zu dem Dialog ;-)

GoTo0815 27. Mai 2009 20:00

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
@Phoenix: danke für den Tipp. Das habe ich bereits getan bevor ich die Frage hier gepostet habe :-)
Hab das aber leider nicht finden können.
Außerdem wäre es sicher eine Bereicherung, wenn es hier im Forum gepostet würde.

Satty67 27. Mai 2009 20:14

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
OpenDialog ist in Dialogs.pas, kapselt aber nur das ComControl. Also das Geheimnis wird da nicht gelüftet.

Bleibt noch es mit einer WMI-Abfrage zu versuchen, wie RWarnecke es vorgeschlagen hat... blöd dass man die Situation nicht so einfach am Home-PC nachbilden kann.

Hab' da mal was aus Beispielen zusammen "gehackt"... MS-WMI Type-Bibliothek muss unter Delphi5 vorher importiert werden. Zum Testen, ob es überhaupt inaktive Laufwerke erkennt, sollte es reichen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  DriveTypNames : array[0..6] of String =
    ('Unknown','No Root Directory','Removable Disk',
     'Local Disk','Network Drive','Compact Disc','RAM Disk');
var
  Services    : ISWbemServices;
  ObjectSet   : ISWbemObjectSet;
  ValueSet    : OleVariant;
  ValueSetDisp : IDispatch;
  OleTable    : IEnumVariant;
  OleFields   : OleVariant;
  dwRetrieved : LongWord;
  WQLString   : String;
  DriveTyp    : Integer;
begin
  ListBox1.Clear;

  Services := SWbemLocator1.ConnectServer('','','','','','',0, ValueSet);

  WQLString := 'SELECT Name,VolumeName,DriveType,FileSystem FROM Win32_LogicalDisk';
  ObjectSet := Services.ExecQuery(WQLString,'WQL', 0, ValueSetDisp);
  OleTable := ObjectSet.Get__NewEnum as IEnumVARIANT;

  while OleTable.Next(1, OleFields, dwRetrieved) = 0 do begin

    DriveTyp := VarAsType(OleFields.DriveType, varInteger);
    if not DriveTyp in [0..6] then DriveTyp := 0;
    ListBox1.Items.Add(Format('%s [%s] - %s (%s)',
                              [VarToStr(OleFields.Name),
                               VarToStr(OleFields.VolumeName),
                               DriveTypNames[DriveTyp],
                               VarToStr(OleFields.FileSystem)]));
  end;
end;
(Form mit Button1, ListBox1, und SWbemServices (ActiveX))

oki 28. Mai 2009 08:37

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
Hi,

das Thema lässt sich mit den WNet-Funktionen WNetOpenEnum, WNetEnumResource und WNetCloseEnum lösen. Code dazu gibts hier im Forum.

Gruß oki

GoTo0815 28. Mai 2009 09:43

Re: Arbeitsplatz Laufwerksbuchstaben auslesen
 
@Oki: Genau das habe ich gesucht! Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 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