2011-06-30 83 views
2

我正在创建一个程序来填充具有虚拟文件系统的磁盘。WriteFile返回错误1784

目前,我正在使用WriteFile编写可变大小的文件。

 WriteFile(hFile, FileData, i * 1024, &dwWrote, NULL); 
     err = GetLastError(); 

ERR返回#1784翻译为

所提供的用户缓冲区是无效的请求的操作。 ERROR_INVALID_USER_BUFFER

因此,对于前24个文件,写入操作起作用。对于文件#25,写入操作失败。 文件仍然被创建,但WriteFile函数不会填充文件。

关于如何过去ERROR_INVALID_USER_BUFFER的任何想法?

我发现的错误的每个参考仅限于崩溃的程序,我无法弄清它与我遇到的问题之间的关系。

编辑:

FileData = (char *) malloc(sizeof(char) * (size_t)k * 1024); 
memset(FileData, 245, sizeof(char) * (size_t)k * 1024); 

的FileData被设置和分配给最大的大小预测缓冲区。 我是迭代的循环变量,直到它增加到最大大小(k)。

+0

我们怎么知道这些参数是什么类型,以及您与他们以前做了什么? –

+0

此外,请注意,崩溃通常是UB(其本身通常尝试访问无效内存)的结果。然而,碰撞不是UB的结果。关于可能发生的事情,这是不可预测的。所以,如果你期望没有发生崩溃,不要太多地阅读它。 –

+0

每当有太多未完成的异步I/O请求时,WriteFile函数可能会因ERROR_INVALID_USER_BUFFER或ERROR_NOT_ENOUGH_MEMORY而失败。 –

回答

4

我的猜测是,FileData是不够大,你可以从它写i * 1024字节。 i您的文件列表的循环控制变量?如果是这样,当您循环访问文件时,需要写缓冲区FileData每次增长1K。

这是一个不寻常的构造。你确定这里的逻辑是正确的吗?发布更多代码(具体而言,所有使用FileDatai)以获得更好的答案准确性。

请注意,您不应该总是在这里检查GetLastError - 您需要先检查WriteFile的返回码,然后才能确定这是否有意义。否则,你可能会从你的代码的一些不相关的部分发现一个错误 - 无论上一次失败。

+0

更新的原始帖子更多详细信息 – jscott

+0

另外,当dwWrote为0时,WriteFile在失败时返回0。 – jscott

+0

根据随机代码片段提供准确的建议是不可能的。获得最低限度的重现错误,然后发布一切。 –

2

我得到一个错误= 1784,这是因为我打开文件时没有指定记录的大小,然后在文件上做了块读取。

Reset(FileHandle); 

应该

Reset(FileHandle, 1);