gpt4 book ai didi

c++ - Win32 写入文件 : Access Viloation and Error 1784

转载 作者:太空狗 更新时间:2023-10-29 23:53:05 24 4
gpt4 key购买 nike

以下代码存在两个问题。首先,我一直在这个论坛和其他各种论坛上搜索我的 1784 错误代码的答案,但我尝试的一切都失败了。我在 stackoverflow 上检查过的两个线程是 WriteFile returning error 1784BlockWrite I/O Error 1784 .我已经检查了这个论坛上的其他一些人,但我现在不记得到底是什么了。

我正在尝试将一个结构数组保存到一个空的二进制文件中。第一个问题是,如果我的大小变量(nNumberOfBytesToWrite 参数)小于 99000 字节,我就会遇到访问冲突。这个数字跳来跳去。有一段时间,当我测试它时,如果它是 99,999 字节而不是 100,000 字节,就会发生访问冲突。当然,我最终想做的是将大小设置为整个数组的大小。处理该问题的原始代码现在已被注释掉,因此我可以使用各种尺寸进行测试。

发生的第二件事(如果我没有遇到访问冲突)是我收到错误代码 1784 并且 WriteFile 每次都失败。正如关于该主题的其他主题所述,这在 MSDN 上定义为 ERROR_INVALID_USER_BUFFER 并且描述为“提供的用户缓冲区对于请求的操作无效”。我查看了 MSDN 自己的打开文件的示例 ( http://msdn.microsoft.com/en-us/library/windows/desktop/bb540534%28v=vs.85%29.aspx ) 并尝试了一些基于他们的代码的变体,但似乎没有任何效果。

这个问题可能非常菜鸟,我确信我忽略了一些简单得可笑的东西,但如果有人有建议,他们将不胜感激。

case IDM_SAVE1:
{
HANDLE hFile = CreateFile("MineSave.mss", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
int test_buffer[] = {1,2,3,4,5,6,7,8,9,10};

if(hFile != INVALID_HANDLE_VALUE)
{
BOOL bSuccess;
DWORD size = 100000; //DWORD size = (((sizeof(tile)) * tiles_total));
LPDWORD bytes_written = 0;
bSuccess = WriteFile(hFile, test_buffer, size, bytes_written, NULL);
if(bSuccess)
{
MessageBox(hwnd, "File saved successfully.", "Great Job!", MB_OK);
}
else
{
DWORD error = GetLastError();
MessageBox(hwnd, "Could not write to file.", "Error", MB_OK);
}

CloseHandle(hFile);
}
else
{
MessageBox(hwnd, "Could not create file.", "Error", MB_OK);
}
}
break;

最佳答案

您的缓冲区大小为 10 个整数,在 Windows 上为 40 个字节。您正在尝试从该缓冲区写入 100,000 个字节。那是未定义的行为,缓冲区溢出。因此访问冲突。

您传递的值不得大于 sizeof(test_buffer) ,即 40 , 至 nNumberOfBytesToWrite WriteFile 的参数.

您需要在一个循环中写入此文件,一次写入 40 个字节,直到您写入所需的字节数为止。也许是这样的:

BOOL bSuccess = TRUE;
DWORD bytesRemaining = 100000;
while (bSuccess && bytesRemaining>0)
{
DWORD bytesToWrite = std::min(sizeof(test_buffer), bytesRemaining);
DWORD bytesWritten;
bSuccess = WriteFile(hFile, test_buffer, bytesToWrite, &bytesWritten, NULL);
bytesRemaining -= bytesToWrite;
}
if (!bSuccess)
{
//handle error;
}

一次写入 40 个字节非常慢。您会发现每次调用 WriteFile 时写入几 KB 会更有效率。 .

请注意,您不能通过 NULLlpNumberOfBytesWritten参数,如果你也传递 NULLlpOverlapped ,就像你在这里做的那样。来自documentation :

lpNumberOfBytesWritten [out, optional]

......

This parameter can be NULL only when the lpOverlapped parameter is not NULL.

关于c++ - Win32 写入文件 : Access Viloation and Error 1784,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com