GetDriveType sieht NUR DRIVE_FIXED???



  • WOW!
    Du bist genial!
    Wie hast Du das denn so schnell rausgefunden?
    😮 😮 😮

    WUNDERKIND!

    Ohne Scherz jetzt!
    Nehmen wir mal den code auf winapi.net:
    Anzeigen aller Laufwerke.

    http://www.winapi.net/index.php?inhalt=s1

    Das, was in der schleife daraufhin passiert, habe ich nur mit GetDriveType(NULL) und habe den Rückgabewert ausgeweretet.
    Ich meine, es könnte an dem Parameter liegen.
    Nur, welchen übergebe ich denn jeweils, da ich ja für jedes Laufwerk das Root brauche.....
    .. und wie heisst die Root aller Laufwerke... das was im Explorer den Arbeistplatz darstellt?



  • MSDN schrieb:

    lpRootPathName
    Pointer to a null-terminated string that specifies the root directory of the disk to return information about. If lpRootPathName is NULL, the function uses the root of the current directory.

    Du hast dir 11 mal den Typ deines Arbeitslaufwerkes ausgeben lassen - kein Wunder, daß da jedes Mal derselbe Wert zurückgekommen ist 😉

    PS: Unter Windows heißen die Root-Verzeichnisse traditionell "x:", wobei x (mit Unterbrechungen) von A (typischerweise Diskette) bis Z laufen kann. (wie es bei über 26 Laufwerken weitergehen würde, müsste ich nachsehen)

    Edit: Übrigens hätte ich aus deinem Ursprungspost auch nicht mehr ableiten können als "Vermutlich machst du etwas falsch." 😉



  • das klingt ja einleuchtend, 11 mal Arbeitslaufwerk.....
    ahnte ich schon..... nur .... nun übergebe ich welchn Parameter? X?
    oder such ich den, wie im link gezeigt?



  • Wenn du die verwendeten Laufwerksbezeichnungen kennst, kannst du sie in einem Array speichern und der Reihe nach durchtesten. Andernfalls ist es wohl am einfachsten, alle potentiellen Root-Bezeichnungen durchzutesten:

    for(char rootnum='A';rootnum<='Z';++rootnum)
    {
      CString rootname;
      rootname.Format("%c:",rootnum);
      UINT type = GetDriveType(rootname);
      if(type != DRIVE_UNKNOWN) // überspringe alle nicht-existenten Laufwerke
      {
        ... mach was
      }
    }
    

    *sich den Link mal ansieht* Oder du nutzt die dort angegebene Schleifenstruktur mit GetLogicalDrives() und PathBuildRoot(), um alle verfügbaren Laufwerke zu finden.



  • nur würde ich gerne auch die Labels und die Buchstaben haben, was sone Bitmap nicht hergibt........ und DriveType ebenso.
    Allerdings frage ich mich, ob PathRootBuild eine Root zu dem Laufwerk erstellt und es darunter eindordnet oder ob er aus dem Laufwerk eine Root macht.
    und die Labels hätte ich dann immer noch nicht.
    Ich könnte aber die Bitmask anhand der gesetzen bits durchzählen....
    und jedes entspricht ja einer Zahl im Alphabet, adiert + eine Konstante ) keine Ahnung welche ) ergäbe den Ascii-code des Laufwerkes, den ich dann setze.
    GENAU das muss es doch schon als Teil einer Funktino geben, bin dichnicht der Erste, der sowas macht;
    Micorsoft, Adobe ......... 🤡 🤡 🤡

    edited:
    Objekte und Methoden habe ich in der WInaoi bisher nicht eingebaut, will mein Projekt erst Prozedural erstellen und dann umdesignen, weil ich eine Klasse schon für ein Hoverrecztanle versucht habe zu erstellen.. daher:
    Was oder wo ist "rootname" definiert????



  • me-S-on schrieb:

    nur würde ich gerne auch die Labels und die Buchstaben haben, was sone Bitmap nicht hergibt........ und DriveType ebenso.
    Allerdings frage ich mich, ob PathRootBuild eine Root zu dem Laufwerk erstellt und es darunter eindordnet oder ob er aus dem Laufwerk eine Root macht.
    und die Labels hätte ich dann immer noch nicht.

    PathRootBuild() liefert den Namen des Root-Verzeichnisses für das i-te Verzeichnis (wenn ich das richtig verstanden habe, also "A:", "B:" ... "Z:"). Diesen Namen kannst du ausgeben, an GetDriveType() weitergeben oder z.B. verwenden, um das Laufwerk nach einer bestimmten Datei zu durchsuchen.

    Ich könnte aber die Bitmask anhand der gesetzen bits durchzählen....
    und jedes entspricht ja einer Zahl im Alphabet, adiert + eine Konstante ) keine Ahnung welche ) ergäbe den Ascii-code des Laufwerkes, den ich dann setze.
    GENAU das muss es doch schon als Teil einer Funktino geben, bin dichnicht der Erste, der sowas macht;

    Ja, das gibt es - und Microsoft hat die dafür benötigte Funktion (einen Tusch, bitte) "PathRootBuild()" getauft.

    PS: Hast du dir denn das Beipiel mal durchgelesen? (und noch wichtiger - praktisch ausprobiert)

    Was oder wo ist "rootname" definiert????

    Bei meinem Beispielcode? Dort habe ich die Variable 'rootname' direkt am Schleifenanfang als CString verwendet (die MFC-Klasse zur Verarbeitung von Zeichenketten). Falls du keinen CString verfügbar hast, kannst du auch ein char-Array nehmen (und sprintf() anstelle des 'rootname.Format()' Aufrufes).



  • durchgelesen, ja.aber ich habe mit Absicht das PathBuildRoot() weggelassen, weil es in der Shlwapi.h deklariert ist. Diese Headerdatei und deren Lib bedarf einiger Eklärungen, die ich im Netz nicht ausreichend fand:
    Ist diese Datei denn "koscher"... irgendwas in ihr gefällt mir nicht.
    Alleine der Name schon.. klingt blöd aber so habe ich es gehandhabt und dachte, es geht auch anders, aber da habe ich wohl die Funktion ohne den Parameter genommen ( Rechnung ohne Wirt ähnlich).
    ----
    Dann ist also doch PathRootBuild das, was ich händisch vorhatte.
    Ok.
    Nun .... im Treeview würde ich gerne als oberroot den Arbeitsplatz und sein Symbol haben.
    Wie krich ich ihn als root? Ist das das, was du mit "X\:" meintest und ist der Abritsplatz an sich überhaupt n Path den man "bekommen" kann?



  • Ein echtes Verzeichnis ist der Arbeitsplatz nicht, eher eine Art Container, in dem Windows die einzelnen Laufwerke zusammenfasst. Das heißt für dich, du müsstest das Wurzelelement des TreeView gesondert anlegen und anschließend (z.B. in der oben angegebenen Schleife) alle Laufwerke deines Systems als Kindelemente dieser Wurzel einfügen.

    PS: Einen hab' ich noch - du kannst dir auch eine Liste der verfügbaren Laufwerke auch per GetLogicalDriveStrings() holen:

    char dir_list[...];//ausreichend Platz bereitstellen - du benötigst n*4+1 char's für n Laufwerke
    int list_len = GetLogicalDriveStrings(sizeof(dir_list)-1,dir_list);
    for(int i=0;i<list_len;i+=strlen(dir_list+i)+1)
    {
      UINT type = GetDriveType(dir_list+i);
      ...verarbeite type
    }
    


  • danke erstmal. Dieser ganze Fundus wird reichen.....hoff ich!
    👍👎
    vor allem die Idee mit dem selbst angelegtem Container, welcher den Arbeitsplatz als Parentitem darstellt, danke, ich dachte, ich müsste nen virtuellen Pfad ausfindig machen. 🙄
    Bis heute abend, wenn ich nicht weiterkomme, poste ich hier!



  • me-S-on schrieb:

    [...]
    vor allem die Idee mit dem selbst angelegtem Container[...]

    Container ?! ... Hab ich was übersehen ? Wenn Du mit Container das Char-Array meinst, hat das nix mit Containern zu tun - eigentlich.



  • oder doch?
    Zumindest ein Root selber anlegen, welches nichts macht ausser collapsen und expanden und das Symbol eines Pc-Icons hat, woraufhin dann die Laufwerke angezeigt werden.

    Ach, reicht TV_HASBUTTONS etwa nicht aus, um + bzw - zum collapsen und expanden vor die Icons zu tun? Bei mir sind die Zeichen nicht vor den Icons....
    mag aber auch dadran liegen, dass ich denen noch gar keine Child-Items gegeben habe??
    Kann das sein?



  • Das mit dem Container mußte ich auch erstmal verstehen 😉

    Der Punkt ist, unter DOS und Windows sind die Root-Verzeichnisse der einzelnen Laufwerke die oberste Stufe der Hierarchieebene, die physikalisch vorhanden ist. Weil du aber EIN oberstes Wurzelelement brauchst, um alle Laufwerke gemeinsam betrachten zu können, gibt es darüber noch einige "virtuelle Verzeichnisse" wie Desktop, Arbeitsplatz oder Systemsteuerung (die entsprechen keinem physikalisch verfügbaren Verzeichnis auf der Platte). Analog müsstest du vorgehen, wenn du alle deine Laufwerke in einem TreeView anzeigen willst.

    (Ich weiß gar nicht, ob ein TreeView mehr als ein Wurzel-Element haben darf - wenn ja, könntest du auch alle Laufwerke als Wurzeln anlegen)



  • also, keine child-items der Parent-Laufwerkitems per FindNextFile initialisiert........ dann auch keine +/- Symbole....... ok, ein Problem beseitigt.

    Ja, ich will als Oberparent ( ob der nun tatsächlich n Filesystem-root ist, ist ja eigentlich egal fürs Anzeigen.... aber ich ahnte schon richtig: Virtuelle Laufwerke, wie zB der Desktop-ordner........ HA. UNd dabei habe ich von dem Kram erst seit 3 -5 Tagen Ahnung!!!! sichselbstlobt :p )
    Neee.
    Also, ich nehme einfach n PC-Symbol, deklariere es als Parent,nenne es "System", und füge diesem nun die einzelnen Laufwerke als items zu, die erst angezeigt werden, wenn ich das Element expande.--- mal sehen wie das geht, denn das + ist ja erst da, wenn children initialisiert sind.... um aber Speicher zu sparen würde ich die gerne erst initialisieren, wenn ich expande!
    ------
    Diese Laufwerke sind dann die einzelnen Children des Systems;
    diese allerdings sind root für sich genommen, bezüglich auf ihre Kinderelemente...... ihre Subitems. Aber das ist egal.....
    Die Pfade auslesen kommt später.
    ----
    Wichtig ist:
    Warum werden die Laufwerke in meinem TreeView in alphabetisch rückwärtiger Reihenfolge eingefügt?
    Danke bisher!


Anmelden zum Antworten