1

問題

WriteFileを機能させるために、あらゆる種類のバイト数を試してきました。問題は、ファイルに書き込んだ直後にクラッシュすることです。すべてのテキストはファイルにありますが、「プログラムがクラッシュしました。Microsoft に送信しますか??」エラーダイアログがポップアップします。

invoke WriteFile とその下のすべてをコメント アウトすると、プログラムは正常に実行され、クラッシュしません。ただし、WriteFile のコメントを外して、下のすべてのコードをコメントアウトしたままにすると、再び醜い頭が生まれます。コードは以下にあり、誰かが私が見逃したものを見ることができれば、それは大歓迎です:-)

私が試したバイト長。

23、24 (文字列の長さ + null)、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

1 に答える 1

4

WriteFile 関数のドキュメントによると:

lpNumberOfBytesWritten [アウト、オプション]
[...]
このパラメーターは、lpOverlapped パラメーターが NULL でない場合にのみ NULL にすることができます。

lpNumberOfBytesWritten と lpOverlapped の両方が NULL になっています。lpNumberOfBytesWrittenaddr some_writable_variableとして渡すと、機能するはずです。

于 2010-12-14T01:27:12.460 に答える