Pregunta

Estoy en Windows XP utilizando Visual Studio 6 (sí sé que es edad) la creación / mantenimiento de una DLL de C ++. Me encontré con un problema con fopen no poder abrir un archivo existente, siempre devuelve NULL.

he intentado:

  • Comprobación errno y _doserrno fijando tanto a cero y después de comprobar de nuevo, ambos siguen siendo cero, y por lo tanto GetLastError () informa de ningún error. Sé fopen no está obligado a conjunto errno cuando encuentra un error de acuerdo con un estándar C.
  • hardcoding la ruta del archivo, que no son relativos.
  • Probado en otra máquina desarrolladores cual el mismo resultado.

Lo realmente extraño es obra CreateFile y el archivo se puede leer con ReadFile. Creemos que esto funciona en una versión de lanzamiento, sin embargo también estamos viendo un comportamiento muy extraño en otras áreas de la aplicación y no estamos seguros de si esto está relacionado.

El código está abajo, no veo nada extraño se ve bastante normal para mí. El archivo de origen no ha cambiado un poco menos de la mitad de un año.

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

No hay solución correcta

Otros consejos

La respuesta:

He encontrado la causa, demasiados identificadores de archivo abiertos causan por algunos cambios recientes en la aplicación. Estos donde no cambios de código, aunque por lo que este error ha estado presente durante un tiempo. Entré en la función fopen abajo a una función llamada _getstream. Este intentos de encontrar una corriente no está en uso, la función busca una tabla de 512 arroyos Efectivamente todos los 512 donde en uso y otras llamadas a FOPEN en su defecto. He utilizado la herramienta de href="http://technet.microsoft.com/en-us/sysinternals/bb896655" rel="noreferrer"> mango

Su función tiene un tipo de retorno HRESULT (donde 0 es bueno) pero que devuelve un valor booleano (donde 0 es malo). Eso no puede ser cierto ...

Asumiendo que tiene una versión razonable de VC6, entonces usted tiene el código fuente para el CRT, y se puede entrar en la llamada fopen, y todo el camino hasta la llamada CreateFile que el CRT hará. (Esté preparado para que sea todo un largo camino hacia abajo!)

punto de interrupción puesto en línea fopen, disparador en depurador, entrada " ERR, hr " en 'ventana Inspección', ejecute la línea y el registro Mira lo que era el problema. Lo más probable es de los permisos de acceso.

Usted ya tiene 512 archivos abiertos.

puede contener sólo max 512 archivos abiertos en la aplicación de VC. Estoy sugiriendo que cerrar los archivos innecesarios utilizando fclose.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top