Domanda

Utilizzo Windows XP utilizzando Visual Studio 6 (sì, lo so che è vecchio) creando/mantenendo una DLL C++.Ho riscontrato un problema con fopen che non riesce ad aprire un file esistente, restituisce sempre NULL.

Ho provato:

  • Controllando errno e _doserrno impostandoli entrambi su zero e quindi controllandoli nuovamente, entrambi rimangono zero e quindi GetLastError() non segnala errori.So che fopen non è tenuto a impostare errno quando rileva un errore secondo uno standard C.
  • Hardcoding del percorso del file, che non è relativo.
  • Ho provato su un altro computer dello sviluppatore con lo stesso risultato.

La cosa veramente strana è che CreateFile funziona e il file può essere letto con ReadFile.Riteniamo che funzioni in una build di rilascio, tuttavia stiamo riscontrando anche alcuni comportamenti molto strani in altre aree dell'applicazione e non siamo sicuri che ciò sia correlato.

Il codice è sotto, non vedo nulla di strano, mi sembra abbastanza standard.Il file sorgente non è cambiato da poco meno di sei mesi.

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

Nessuna soluzione corretta

Altri suggerimenti

La risposta:

Ho trovato la causa, troppi gesti di file aperti per alcuni recenti aggiornamenti all'applicazione. Questi dove non il codice cambia, quindi questo bug è stato presente per un po '. Sono entrato nella funzione Fopen fino a una funzione chiamata _getStream. Questo tenta di trovare un flusso non in uso, la funzione cerca una tabella di 512 flussi abbastanza sicuri di tutti i 512 in cui in uso e altre chiamate per fopen dove il fallimento. Ho usato il maneggiare Strumento dai sysinternals per vedere il numero di maniglie usate.

La tua funzione ha un tipo di ritorno HResult (dove 0 è buono) ma restituisci un booleano (dove 0 è cattivo). Non può essere giusto ...

Supponendo che tu abbia una versione ragionevole di VC6, allora hai il codice sorgente per CRT e puoi entrare nella chiamata fopen e fino alla chiamata CreateFile che verrà effettuata da CRT.(Preparatevi al fatto che la discesa sarà piuttosto lunga!)

Metti Breakpoint sulla linea Fopen, attivalo nel debugger, input "Err, hrFinestra "Watch", esegui la linea e controlla quale fosse il problema. Molto probabilmente sono le autorizzazioni di accesso.

Hai già 512 file aperti.

Possiamo contenere solo i file aperti di massimo 512 nell'applicazione VC. Sto suggerendo di chiudere i file non necessari fclose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top