【发布时间】:2015-01-27 21:00:56
【问题描述】:
Windows (2008 R2) 上的 Visual C++ 6(非 .NET)程序在尝试写入文件时返回“错误代码:6,错误详细信息:句柄无效”。该文件已创建,但由于错误而为空白。
运行程序的 Windows 用户帐户是计算机上的管理员。根据用户的说法,错误“刚刚开始发生”。
同样,文件已创建并且似乎具有正确的权限和所有权。文件用 fopen 打开并用 fwrite 写入。
为什么会发生错误? 它与组策略有关吗? 我从哪里开始看?
[2015-01-28 更新]
返回错误的代码:
m_stream = fopen(m_sLogFile, m_sMode);
if ( m_stream == NULL )
{
dwErrorCode = ::GetLastError();
if (dwErrorCode != ERROR_ALREADY_EXISTS &&
dwErrorCode != ERROR_SUCCESS)
{
CaptureError(this->FormatErrorCode (dwErrorCode));
return FALSE;
}
}
这是在文件创建之后...
hFile = CreateFile((LPCTSTR) sPathName, // file name
GENERIC_ALL, // access mode
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, // SD
CREATE_ALWAYS, // how to create
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH |
FILE_FLAG_SEQUENTIAL_SCAN, // file attributes
NULL); // handle to template file
【问题讨论】:
-
我的水晶球说你的错误处理代码坏了。 Fwrite() 不会生成 Windows 错误代码,它会生成 errno。
-
请显示失败的实际代码。
-
在尝试
fopen之前,是否关闭从CreateFile返回的句柄? -
为什么还要混合 Windows API 调用和 CRT 调用?这不会有好的结局。通常,您无法使用
fopen可靠地指定与您在调用CreateFile时指定的共享权限兼容的共享模式。也不清楚您是否在fopen之前调用CloseHandle。无论哪种方式,您都不能期望该文件在CloseHandle返回后立即可用。 -
我的问题被否决了,因为代码有问题/不好......不是我对社区的期望。感谢那些回答的人,谢谢。