2010-12-14 7 views
1

ProblèmeWriteFile chaîne Octet Longueur provoque accident

J'ai essayé toutes sortes d'octets dénombrements essayant d'obtenir WriteFile à travailler. Le problème est qu'il se bloque immédiatement après avoir écrit dans le fichier. Tout le texte est dans le fichier, mais le "Un programme a planté, envoyer à Microsoft ??" La boîte de dialogue d'erreur s'affiche. Lorsque vous commentez l'appel de WriteFile et tout ce qui se trouve en-dessous, le programme s'exécute correctement et ne plante pas. Cependant, quand je décommode juste WriteFile et laisse tout le code ci-dessous, il fait remarquer que c'est de nouveau la tête laide. Le code est ci-dessous et si quelqu'un peut voir quelque chose que j'ai manqué, il est très apprécié :-)

Longueur des octets J'ai essayé.

J'ai essayé longueurs d'octets de 23, 24 (longueur de la chaîne + null), 25 (Peut-être que j'oublièrent un octet), et aussi à l'aide SIZEOF WriteText et tous ont échoué :-(.

code

.386 
.model flat,stdcall 
option casemap:none ; Case Sensitive 

; Windows 
include \masm32\include\windows.inc 

; Kernel32 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 

.data 
FilePath   db "C:\test.txt",0 
WriteText  db "This is some test text." 

.code 
start: 

; Edit a file 

invoke CreateFile, addr FilePath, GENERIC_WRITE, FILE_SHARE_WRITE or FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL 
push eax ; save the file handle 

; This works other than the crashing, any number less then 23 
; and the file has some of the text clipped 
; any larger and NUL is appended until the byte count is matched. 
invoke WriteFile, eax, addr WriteText, 23, NULL, NULL 

pop eax 
push eax 

invoke CloseHandle, eax 

invoke ExitProcess, 0 
end start 

Répondre

4

Selon the documentation for the WriteFile function:

lpNumberOfBytesWritten [out, facultatif]
[...]
Ce paramètre peut être NULL uniquement lorsque le paramètre lpOverlapped n'est pas NULL.

Vous avez deux lpNumberOfBytesWritten et lpOverlapped comme NULL. Passez addr some_writable_variable comme lpNumberOfBytesWritten et cela devrait fonctionner.

+0

Doh! J'ai lu cela comme "lpNumberOfBytesWritten [out, optionnel] [...] Ce paramètre peut être NULL seulement lorsque le paramètre lpOverlapped est NULL." (Comme dans les deux doivent être nul merci. – Zimm3r