Мы можем хранить не более 512 открытых файлов в приложении VC. Я предлагаю закрыть ненужные файлы, используя

Windows XP использую Visual Studio 6 (да, я знаю, что он старый) сборка / поддержка C ++ DLL. Я столкнулся с проблемой, что fopen не удалось открыть существующий файл, он всегда возвращает NULL.

Я пробовал:

Проверка errno и _doserrno путем установки обоих на ноль и последующей проверки их снова, оба остаются нулевыми, и, таким образом, GetLastError () не сообщает об ошибках. Я знаю, что fopen не требуется устанавливать errno, когда он сталкивается с ошибкой в ​​соответствии со стандартом C.Жесткое кодирование пути к файлу, которые не являются относительными.Пробовал на другой машине разработчиков, результат тот же.

Действительно странная вещь - CreateFile работает, и файл может быть прочитан с помощью ReadFile. Мы считаем, что это работает в сборке релиза, однако мы также наблюдаем очень странное поведение в других областях приложения, и мы не уверены, связано ли это.

Код ниже, я не вижу ничего странного, для меня это выглядит вполне стандартно. Исходный файл не изменился чуть менее полугода.

HRESULT CDataHandler::LoadFile( CStdString szFilePath )
{
    //Code
    FILE* pFile;
    if ( NULL == ( pFile = fopen( szFilePath.c_str(), "rb") ) )
    {
        return S_FALSE;
    }
    //More code
}
 Cody Gray♦14 янв. 2011 г., 11:43
@ Томалак: Да, мы понимаем, VC ++ 6.0 не соответствует стандартам. Но смешно говорить людям, что это не C ++, когда он очень четко заявляет о себе. Это конечно не С, так в чем же альтернатива? Я полностью согласен с тем, что маркировка как C, так и C ++ бессмысленна.
 Lightness Races in Orbit14 янв. 2011 г., 11:33
Visual C ++ 6 на самом деле не является C ++. Конечно, маркировка как C, так и C ++ бессмысленна. Выберите язык, как в ваших тегах, так и в вашем коде.
 Will Dean14 янв. 2011 г., 11:55
Этот трудный вопрос о соответствии C ++ VC6 совершенно не имеет отношения к вопросу, который на самом деле касается вызова стандартной библиотеки C, хотя и сделанного из C ++ (или того, что Томалак считает, что мы должны называть язык, который компилирует компилятор V ++ C ++)
 Lightness Races in Orbit14 янв. 2011 г., 11:45
@CodyGray: Это не C ++. Он не соответствует (как вы говорите) слишком многими способами, чтобы его можно было точно или ответственно назвать C ++. Это язык C ++. Я ценю, что это может показаться драматичным, но этоявляется большое различие, когда вы помогаете кому-то в коде, который рекламировался как C ++, но на самом деле не подчиняется тем же законам.
 Lightness Races in Orbit14 янв. 2011 г., 11:34
Да, и что касается вопроса, проверьте, что у вас есть разрешение на доступ к файлу. Он не должен просто существовать: ваша программа должна иметь к нему доступ.

Ответы на вопрос(5)

Ответ:

Я нашел причину, слишком много открытых файловых дескрипторов, вызванных некоторыми недавними обновлениями приложения. Они не изменяют код, хотя эта ошибка присутствует некоторое время. Я перешел в функцию fopen к функции _getstream. Это пытается найти поток, который не используется, функция ищет таблицу из 512 потоков. Достаточно, конечно, все 512, где используется, и другие вызовы fopen, где происходит сбой. Я использовалручка инструмент от sysinternals, чтобы увидеть количество используемых ручек.

 rashok23 апр. 2014 г., 14:30
пожалуйста, проверьте мой ответ

но вы возвращаете логическое значение (где 0 - это плохо). Это не может быть правдой ...

 void14 янв. 2011 г., 11:50
Моя ошибка должна была быть S_FALSE.

Мы можем хранить не более 512 открытых файлов в приложении VC. Я предлагаю закрыть ненужные файлы, используяfclose.

вызвать ее в отладчике, ввести "ERR, час"в окне" Наблюдать ", выполните строку и отметьте в разделе" В чем проблема ". Скорее всего это права доступа

что у вас есть разумная версия VC6, у вас есть исходный код CRT, и вы можете перейти к вызову fopen и вплоть до вызова CreateFile, который будет выполнять CRT. (Будьте готовы к тому, что это будет довольно далеко!)

 void14 янв. 2011 г., 12:44
Я нашел CRT-источники установочного диска и вошел в fopen. К счастью, мне не пришлось заходить слишком далеко, чтобы выяснить причину. (См. Оригинальный вопрос)

Ваш ответ на вопрос