Frage

Ich bin auf Windows XP mit Visual Studio 6 (ja, ich weiß, dass es alt ist) Bau / eine C ++ DLL beibehalten wird. Ich habe ein Problem mit begegnet fopen andernfalls eine vorhandene Datei zu öffnen, es gibt immer NULL.

Ich habe versucht:

  • Überprüfen errno und _doserrno durch beide auf Null gesetzt wird und sie dann wieder überprüft, bleiben beide Null, und somit GetLastError () meldet keine Fehler. Ich weiß, dass fopen ist nicht auf Set errno erforderlich ist, wenn ein Fehler auftritt nach einer C-Norm.
  • hartzucodieren den Dateipfad, der nicht relativ ist.
  • Versuchte auf einer anderen Entwickler-Maschine, die das gleiche Ergebnis.

Das wirklich Seltsame ist Create Werke und die Datei kann mit Readfile gelesen werden. Wir glauben, dass diese Arbeiten in einem Release-Build, aber wir sind auch einige sehr seltsame Verhalten in anderen Bereichen der Anwendung zu sehen, und wir sind nicht sicher, ob dies in Zusammenhang steht.

Der Code ist unten, ich sehe nichts seltsam es mir ziemlich Standard sieht. Die Quelldatei ist knapp ein halbes Jahr nicht verändert.

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

Keine korrekte Lösung

Andere Tipps

Die Antwort:

fand ich die Ursache, zu viele offene Datei-Handles von einigen letzten Aktualisierungen der Anwendung führen. Dieser in dem Code nicht ändert, obwohl so dieser Fehler vorhanden für eine Weile gewesen ist. Ich trat in die fopen Funktion auf eine Funktion namens _getstream. Diese Versuche, einen Stream zu finden die Funktion sucht nicht in Gebrauch ist, strömt eine Tabelle von 512 sicher genug, um all 512, wo in Gebrauch und andere Anrufe fopen wo versagt. Ich benutzte die Griff Tool von Sysinternals die Anzahl der verwendeten Griffe zu sehen.

Ihre Funktion hat einen HRESULT Rückgabetyp (wobei 0 ist gut), aber sie geben einen boolean (wobei 0 schlecht ist). Das kann nicht richtig sein ...

Angenommen, Sie eine vernünftige Version von VC6 haben, dann haben Sie den Quellcode der CRT, und Sie können in den fopen Anruf Schritt, und den ganzen Weg hinunter zum Aufruf Create, dass die CRT machen. (Seien Sie darauf vorbereitet ziemlich langer Weg nach unten zu sein!)

setzen Haltepunkt auf fopen Linie, Trigger es in Debugger, geben Sie " ERR, hr “in "Watch" Fenster, führen Sie die Linie und Check-in-Uhr, was das Problem war. Die meisten wahrscheinlich die Zugriffsberechtigungen.

Sie sind bereits 512 geöffnete Dateien mit.

Wir können nur max 512 geöffnete Dateien in VC-Anwendung halten. Ich schlage vor, die nicht benötigten Dateien mit fclose zu schließen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top