Estoy en Windows XP utilizando Visual Studio 6 (sí, sé que es viejo) construcción/mantenimiento de una DLL de C++. Estoy detectado un problema con fopen error al abrir un archivo existente, siempre devuelve NULL.

He probado:

  • Comprobación de errno y _doserrno por la configuración de ambos a cero y, a continuación, comprobar de nuevo, ambos siguen siendo cero, y por lo tanto GetLastError() no informa de ningún error. Sé fopen no es necesaria para establecer el valor cuando se encuentra un error de acuerdo a un estándar de C.
  • Escribir la ruta de acceso del archivo, que no son relativos.
  • Probado en otra desarrolladores de la máquina de la que el mismo resultado.

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

El código es el siguiente, yo no veo nada extraño parece bastante estándar para mí. El archivo de origen no ha cambiado 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
}
Visual C++ 6 no es realmente de C++. Sin duda el etiquetado de C y C++ es absurdo. Decidir sobre el lenguaje, tanto en sus etiquetas y en su código.
Ah, y en cuanto a la pregunta, compruebe que tiene permiso para acceder al archivo. No sólo se han de existir: el programa tiene que ser capaz de acceder a él.
Sí, lo conseguimos, VC++ 6.0 no es compatible con los estándares. Pero es confuso para decirle a la gente que no es C++ cuando claramente dice ser. Ciertamente no es C, entonces, żcuál es la alternativa? Estoy totalmente de acuerdo en que el etiquetado en C y C++ es absurdo.
No es C++. No es compatible (como usted dice) en demasiadas maneras de precisión o de manera responsable se refiere a como C++. Es un C++como lenguaje. Agradezco que esto puede parecer dramático, pero es una gran distinción cuando se trata de ayudar a alguien en el código que ha sido anunciado como C++, pero realmente no está sujeto a las mismas leyes.
Esta dificultad punto acerca de C++ cumplimiento de VC6 es completamente irrelevante a una pregunta que en realidad es acerca de una llamada a la biblioteca estándar de C, aunque uno hecho a partir de C++ (o lo que sea Tomalak piensa que deberíamos llamar el lenguaje que el VC6 compilador de C++ compila)

OriginalEl autor void | 2011-01-14

5 Comentarios

  1. 10

    La Respuesta:

    He encontrado la causa, demasiados identificadores de archivo abierto causa por algunas de las recientes actualizaciones de la aplicación. Estas donde no cambios de código, así que este error ha estado presente por un tiempo. Entré en la función fopen abajo a una función llamada _getstream. Este intento de encontrar una secuencia no está en uso, la función busca en una tabla de 512 arroyos que suficiente para todos los 512 donde en el uso y la llamada a fopen donde fallando. He utilizado el manejar herramienta de sysinternals para ver el número de manijas.

    por favor revise mi respuesta

    OriginalEl autor void

  2. 2

    Su función tiene un valor HRESULT tipo de retorno (donde 0 es buena), pero se puede devolver un valor booleano (donde 0 es malo). Que no pueden estar en lo correcto…

    Mi error, debería haber sido S_FALSE.

    OriginalEl autor trojanfoe

  3. 1

    Suponiendo que se tiene una razonable versión de VC6, entonces usted tiene el código fuente de la CRT, y usted puede entrar en la llamada a fopen, y todo el camino hacia abajo a la llamada CreateFile que el CRT. (Estar preparado para ser un largo camino hacia abajo!)

    He encontrado el CRT fuentes de el disco de instalación y se metió en fopen. Por suerte no tuve que paso demasiado lejos para descubrir la causa. (Vea la pregunta original)

    OriginalEl autor Will Dean

  4. 0

    poner punto de interrupción en fopen línea, desencadenan en el depurador, de entrada “ERR, hr” en “la ventana” observación, ejecutar la línea y comprobar en Ver cuál era el problema. Lo más probable es que los permisos de acceso.

    OriginalEl autor Andriy Tylychko

  5. 0

    Que ya están teniendo 512 archivos abiertos.

    Nos pueden contener sólo max 512 archivos abiertos en aplicación VC. Estoy sugiriendo para cerrar los archivos innecesarios utilizando fclose.

    OriginalEl autor rashok

Dejar respuesta

Please enter your comment!
Please enter your name here