GetFileAttributes READONLY und HIDDEN zugleich



  • Hallo zusammen,

    ich muss leider sagen, dass ich überhaupt kein C++ kann, jedoch eine DLL für mein Programm schreiben musste, da es diese nicht für meine Entwicklungsumgebung gab.

    Zu meinem Problem: Die DLL funktioniert soweit, aber wenn ich jetzt den Wert mit GetFileAttributes einer Datei abfrage, welche schreibgeschützt und versteckt zugleich ist, weiß ich nicht, welchen Wert die Funktion zurück gibt.

    Ich hoffe jemand kann mir dabei weiterhelfen 🙂

    Der Code:

    [...]
    
    GMEXPORT double AttributeGetFunction(char * path2)
    {
    	LPCWSTR lpcwstr_string2 = A2BSTR(path2);
    
    	if (PathFileExists(lpcwstr_string2))
    	{
    		DWORD results = GetFileAttributes(lpcwstr_string2);
    		if (results == FILE_ATTRIBUTE_NORMAL)   { return  1; } // Funktioniert
    		if (results == FILE_ATTRIBUTE_READONLY) { return  2; } // Funktioniert
    		if (results == FILE_ATTRIBUTE_HIDDEN)   { return  3; } // Funktioniert
    		if (results == FILE_ATTRIBUTE_READONLY | results == FILE_ATTRIBUTE_HIDDEN) { return 4; } // Funktioniert nicht
    		if (results == -1 || results == INVALID_FILE_ATTRIBUTES) { return -2; } // War noch nie nötig :D
    	}
    	else
    	{
    		return -1;
    	}
    }
    


  • "Funktioniert nicht" und "ich weiß nicht" sind wenig brauchbar, wenn du Hilfe willst.

    Möglicherweise liegt dein Problem an dem einen | statt zweier ||.



  • Der rückgabewert ist eine bitmask. Um zu testen, ob ein Attribut gesetzt ist, verwende den binären und-operator:

    if(mask & READONLY)
    

    Warum die Funktion double zurückgibt, scheint mir unklar. Auch ein const bei char* schadet nicht. A2BSTR sieht mir nach nem potentiellen Speicherleck aus. Dass ein DWORD (aka unsigned int) negativ sein kann ist mir auch noch nie untergelaufen 😉



  • @manni66 ich habe beide Versionen davon versucht, beide funktionierten nicht.

    @roflo Danke für die Info, wie gesagt habe ich noch nie mit C gearbeitet. So viele verschiedene Variablentypen sind für Anfänger aber auch sehr verwirrend :S
    A2BSTR war die einfachste Funktion, welche ich finden konnte, um einen LPCWSTR zu erzeugen. Was meinst du mit einem potentiellen Speicherleck 😕 😃
    Ein DWORD kann keine negativen Zahlen zurückgeben? D.h. es würde reichen, wenn ich nur nach INVALID_FILE_ATTRIBUTES abfragen würde?

    Habe gerade nochmal die Funktion SetFileAttributes angeschaut, dabei kann man einer Datei mit dem Argument FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN beide Werte geben.
    Glücklicherweise kann man damit auch abfragen, ob beide Werte schon gesetzt sind.

    if (results == FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN) { return 4; }
    

    Funktioniert also 🙂


Log in to reply