2010-12-14 2 views
1

проблемаWriteFile Строка Байт Длина вызывает краш

Я пытался все виды байт имеет значение, пытаясь получить WriteFile работать. Проблема в том, что он сразу же падает после записи в файл. Весь текст находится в файле, но все же «Программа потерпела крах, отправьте Microsoft?» Появится диалоговое окно ошибок.

При комментировании вызова WriteFile и всего под ним программа работает нормально и не падает. Однако, когда я просто раскомментирую WriteFile и оставлю весь код ниже, он прокомментировал это снова, и это уродливая голова. Код ниже, и если кто-то может увидеть что-то, что я пропустил, он очень ценится :-)

Байт Длина Я пробовал.

Я попытался байт длины 23, 24 (длина строки + нуль), 25 (Может быть, я забыл байт), а также только с помощью SIZEOF WRITETEXT и все из них не удалось :-(.

Код

.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 

ответ

4

по the documentation for the WriteFile function:

lpNumberOfBytesWritten [вне, опционально]
[...]
Этот параметр может быть NULL, только если параметр lpOverlapped не равен NULL.

У вас есть как lpNumberOfBytesWritten, так и lpOverlapped как NULL. Пройдите addr some_writable_variable как lpNumberOfBytesWritten, и он должен работать.

+0

Doh! Я прочитал это как «lpNumberOfBytesWritten [out, optional] [...] Этот параметр может быть NULL, только если параметр lpOverlapped равен NULL." (Как и в том, и в том, и в другом, должно быть пустое спасибо. – Zimm3r