c ++ - fast med api getdrivetype

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er lidt fast med denne api GetDriveType(). Hver gang denne api returnerer mig DRIVE\_NO\_ROOT\_DIR, passerer jeg drevbogstaver som denne 'c: \' osv. Selv for mit primære drev 'c: \' returnerer api det samme.


Jeg har ringet GetLogicalDrives() før dette for at hente.


OS: WinXP sp3, NTFS filsystem


kode: compiler VS2005


int main() { 
    bool folder; 
    String * filename; 
    char individualdrive[4],alldrives[100]; 
    memset(alldrives,0,100); 

    GetLogicalDriveStringsA(100,alldrives); 

    for(int i=0;(i<100)&&(alldrives[i]);i+=4) { 
        memset(individualdrive,0,4); 
        strncpy(individualdrive,alldrives+i,4); //extracting individual drive strings.
        if(DRIVE\_FIXED == GetDriveTypeW((LPCWSTR)individualdrive)) 
            getfile((System::String*)individualdrive, filename,folder); }
   return 0; }

Bedste reference


Uden kode må vi gætte. Mine gæt er:



  • Du undlod at undslippe som "C:\".

  • Du sender en ANSI-streng til Unicode-versionen af ​​API'en eller omvendt.



Det er meget svært at se, hvordan API'en kunne mislykkes, medmindre det var en kodningsfejl af denne art.





Efter at have tilføjet kode til dit spørgsmål er det nu klart, at den anden af ​​disse punktpunkter er forklaringen. Du sender ANSI-strengdata til en Unicode API, og det svigter naturligvis ikke.


For at rette op på dette er du sandsynligvis bedst at skifte hele koden for at bruge Unicode-strenge.


Udover Unicode/ANSI-problemerne tror jeg, at bufferhåndteringskoden er mistanke. Jeg ved ikke, hvorfor du antager 4 tegn til et drev. Jeg tror, ​​det er muligt for GetLogicalDriveStrings at returnere ikke-mappede drev.

Andre referencer 1


Du skal passere rodkatalogen på drevet, så det ville være:


GetDriveType( "C:\" );


Bemærk den dobbelte backslash-backlslash er et specielt 'escape' -karakter i C og C ++ string-bogstaver, og skal undslippes.


Følgende kode returnerer 3 for mig, hvilket betyder et fastdrev:


#include <iostream>
#include <windows.h>
using namespace std;

int main() {
    cout << GetDriveType( "C:\" ) << endl;
}


Følgende kode viser alle drev på mit system, sammen med den numeriske værdi for deres type:


#include <windows.h>
#include <iostream>
using namespace std;

int main() {
    const int BUFSIZE = 100;
    char buffer[ BUFSIZE ];
    DWORD n = GetLogicalDriveStrings( BUFSIZE, buffer );
    DWORD i =  0;
    while( i < n )   {
        int t = GetDriveType( &buffer[i] );
        cout << &buffer[i] << " type is " << t << endl;
        i += strlen( &buffer[i] ) + 1 ;
    }
}


producerer:


C: type is 3
D: type is 5
E: type is 5
F: type is 2
Q: type is 3