Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Die Seriennummer einer Festplatte(C++)     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 13:38:05 02.02.2012   Titel:   Die Seriennummer einer Festplatte(C++)            Zitieren

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?

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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;
}
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 13:39:40 02.02.2012   Titel:              Zitieren

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
    }
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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.
Forentroll
Unregistrierter




Beitrag Forentroll Unregistrierter 13:50:41 02.02.2012   Titel:              Zitieren

Du machst deinen Doktor an dieser Funktion, hmmm?
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 14:09:20 02.02.2012   Titel:              Zitieren

nein, cih will nur wissen wieso die Funktion:

GetVolumeInformationW() als Path keine (LPWSTR)path nimmt(Beispiel: (LPWSTR)"C:")
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5553
Beitrag LordJaxom Mitglied 14:23:29 02.02.2012   Titel:              Zitieren

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.
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 3814
Beitrag theta Mitglied 14:25:00 02.02.2012   Titel:              Zitieren

koschka schrieb:
nein, cih will nur wissen wieso die Funktion:

GetVolumeInformationW() als Path keine (LPWSTR)path nimmt(Beispiel: (LPWSTR)"C:")

Weil das
Zitat:
(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
knivil
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 4495
Beitrag knivil Mitglied 14:30:17 02.02.2012   Titel:              Zitieren

Zitat:
Konversion
Denglisch kann ich auch. :)

_________________
If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 14:31:42 02.02.2012   Titel:              Zitieren

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.


Zuletzt bearbeitet von koschka am 14:33:36 02.02.2012, insgesamt 1-mal bearbeitet
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 14:34:27 02.02.2012   Titel:              Zitieren

isOk = GetVolumeInformationW(drive[i], 0, 256, &serialNumber, 0, 0,0, 256);
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5553
Beitrag LordJaxom Mitglied 14:36:09 02.02.2012   Titel:              Zitieren

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.
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 14:39:32 02.02.2012   Titel:              Zitieren

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?
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 14:47:55 02.02.2012   Titel:              Zitieren

ich habe das Problem jetzt gelöst. Dieser Path soll solche Struktur haben "C:\\" und ich hatte "C:".Das war mein Problem.


Zuletzt bearbeitet von koschka am 14:48:11 02.02.2012, insgesamt 1-mal bearbeitet
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 16160
Beitrag C++ Forumbot Forumbot 17:46:33 02.02.2012   Titel:              Zitieren

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.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
C/C++ Forum :: WinAPI ::  Die Seriennummer einer Festplatte(C++)   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.