Die Seriennummer einer Festplatte(C++)
-
Ich versuche gerade die Seriennummer meiner Festplatte rauszufinden. Ich habe aber das Problem mit der Methode:
GetVolumeInformationW()-----für Unicode
Wenn ich ihr als Path 0 gebe, liefert mir die Methode eine 1 zurück und zeigt die Seriennummer der Festplatte. Wenn ich aber "C:","C:\" ...eingebe, liefert sie mir eine 0...nix gefunden.
Was ist das Problem?
uint32_t UsbStick :: getSerialNumberOfHardDrive(){ uint32_t serialNo=0; //LPWSTR volumeNameBuffer = 0; WCHAR volumeNameSize[256]; uint32_t volumeSerialNumber; //DWORD maximumComponentLength = 0; //LPDWORD fileSystemFlags = 0; LPWSTR systemNameBuffer; WCHAR fileSystemNameSize[256]; uint8_t isOk = 0; DWORD sysFlag = 0; DWORD serialNumb; uint32_t serialNumber; // Retrieves a bitmask representing the currently disk drives. DWORD uDriveMask = GetLogicalDrives(); // Drives LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" , L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" , L"R:" , L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" }; // Calculate the number of drives, LPWSTR is a 32-bit pointer to a string of // 16-bit Unicode characters. uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR ); for(uint8_t i=0 ; i < nDrives ; i++ ) { // The return value of the function specifies the type of drive. UINT type = GetDriveType( drive[i] ); if( ( uDriveMask & 1 ) && ( DRIVE_FIXED_TYPE == type ) ) { isOk = GetVolumeInformationW(0, 0, 256, &serialNumber, 0, 0,0, 256); if(isOk!=0){ //printf("drive = %s, ", dr); printf("Serial = %x\n", serialNumber); } } //shift the bitmask binary right uDriveMask >>= 1; } char drives[256]; GetLogicalDriveStringsW(256, (LPWSTR)drives); const char *ptr = drives; while( *ptr != '\0' && *ptr != '\\' ) { unsigned int driveType = GetDriveTypeW((LPWSTR)ptr); if( driveType == DRIVE_FIXED ) { isOk=GetVolumeInformationW((LPWSTR)ptr, 0, 256, &serialNumber, 0, 0,0, 256); printf("drive = %s, ", ptr); //printf("volumneName = %s, ", volumeName); //printf("fileSystem = %s", fileSystem); printf("Serial = %X\n", serialNumber); } ptr = strchr(ptr, '\0'); ptr += 1; } return serialNo; }
-
char drives[256]; GetLogicalDriveStringsW(256, (LPWSTR)drives); const char *ptr = drives; while( *ptr != '\0' && *ptr != '\\' ) { unsigned int driveType = GetDriveTypeW((LPWSTR)ptr); if( driveType == DRIVE_FIXED ) { isOk=GetVolumeInformationW((LPWSTR)ptr, 0, 256, &serialNumber, 0, 0,0, 256); printf("drive = %s, ", ptr); //printf("volumneName = %s, ", volumeName); //printf("fileSystem = %s", fileSystem); printf("Serial = %X\n", serialNumber); } ptr = strchr(ptr, '\0'); ptr += 1; }
liefert alles richtig, nun ich soll keine chars benutzen.
-
Du machst deinen Doktor an dieser Funktion, hmmm?
-
nein, cih will nur wissen wieso die Funktion:
GetVolumeInformationW() als Path keine (LPWSTR)path nimmt(Beispiel: (LPWSTR)"C:")
-
Weil "C:" kein LPCWSTR sondern ein LPCSTR ist. L"C:" wäre die Wide-Variante davon.
Aus einem LPWSTR einzelne Chars rauszuholen und die Compilerwarnungen durch Casts zu unterdrücken ist übrigens nicht die feine englische Art. Ein LPWSTR ist nämlich ein String aus wchar_t.
-
koschka schrieb:
nein, cih will nur wissen wieso die Funktion:
GetVolumeInformationW() als Path keine (LPWSTR)path nimmt(Beispiel: (LPWSTR)"C:")
Weil das
(LPWSTR)"C:")
ein grobes Problem ist!
Du castest ein const char* (der von einem char[] stammt) in ein const wchar_t*. Leider geht die Konversion zwischen char* und wchar_t* nicht so einfach.Eine Möglichkeit ist die Literale gerade mit wchar_t zu definieren. Das geht so:
L"C:"Noch die bessere Möglichkeit ist die Literale abhängig von deiner Projekt Einstellung entweder mit char* oder wchar_t* anzugeben. Das geht so: _T("C:")
Eine andere Möglichkeit wäre eine echte Konversion vorzunehem, mit folgenden Funktionen:
http://msdn.microsoft.com/en-us/library/bb202786.aspx
http://msdn.microsoft.com/en-us/library/aa450989.aspx
-
Konversion
Denglisch kann ich auch.
-
und wennn mein drive[i] vom Type LPWSTR ist, wie kann ich dafür die Methode:
getVolumeInformationW() anwenden?
Ich schreibe nicht direkt "C:\", die ist bei mir in drive[i] gespeichert.
-
isOk = GetVolumeInformationW(drive[i], 0, 256, &serialNumber, 0, 0,0, 256);
-
drive[i] ist ein wchar_t, ein einzelnes Zeichen.
&drive[i] oder (drive + i) ist die Adresse dieses (und der darauffolgenden) Zeichens und ein LPWSTR.
-
Also wie ich verstehe es sollte gehen:
GetVolumeInformation(drive[i],0,256,&serialNumber,0,0,0,256);
erste Parameter soll LPWSTR sein und er ist es auch. Ich verstehe nicht wieso habe ich eine 0 als Rückgabe?
-
ich habe das Problem jetzt gelöst. Dieser Path soll solche Struktur haben "C:\\" und ich hatte "C:".Das war mein Problem.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.