Длина строки байта WriteFile вызывает сбой - PullRequest
1 голос
/ 14 декабря 2010

Проблема

Я пробовал все виды подсчета байтов, пытаясь заставить 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 

1 Ответ

4 голосов
/ 14 декабря 2010

Согласно документации для функции WriteFile :

lpNumberOfBytesWritten [out, необязательно]
[...]
Этот параметр может быть только NULLкогда параметр lpOverlapped не равен NULL.

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

...