我使用Visual Studio 6(是的,我知道它是旧的)建筑物/维护C ++ DLL上的Windows XP。我遇到了Fopen未能打开现有文件的问题,它总是返回null。

我试过了:

  • 通过设置为零,检查Errno和_doserrno,然后再次检查它们,都保持零,因此GetlastRor()报告没有错误。我知道Fopen不需要在根据C标准遇到错误时设置ERRNO。
  • 硬编码文件路径,不是相对的。
  • 在另一台开发人员机器上尝试了相同的结果。

真正奇怪的是CreateFile的作品,可以使用ReadFile读取文件。我们认为这在发布版本中起作用,但是我们在应用程序的其他领域也看到了一些非常奇怪的行为,我们不确定这是否相关。

代码在下面,我看不到任何奇怪的东西,对我来说看起来很标准。源文件不到半年没有更改。

HRESULT CDataHandler::LoadFile( CStdString szFilePath )
{
    //Code
    FILE* pFile;
    if ( NULL == ( pFile = fopen( szFilePath.c_str(), "rb") ) )
    {
        return S_FALSE;
    }
    //More code
}

没有正确的解决方案

其他提示

答案:

我找到了原因,通过对应用程序的一些更新,有太多的打开文件处理原因。这些没有代码更改的地方,因此此错误已经存在了一段时间。我逐步进入了一个名为_getStream的函数。这试图找到未使用的流,该函数搜索了512个流的表,肯定所有512的使用情况和其他呼叫都可以在失败的地方进行fopen。我用了 处理 来自Sysinternals的工具可查看使用的手柄的数量。

您的函数具有HRESULT返回类型(其中0个好),但是您返回布尔值(其中0不好)。那是不对的...

假设您有一个合理的VC6版本,那么您将具有CRT的源代码,并且可以进入FOPEN调用,并一直到CRT将要进行的CreateFile调用。 (准备要它要长得很长的路!)

将断点放在Fopen线上,在调试器中触发它,输入”err,人力资源“在“观看”窗口中,执行行并在观察中检查出什么问题。很可能是访问权限。

您已经有512个打开的文件。

我们只能在VC应用程序中仅容纳最大512个打开的文件。我建议使用不必要的文件使用 fclose.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top