我在Windows XP上使用Visual Studio 6(是的,我知道这是旧的)build立/维护一个C + + DLL。 我遇到了打开一个现有的文件无法打开的问题,它总是返回NULL。
我试过了:
真正奇怪的是CreateFile的作品和文件可以读取文件。 我们相信这是一个发布版本,但是我们在应用程序的其他领域也看到了一些非常奇怪的行为,我们不确定这是否是相关的。
代码如下,我没有看到任何奇怪的,它看起来相当标准的我。 源文件在半年之内没有改变。
HRESULT CDataHandler::LoadFile( CStdString szFilePath ) { //Code FILE* pFile; if ( NULL == ( pFile = fopen( szFilePath.c_str(), "rb") ) ) { return S_FALSE; } //More code }
答案:
我发现原因,由于应用程序最近的一些更新导致打开的文件句柄过多。 这些代码没有改变,但这个bug已经存在了一段时间。 我进入了一个名为_getstream的函数fopen函数。 这试图找到一个没有使用的流,功能查找512个流的表肯定是所有的512在哪里使用和其他调用哪里失败。 我使用sysinternals的句柄工具来查看使用的句柄的数量。
你的函数有一个HRESULT返回类型(其中0是好的),但你返回一个布尔值(其中0是坏的)。 这是不对的…
假设你有一个合理的VC6版本,那么你有CRT的源代码,你可以进入fopen调用,一直到CRT的CreateFile调用。 (准备好了,相当长的一段路!)
在fopen行上放置断点,在调试器中触发,在“Watch”窗口中输入“ ERR,hr ”,执行行并检查看看有什么问题。 最有可能的是它的访问权限。
你已经有512个打开的文件。
我们只能在VC应用程序中保存最多512个打开的文件。 我建议使用fclose
关闭不必要的文件。