WriteFile String Byte Length 导致崩溃

Posted

技术标签:

【中文标题】WriteFile String Byte Length 导致崩溃【英文标题】:WriteFile String Byte Length causes crash 【发布时间】:2010-12-14 00:00:16 【问题描述】:

问题

我一直在尝试各种字节计数,试图让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】:

根据the documentation for the WriteFile function:

lpNumberOfBytesWritten [输出,可选] [...] 只有当 lpOverlapped 参数不为 NULL 时,该参数才可以为 NULL。

您将 lpNumberOfBytesWritten 和 lpOverlapped 都设置为 NULL。将addr some_writable_variable 作为 lpNumberOfBytesWritten 传递,它应该可以工作。

【讨论】:

噢!我将其读作“lpNumberOfBytesWritten [out, optional] [...] 只有当 lpOverlapped 参数为 NULL 时,此参数才能为 NULL。” (因为两者都必须为空,谢谢。

以上是关于WriteFile String Byte Length 导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Go语言string和byte以及rune

如何将16进制 转换byte数组

nodejs模块——fs模块 WriteFile写入文件

go 类型转换

golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出

[]byte数据保存成图片