GetLogiclaDrives:Bitmask-Abfrage...basics?
-
Hallo. Ich bin an sonem kleinen privaten Projekt dran, in dem ich nun n Treeview brauche.
Und die Basis eines solchen ist ja so gesehen jede Root, die als Logical drive vorkommt, oder?
Und da habe ich bisher:static DWORD drives; drives = GetLogicalDrives(); for (int i=0; i<= sizeof(drives); i++) { if(drives[i] == 0) { MessageBox(NULL,"Invalid drive", "Validation of drives",MB_OK); } else if(drives[i] == 0) { MessageBox(NULL,"Invalid drive", "Validation of drives",MB_OK); } }
Und irgendwie habe ich insgesamt drives bis M.
Davon sind aber A und B nicht angeschlossen, also spuckt er mir die Bitmaske in ner Message Box per itoa als1111111111100
aus.
Nun würd ich gern in Abhängigkeit von nem gesetzen Bit was ausführen,( nämlich GetLogicalString und daraufhin die FindFile varianten...... um damit dann das Treeview zu speisen.... falls ich das so richtig bedacht habe.
Aber irgendwie scheitert diei If-Abfrage. Kann ich son DWORD nichit einfach durchlaufen und checken? Muss ich es erst in n Array of chars konvertieren und dann auf Character "1" oder "0" prüfen?
Nee, ne?
Danke schonmal!
-
-
ach so. IS_BIT!!
Danke schonmal!
Aber: BITSPERBYTE--- mal checken, was das ist.......
Winapi?
... jajaja, das kenn ich doch.
----
Abtippen kann ich auch. Ich wollte eher mal erklärt bekommen, wieso das bei mir nicht haut, oder, in diesem Fall, was diese Defines in Deinem Link sollen...haste nicht mal Lust,mir das mal eingehender zu erklären?
Zum Beispiel:IS_BIT(val, bit) ((val) & (1 << (bit)))
was geschieht denn da? Wird da ne Funktino vordefiniert?
Was tut die denn?
Und oben ist einfach n BYTE als BITSPERBYTE als 8 vordefiniert.
Sonst ist das schon alles klar, aber , ich raff nicht, warum ich die sizeof einem DWORD mit 8 multiplizieren soll, die ja eigentlich schon 32 ist.
Dann habe ich ja 256.......... wat mir ja voll nichts sacht,
ein Dword hat 0-31, also 32 Bits. Und wenn eins gesetzt ist, dann MUSS man es doch irgendwie.........ne....... ist ja kein Array, stimmt!
.....
dann aber will mir immr noch nicht in den Kopf, wieso ich es mit acht multiplizieren soll und was IS_BIT macht?
Wäre für jeden Hinweis dankbar....
----
ok, die Bits werden verschoben.
Bei jedem durchlauf um eins.
Oder?
.---
aber warum mal 8?
-
sag mal bist du besauft?
-
me-S-on schrieb:
Abtippen kann ich auch. Ich wollte eher mal erklärt bekommen, wieso das bei mir nicht haut, oder, in diesem Fall, was diese Defines in Deinem Link sollen...haste nicht mal Lust,mir das mal eingehender zu erklären?
Zum Beispiel:IS_BIT(val, bit) ((val) & (1 << (bit)))
was geschieht denn da? Wird da ne Funktino vordefiniert?
Was tut die denn?ne das is keine funktion sondern ein C-Makro. Es schaut ob bei der Variable val an Position bit ein Bit gesetzt ist oder nicht und wandelt den Ausdruck in einen Integer um (1 für gesetzt, 0 für nicht gesetzt). 1<<10 ist eine bitoperation und "fährt" zum zehnten bit in val (entspricht 1 * 2 ^ 10). mit dem &-operator schaut man nun ob an der 10ten position auch das bit für 1024 (1 * 2 ^ 10 = 1024) gesetzt ist.
me-S-on schrieb:
Und oben ist einfach n BYTE als BITSPERBYTE als 8 vordefiniert.
Sonst ist das schon alles klar, aber , ich raff nicht, warum ich die sizeof einem DWORD mit 8 multiplizieren soll, die ja eigentlich schon 32 ist.nene, sizeof(DWORD) ist 4, da der sizeof() operator nur die größe in Bytes angibt und du daraus die anzahl der Bits errechnen musst. Es wäre ja jetzt möglich (unwarscheinlich aber möglich) dass ein Byte auf deinem System 7 Bits oder 10 Bits groß ist. Dann musst nur noch die Konstante entsprechend abändern anstatt im kompletten code alle 8er durch 10er zu ersetzten um deinen Code wieder bruachbar zu machen.
me-S-on schrieb:
ok, die Bits werden verschoben.
Bei jedem durchlauf um eins.
Oder?Sie werden nicht verschoben, es werden nur der Reihe nach alle Positionen von 0-31 gecheckt.
-
Das mit dem Makro und seinen Bitoperationen war schon verwirrend. Es gibt in C ja auch die verkürzung einer If abfrage mit (bla ? und : bla).
Nur war ich hier nicht so schlüssig, was die meinen, gerade wegen des shiftens.... also in assembler shiftet der ja dadurch.Ähem, ein DWORD is 4 Byte gross.4 Byte sind doch aber 32 Bit.
Also muss ich für jedes Byte mal 8 rechnen, ....... weil Das Programm nicht "weiss" , dass ein Byte acht Bit ist, sondern BYTE lediglich als Typen kennt? Kann nicht sein.......das ist mir n nbisschen schleierhaft.
Es scheint mir sogar unnötig.
Ich meinte bisher, ne Conversion von Byte und Bit rafft das System selber, da eines ja aus dem Anderen besteht, mit anderen Worten, rede ich von nem Byte, muss ich doch irgendwie simpler an dessen Bits kommen, ähnlich wie bei dem LOWORD und HIWORD Makro..... wenne weisst , wie ich das meine.....
-
ähem.
Nun habe ich geschnallt, warum man es so macht, wie man es macht.
Eine bitweise Addition ergibt für jedes Bit des DWORDS 1 , also für die IF-Bedingung true.... der Läufer x ist die jeweilige Stelle, also das jeweilige Bit des DWORDS, welches mit 1 addiert wird, und nur 1 ergibt, wenn im DWORD an der jweiligen Stelle, die der Läufer gerade checkt, das bit ebenfalls gesetzt ist.
Dieses Ergebnis einer bitweisen Addition wird daraifhin 1, ansonsten 0.
( immer noch frage ich mich, WO das gespeichert wird. Beim Assembler in der Quelle... hier wohl auch, und der Übertrag).. egal!
Aber eingewisser Rückgabewert dient dann der if -Bedingung als Anweisung. True ( bit gesetzt, also Addition ergibt 1, oder false, bit nicht gesetzt, Addtition ergibt 0).
Nicht schlecht, diese Idee.
Hätte ich auch selber drauf kommen können!!!!
NUn macht aber GetDriveType fehler: Es wirft mir für jedes Drive FIXED raus, obwohl ich mindestens ein DVD-Aufwerk habe, was als CD-ROm erkannt werden MÜSSTE... und ein Virtuelles CD-Drive.
Das wundert mich.
Weiss jemand von dem Bug, oder ist es gar keiner?
Ist das LG-Lightscribe DVD............ und der Parameter von GetDriveType ist NULL.
-
:> schrieb:
sag mal bist du besauft?
jau, der hole Pe..er hier.
Kommt, kotzt geht und labert reinen katastrophalen Brei!
Pisa!
-
Warum nimmst du eigentlich nicht GetLogicalDriveStrings? Ist doch viel einfacher??
-
Ich bin ja schrittweise dadrangegangen. Und dieser Befehl fiel mir als erster auf, aber das wollte ich so weit ausreizen, wie es ohne den geht und dann umswitchen, Autodidaktik äussert sich bei jedem anders.........