以下代码有两个问题。首先,我一直在这个论坛和其他论坛上搜寻我的1784错误代码的答案,而我尝试过的一切都失败了。我在stackoverflow上检查的两个线程是WriteFile returning error 1784和BlockWrite 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 ints,在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效率更高。请注意,如果您也将
NULL
传递给lpNumberOfBytesWritten
,则不允许将NULL
传递给lpOverlapped
参数,如此处所示。从documentation:关于c++ - Win32 Writefile:访问冲突和错误1784,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12643441/