Versteh ich nicht, warum funktioniert das so nicht



  • Hallo zusammen,

    wenn ich vor GetComputerName() GetUserName() aufrufe, bekomme ich eine Fehlermeldung "Der Dateiname ist zu lang" ?

    Wenn ich beide Funktionen einzel aufrufe gehen beide, und wenn ich die Reihenfolge ändere geht's auch.

    Ich will's ja einfach nur mal verstehen warum das in dieser Reihenfolge nicht geht.

    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
    {
     char szBuf[128];
     DWORD dwSize = 128;
    
     if ( !GetUserName(szBuf, &dwSize) )
       {
        ShowMessage( "Fehler" );
       }
     Label1->Caption = szBuf;
    
     if ( !GetComputerName(szBuf, &dwSize) )
       {
        ShowMessage( "Fehler" );
       }
     Label2->Caption = szBuf;
    }
    

    Danke für eure Hilfe

    WoWe



  • Liegt vielleicht daran, daß man dwSize vor jeder Funktion neu setzen sollte. Da GetUserName die Anzahl der Zeichen des ermittelten Usernamens in dwSize zurück gibt meint die danach aufgerufene Funktion GetComputerName, sie hätte nur genau diese Anzahl von Zeichen in szBuf zur Verfügung. Je nach dem wie lange die einzelnen Namen sind tritt der Fehler auf oder auch nicht 😉



  • dass liegt daran, dass GetComputerName als buffersize die größe des computernamens ohne null-zeichen am ende zurückliefert und GetUserName die göße mit null-zeichen am ende

    d.h. nach dem aufruf von GetUserName steht in dwSize die länge deines usernamens+1 drin
    diese größe reicht für den aufruf von GetComputerName aus (wenn der name der selbe ist)

    rufst du die beiden funktionen in anderer reihenfolge auf, dann ist deine bufferlänge um 1 zeichen zu klein für den aufruf von GetUserName

    abhilfe kannst du schaffen, wenn du dwSize vor der zweiten funktion wieder groß genug wählst

    Tipp: statt den buffer auf eine feste größe von 128 zu setzen, würde ich lieber die größe auf "MAX_COMPUTERNAME_LENGTH + 1" setzen



  • Vielen Dank. Genau das war's, dwSize neu setzen. Da wär ich ja nicht drauf gekommen, dass mir der Wert in dwSize durch den Aufruf verändert wird.



  • steht übrigens in der hilfe zu GetComputerName und GetUserName drin, dass als rückgabewerte der name und die länge des namens zurückgeliefert werden


Anmelden zum Antworten