Bestimmtes Laufwerk herausfinden!
-
Hi Zusammen.
Standartmässig haben die Computeruser ihr Diskettenlaufwerk auf dem A und ihr CD-ROm auf dem D.
Wie kann ich mit MFC herausfinden wo sich das Disketten bzw. CD-ROM Laufwerk befindet?? Kann sein, das ein User mit mehreren Partitionen wie zb. Ich jetzt, das CD-Rom Laufwerk unter dem LFWK-Buchstaben F: haben anstatt D.
Ist das überhaupt möglich?
Oder muss ich wirklich den User selbst bitten den Laufwerksbuchstaben angeben zu lassen?
mfg
Pro
-
Servus,
guckst du: http://www.c-plusplus.net/forum/viewtopic.php?t=80417
Den Quellcode baust du nur noch um. Kannst ja nur auf DRIVE_CDROM und DRIVE_REMOVABLE reagieren. Wie man die Kennbuchstaben ermittelt steht dort auch. Im Prinzip steht dort alles was du benötigst...

*winke*
Hellsgore
-
Oder hiermit:
#include <windows.h> #include <shlwapi.h> // uDrive: // 0 - A:\ // 1 - B:\ // 2 - C:\ // usw. BOOL IsDriveReady(UINT uDrive) { TCHAR szRootPathName[32]; UINT uErrorMode; BOOL bRet; PathBuildRoot(szRootPathName, uDrive); uErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); bRet = GetVolumeInformation(szRootPathName, NULL, 0, NULL, NULL, NULL, NULL, 0); SetErrorMode(uErrorMode); return(bRet); }Ist zwar kein MFC, aber leichter zu handhaben.
-
Dank euch.
Bei dem Code bekomm ich aber, wenn ich GetDriveType(DRIVE_CDROM); ausgeben will folgender Fehler:
C:\Programme\Microsoft Visual Studio\MyProjects\MSP\MSPDlg.cpp(614) : error C2664: 'GetDriveTypeA' : cannot convert parameter 1 from 'const int' to 'const char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style castWarum das??
mfg
Pro
-
Du hast da was in der MSDN übersehen:
GetDriveTypeThe GetDriveType function determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive.
UINT GetDriveType(
LPCTSTR lpRootPathName
);
Parameters
lpRootPathName
[in] Pointer to a null-terminated string that specifies the root directory of the disk to return information about. A trailing backslash is required. If this parameter is NULL, the function uses the root of the current directory.
Return Values
The return value specifies the type of drive. It can be one of the following values.Value Meaning
DRIVE_UNKNOWN The drive type cannot be determined.
DRIVE_NO_ROOT_DIR The root path is invalid. For example, no volume is mounted at the path.
DRIVE_REMOVABLE The disk can be removed from the drive.
DRIVE_FIXED The disk cannot be removed from the drive.
DRIVE_REMOTE The drive is a remote (network) drive.
DRIVE_CDROM The drive is a CD-ROM drive.
DRIVE_RAMDISK The drive is a RAM disk.Das heisst, du rufst das falsch auf.
Probier das mal so ungefähr:if(GetDriveType("c:\\") == DRIVE_CDROM) { MessageBox("Lw C ist ein CD-Lw"); }... viel spass
-
Ja ok Thx.
Funzt.Doch so finde ich das CD-ROM Laufwerk auch nur müühhsaaam raus.
Gibt es nicht eine möglichkeit dies in eine Schleife zu packen welche alle Buchstaben von A-Z durchschaut und wenn es dann zb: E ist, das er dort stoppt und das E: weiterverwendet werden kann ???
Whileschleifen gibt ja ++1; oder so, aber bei Buchstaben???
mfg
Pro
-
?????????????????????????????????
CString strReturn; DWORD dwDrives = GetLogicalDrives(); char szDrive[8]="A:\\"; for(int i=0, j=1; i<26; i++, j*=2) { if(dwDrives & j) { szDrive[0] = i + 'A'; strReturn += szDrive; switch (GetDriveType(szDrive)) { case DRIVE_CDROM: strReturn += "CDROM"; ZiehDerKatzAmSchwanz(); break; case DRIVE_REMOVABLE: strReturn += "Wechseldatentraeger"; RubbelDieKatz(); break; } } }Das Bsp. läuft in einer Schleife und geht von A - Z.
Verstehe nicht so ganz was du willst / meinst !?!?!?*winke*
Hellsgore
-
Nö. Eben nich.
Wenn ich jetzt if(GetDriveType("c:\") == DRIVE_CDROM) hab, klappt das!
Aber ich möchte nicht selbst immer c:\ oder d:\\ oder was auch immer durch GetDriveType abfragen. Ist das net inner schleife möglich?
Denn eigentlich möchte ich es umgekehrt:
DRIVE_CDROM == ?????
Dann:
MessageBox("Das CD-Rom Laufwerk hat den Buchstaben: " + irgend_ne_var + "\nVielen Dank!", "INformation", MB_ICONPROGRAMMERISTDUMM | MB_OKORSPUELEN);

-
CString strReturn; DWORD dwDrives = GetLogicalDrives(); char szDrive[8]="A:\\"; for(int i=0, j=1; i<26; i++, j*=2) { if(dwDrives & j) { szDrive[0] = i + 'A'; strReturn += szDrive; switch (GetDriveType(szDrive)) { case DRIVE_CDROM: MessageBox("Das CD-Rom Laufwerk hat den Buchstaben: " + strReturn + "\nVielen Dank!", "INformation", MB_ICONPROGRAMMERISTDUMM | MB_OKORSPUELEN); break; case DRIVE_REMOVABLE: strReturn += "Wechseldatentraeger"; RubbelDieKatz(); break; } } }Willst mich doch jetzt veräppeln oder?
Vielleicht verstehe ich das jetzt wirklich nicht was du meinst. Aber die for-Schleife dort oben läuft von A - Z durch und fragt ab, ob ein CDROM oder ein Diskettenlaufwerk vorhanden ist. Du kannst ja wenn du lustig bist, bei gefundenem CDROM die Schleife abbrechen.Ansonsten bitte erkläre nochmal was du gerne haben möchtest....
*winke*
Hellsgore
-
Okay.
Wenn ich jetzt nur das da schreibe:MessageBox("Das CD-ROM Laufwerk hat den Buchstaben: " + strReturn, "Information", MB_ICONEXCLAMATION | MB_OK);Wird mir folgendes Ausgegeben: (Screenshot) --> http://www.swiss-portal.com/img_src_prob/hoppla.jpg
Oder muss ich da anders abfragen??
if(strReturn == DRIVE_CDROM) { MessageBox("CD-Rom laufwerk gefunden", "info", MB_OK); } else { // Verprügle die Katz "miau" }Is komisch. I glaub i bin zu blöd?
-
Sage mal, du willst mich doch in den Wahnsinn treiben oder?

void CDeinDlg::SchraubdieKatzandieWand() { CString strReturn; DWORD dwDrives = GetLogicalDrives(); char szDrive[8]="A:\\"; for(int i=0, j=1; i<26; i++, j*=2) { if(dwDrives & j) { szDrive[0] = i + 'A'; strReturn = szDrive; if (GetDriveType(szDrive) == DRIVE_CDROM) { AfxMessageBox("Buchstabe für CDROM" + strReturn); break; //für die Schleife, bricht ab } } } }Was machen wir?
1. Geht alle Laufwerke durch A - Z
2. Überprüft über den Buchstaben mit GetDriveTyp ob das Laufwerk ein CDROM ist
3. Ist das Laufwerk ein CDROM gibt er die MsgBox aus und bricht die Schleife ab
4. Wenn es keins ist läuft er weiter.in strReturn steht dann "[Buchstabe]:\"
-
Jetzt aber mal stark vereinfacht:
CString strLFW = "A:\\"; for(int i=0; i < 26; i++) { strLFW.SetAt(0, 0x41 /* Für 'A' */ + i); if (GetDriveType(strLFW) == DRIVE_CDROM) { AfxMessageBox("Buchstabe für CDROM " + strLFW); break; //für die Schleife, bricht ab } }Bei jedem Durchlauf ändert er den Laufwerksbuchstaben, bis er das CDROM gefunden hat.
-
Ne, in den Wahnsinn treiben will ich Dich nicht, aber mein Programm!!
Kann nicht sein das ein CD-ROM Laufwerk gleich 3 Buchstaben hat???
Wenn ich folgenden Code hab:
CString strReturn, strDrive="A:\\", szBuffer; ULARGE_INTEGER nDummy, nTotalBytes, nFreeBytes; int iBytes = 0; DWORD dwDrives = GetLogicalDrives(); char szDrive[8]="A:\\", szVolName[80], szFSName[80]; bool bQueryVol; strReturn += "[Laufwerke]\n"; for(int i=0, j=1; i<26; i++, j*=2) { if(dwDrives & j) { szDrive[0] = i + 'A'; strReturn += szDrive; bQueryVol = false; if (GetDriveType(szDrive) == DRIVE_CDROM) { AfxMessageBox("Buchstabe für CDROM" + strReturn); break; //für die Schleife, bricht ab } /* switch(GetDriveType(szDrive)) { case DRIVE_UNKNOWN: strReturn += "Unbekannt"; break; case DRIVE_NO_ROOT_DIR: strReturn += "? Kein Root-Verzeichnis ?"; break; case DRIVE_REMOVABLE: strReturn += "Wechseldatentraeger"; bQueryVol = true; break; case DRIVE_FIXED: strReturn += "Festplatte"; bQueryVol = true; break; case DRIVE_REMOTE: strReturn += "Netzwerkverknuepfung"; break; case DRIVE_CDROM: strReturn += "CDROM"; break; case DRIVE_RAMDISK: strReturn += "RAM-Disk"; bQueryVol = true; break; } */ if(bQueryVol) { if(GetDiskFreeSpaceEx(szDrive, &nDummy, &nTotalBytes, &nFreeBytes)) { iBytes = nTotalBytes.QuadPart/1048576; if(iBytes < 1024) szBuffer.Format(", %5d MB Kapazitaet", iBytes); else szBuffer.Format(", %5.1f GB Kapazitaet", (float) iBytes / 1024); strReturn += szBuffer; iBytes = nFreeBytes.QuadPart/1048576; if(iBytes < 1024) szBuffer.Format(", %5d MB frei", iBytes); else szBuffer.Format(", %5.1f GB frei", (float) iBytes / 1024); strReturn += szBuffer; } if(GetVolumeInformation(szDrive, szVolName, 79, NULL, NULL, NULL, szFSName, 79)) strReturn += ", "; strReturn += szFSName; } } }Wird mir folgendes ausgegeben:
Buchstabe für CD-ROM[Laufwerke]
A:\C:\D:\?????? I glaub ich treib mich selbst in den Wahnsinn!!!

mfg
Pro
-
IM SORRY!
Hab jetzt einfach die Funktion
CString strLFW = "A:\\"; for(int i=0; i < 26; i++) { strLFW.SetAt(0, 0x41 /* Für 'A' */ + i); if (GetDriveType(strLFW) == DRIVE_CDROM) { AfxMessageBox("Buchstabe für CDROM " + strLFW); break; //für die Schleife, bricht ab } }eingebaut und den ganz laangen Code mit bool etc AUsgeklammert! jetzt klappts.
THX!
mfg
PRO
-
Das ist doch mal fein.
Der Fehler bei dir dort oben im Code lag daran, dass du strReturn += das Laufwerk gemacht hast. Somit hat er dir A:\, B:\, C:\ bis zum CDROM, jeden Buchstaben dort reingeschrieben. Das strReturn war ja auch ursprünglich dafür gedacht, alle Laufwerke aufzulisten mit deren spezifischen Angaben.
*winke*
Hellsgore