GetLogicalDrive()
-
Hallo Leute,
hier mein Codeint nPos = 0; CString strDrive = "?:"; DWORD dwDriveList = ::GetLogicalDrives (); ///Laufwerke while (dwDriveList) { if (dwDriveList & 1) { strDrive.SetAt(0,0x41 + nPos); ChooseImage(strDrive); } dwDriveList >>= 1; nPos++; }GetLogicalDrives erzeugt ein bitmask, in dem lauter Nullen und Einsen hintereinander stehen, und anzeigen, ob ein gültiges Laufwerk existiert. Eine 1 an der 1. Stelle zeigt an, dass A: existiert usw..
Warum funktioniert dieser Code auf dem einen Rechner und auf dem anderen nicht?
Ich brauche ihn, um ein CTreeCtrl mit den Laufwerken zu füllen.

-
winapi.net - Codeschnipsel - Anzeigen aller Laufwerke
-
Entweder per ::GetLastError() den Fehler letzten Fehler prüfen, oder mal ::GetLogicalDriveStrings(..) probieren.
Shaggy
-
Hallo,
danke erstmal, so weit so gut.
winapi.net kenne ich noch nicht, ist vielleicht ein heißer Tip.@shaggy
Auf meinem Rechner läuft es ja, und ich kann ja nicht auf jedem Rechner, auf dem das Programm laufen soll Visual C++ installieren. Ich könnte allerdings mal ne Version erstellen die GetLastError() anzeigt. stimmt. Dann müsste ich mir den Fehler mailen lassen. Auch OK, aber:
er findet ja ein paar Laufwerke, nur leider eben nicht alle. Ob da GetLastError auch geht?
Mit GetLogicalDriveStrings muss ich es auch noch mal versuchen. Hab es nur kurz gemacht und bin mit den <null>-Zeichen nicht klargekommen. Muss irgendeinen Fehler beim Parsen gemacht haben.
ok, danke noch mal.
-
Hallo Shaggy,
habe das mit GetLogicalDriveStrings noch mal probiert:char buffer[512];
GetLogicalDriveStrings(512,buffer);Dann zeigt er nur a:\ an.
Jetzt kann es eigentlich nur daran liegen, dass char[512] nicht dass richtige ist oder?
-
Hi,
nur noch mal der Vollständigkeit wegen.static LPTSTR buffer; DWORD count = GetLogicalDriveStrings(0,buffer); HANDLE hHeap=GetProcessHeap(); buffer = (LPTSTR)HeapAlloc( hHeap, HEAP_ZERO_MEMORY, (count + 1) * sizeof(TCHAR) ); GetLogicalDriveStrings(count,buffer); for(int i=0;i<count;i++) char e=buffer[i]; HeapFree(hHeap,0,buffer);Jetzt geht es (erstmal weiter)!
-
Warum benützt du HeapAlloc kannst ja auch ein new hernehmen, würd mich einfach mal so als interesse interesieren
-
Schau in die MSDN, dort steht, dass ::GetLogicalDriveStrings(..) die Länge der der Zeichenkette liefert. Die Laufwerkszeichenkette sind durch das Null-Zeichen getrennt. Das ist ja auch das Zeichenkettenendezeichen, insofern zeigt eine Ausgabe nur das erste Laufwerk an.
Auszug aus der MSDN:
The GetLogicalDriveStrings function fills a buffer with strings that specify valid drives in the system.
DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // size of buffer
LPTSTR lpBuffer // pointer to buffer for drive strings
);Parameters
nBufferLength
Specifies the maximum size, in characters, of the buffer pointed to by lpBuffer. This size does not include the terminating null character.
lpBuffer
Pointer to a buffer that receives a series of null-terminated strings, one for each valid drive in the system, that end with a second null character. The following example shows the buffer contents with <null> representing the terminating null character.
c:\<null>d:\<null><null>Return Values
If the function succeeds, the return value is the length, in characters, of the strings copied to the buffer, not including the terminating null character. Note that an ANSI-ASCII null character uses one byte, but a Unicode null character uses two bytes.If the buffer is not large enough, the return value is greater than nBufferLength. It is the size of the buffer required to hold the drive strings.
If the function fails, the return value is zero. To get extended error information, use the GetLastError function.
Remarks
Each string in the buffer may be used wherever a root directory is required, such as for the GetDriveType and GetDiskFreeSpace functions.
-
Jodelahütü,
ich nochmal.Hi Nitromaus,
um der Wahrheit die ehre zu geben, ich hab HeapAlloc aus einem Beispiel aus der MSDN. Meine Meinung zu dem Thema:
LPTSTR is ja schon ein Pointer.
was du vorschlägst, wäreLPTSTR buffer = new LPTSTR[count]; oder LPTSTR* buffer= new LPTSTR[count];Beides klappt nicht. Ich könnte mir vorstellen, dass man für LPTSTR einfach HeapAlloc braucht.
Für char* gab es doch auch Malloc. Jedenfalls, wenn du HeapAlloc nicht benutzt, bekommst du ne Exception in der NTDLL.dll, und die verwaltet ja den Heap.Hi Shaggy,
hab mir die MSDN schon durchgelesen. Da steht aber LPTSTR. Und dann geht das auch.Ähem
///////////count ermittelt wie oben char* buffer1 = new char[count]; GetLogicalDriveStrings(count,buffer1); for( i=0;i<count-5;i+=4) { char e=buffer1[i]; }das geht auch. Aber wehe, du schreibst anstelle von count etwa strlen(buffer1).
Dann bist du "angemeiert", weil unser Freund dann nur bis a:\ kommt, wegen \0.
Witzig ist, dass auch der Debugger nur A:\ anzeigt, obwohl mehr drin ist.
OK, nette Session!!
Hat Spaß gemacht
-
Der Debugger weiß halt nicht, wie der String formatiert ist, er interpretiert ihn als "normalen" String, kommt also nur bis zum ersten '\0'.
Salü,
Shaggy
-
char drives[27][4]; DWORD nrof_present_drives=GetLogicalDriveStrings(27*4,(char *)drives)/4;