WriteFile Laufzeit Fehler



  • Hi,

    Ich will mit WriteFile etwas in ne Datei schreiben und bekomme zwar keine Compilerfehler, aber während der Laufzeit kommt einer. Jetzt hab ich mal den Debugger angeschmissen und der kann mir auch nichts genaueres sagen!

    Der Fehlerhafte Code ist folgender:

    DWORD mdFileHeader = 0xFFFFFF;
    	char *mdFileName = "testmodel";
    
    	WriteFile(hMDFile, (LPCVOID)mdFileName, 12*sizeof(char), NULL, NULL); //<! FEHLER!!
    	WriteFile(hMDFile, (LPCVOID)mdFileHeader, sizeof(LPCVOID), NULL, NULL);
    

    Die zu schreibenden Bytes hab ich absichtlich auf 12*sizeof(char)gesetzt um die Fehlerquelle auszuschließen! Es geht auch mit sizeof(LPCVOID) nicht!

    Fehler ist folgender:
    Eine Ausnahme (erste Chance) bei 0x7c811024 in SceneGraphManager.exe: 0xC0000005: Zugriffsverletzung-Schreibposition 0x00000000.

    Aber ich hab keinen Plan, was ich dagegen tun soll! Das File Handle ist auf jeden Fall korrekt und die Datei existiert auch mit gegebenem Inhalt... nur nachdem sie geschrieben wurde, bleibt das Programm hängen!

    Hat hier jemand schon ähnliches erlebt und behoben?!

    Ich bedank mich im Voraus für die Antworten!

    lg, WirrWar2850.



  • DWORD dwMdFileHeader = 0xFFFFFF;
    TCHAR szMdFileName[] = TEXT("testmodel");
    DWORD dwWrittenBytes = 0;
    
    BOOL fOkay = WriteFile(hMDFile, szMdFileName, lstrlen(szMdFileName) * sizeof(szMdFileName[0]), &dwWrittenBytes, NULL);
    if(!fOkay || dwWrittenBytes != lstrlen(szMdFileName) * sizeof(szMdFileName[0]))
       // Fehler...
    fOkay = WriteFile(hMDFile, (LPCVOID)&dwMdFileHeader, sizeof(dwMdFileHeader), &dwWrittenBytes, NULL);
    if(!fOkay || dwWrittenBytes != sizeof(dwMdFileHeader))
       // Fehler...
    

    Edit: Wobei hier die Null-Terminierung nicht mit in die Datei geschrieben wird - muss man halt beim Auslesen beachten.



  • Okay...

    Vielen Dank! Es funktioniert 🙂 .

    Aber woran lag das jetzt? War einfach meine Anzahl an zu schreibenden Bytes falsch? Oder war da noch mehr?

    Ich würde das Problem auch gerne verstehen, wenn ich auch äußerst dankbar bin, dass du es gelöst hast 😃 .

    lg, WirrWar2850.



  • Deine Zeichenkette mdFileName enthält 9 Zeichen, 10 sind es mit dem abschließenden NULL-Zeichen. Bei WriteFile hast Du aber angegeben, dass 12 Zeichen geschrieben werden sollen. Damit versucht WriteFile, die sich im Speicher der Zeichenkette anschließenden 2 Zeichen zu schreiben. Das ging in die Hose und deshalb die Zugriffsverletzung.



  • Ich würde mal sagen der Fehler war dass er 0 als "pdwBytesWritten" mitgegeben hat. In der Doku steht zwar als Typ "out optional", aber die Adresse (0) und die Zugriffsart (schreiben) in der Fehlermeldung sprechen eher dafür. Und es wäre nicht das erste mal dass in der MSDN ne Funktion falsch dokumentiert ist.



  • Okay, ich schätze mal, der Parameter pdwBytesWritten gibt mir dann zurück, wie viele Bytes tatsächlich geschrieben wurden. Da is dies aber manchmal gar nich wissen will (außer natürlich, die Funktion is so unzuverlässig, dass dies einer ständigen Kontrolle bedarf), isses nur ein zusätzlicher Aufwand und wäre wohl in einer Klasse am besten aufgehoben!

    Ich dank euch allen, dass ihr mein Verständnis einer in meinen Augen nützlichen WinAPI Funktion erweitert habt 😃 .

    lg, WirrWar2805.



  • MSDN schrieb:

    lpNumberOfBytesWritten [out, optional]

    A pointer to the variable that receives the number of bytes written when using a synchronous hFile parameter. WriteFile sets this value to zero before doing any work or error checking. Use NULL for this parameter if this is an asynchronous operation to avoid potentially erroneous results.

    This parameter can be NULL only when the lpOverlapped parameter is not NULL.

    For more information, see the Remarks section.



  • Hupps, OK, dann ist es NICHT falsch dokumentiert 🙂


Log in to reply