none
un fopen qui se passe mal RRS feed

  • Question

  • Bonjour,

    toujours dans ma procédure de création de base j'ai un problème sur un fopen_s

    je vous met le code et le résultat:

                                    void* sText;
    				const char* sFileName = "\\usr\\SpecificationLoader\\dev\\DBMS\\MissionDBManager\\com\\MissionCreationScript.sql"; 
    				fopen_s( &ptFile, sFileName, "R");

    je vous met en dessous le résultat:

    Le programme '[3976] SpecificationLoader.exe: Managé (v4.0.30319)' s'est arrêté avec le code -1073740777 (0xc0000417)


    Jean Noël Martin

    jeudi 4 décembre 2014 10:55

Réponses

Toutes les réponses

  • Votre valeur de sFileName ne correspond pas à un chemin valide dans un système de fichiers NTFS ou FAT16/32.

    Si c'est un chemin relatif, il ne doit pas commencé par "\".

    Si c'est un chemin absolu, il faut la lettre du lecteur pour les systèmes de fichiers NTFS ou FAT.


    Paul Bacelar, Ex - MVP VC++

    jeudi 4 décembre 2014 14:02
    Modérateur
  • J'ai donc corrigé comme suit:

                                    void* sText;
    				const char* sFileName = "D:\\usr\\SpecificationLoader\\dev\\DBMS\\MissionDBManager\\com\\MissionCreationScript.sql"; 
    				fopen_s( &ptFile, sFileName, "R");

    ce qui n'a rien changé


    Jean Noël Martin

    jeudi 4 décembre 2014 18:00
  • Même pas le message d'erreur ?

    Le fichier existe-t-il ?

    Avez-vous les droits en lecture sur ce fichier et le droit en traversé sur chaque répertoire composant le chemin ?

    etc...

    Utilisez le débuggeur pour voir le problème à la source.

    P.S.: je pense que nommer un répertoire "com" dans un système de fichier NTFS et encore pire dans un système FAT, c'est chercher un peu les noises.


    Paul Bacelar, Ex - MVP VC++

    jeudi 4 décembre 2014 21:18
    Modérateur
  • oui le message est le même

    le fichier existe

    je me fait jetter de l'exécutable, et donc ne peux pas accéder au débuggeur.

    C'est la première fois que j'entends parler de ces nom de répertoire qui sont récurrent chez nous


    Jean Noël Martin

    vendredi 5 décembre 2014 07:22
  • http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx

    Ok, COM passe, mais COM1 ou CON sont casse-gueule.

    Mon subconscient a mergé les 2.

    Le debugging c'est forcement à l'exécution.

    Le debuggeur devrait prendre la main au lancé d'exception.

    Quel trace avez vous dans la fenêtre "Sortie" de Visual Studio ?


    Paul Bacelar, Ex - MVP VC++

    vendredi 5 décembre 2014 10:02
    Modérateur
  • Je vous met toute les sorties:

    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'D:\usr\Specification Loader\dev\ALN_Kernel\make\SpecificationLoader\Release\SpecificationLoader.exe' chargé, symboles chargés.
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_fr_b77a5c561934e089\mscorlib.resources.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll' chargé
    'SpecificationLoader.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll' chargé
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Pas à pas détaillé : pas à pas principal dans la méthode sans symboles 'System.Data.SqlClient.SqlConnection.Open'
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Une exception de première chance de type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll
    Le programme '[6036] SpecificationLoader.exe: Managé (v4.0.30319)' s'est arrêté avec le code -1073740777 (0xc0000417).


    Jean Noël Martin

    vendredi 5 décembre 2014 16:53
  • Bon, on ne va pas cherchez le dahu.

    Collez-moi ça au début de votre programme (cf. l'exemple) :

    http://msdn.microsoft.com/fr-fr/library/a9yf33zb.aspx

    Mettez un point d'arrêt sur l'abort.

    Et lancer votre exécutable en Debug.

    (Je cherche même plus à comprendre pourquoi votre débuggeur ne déclenche pas son rapport.)


    Paul Bacelar, Ex - MVP VC++

    vendredi 5 décembre 2014 23:49
    Modérateur
  • J'ai introduit ça dans mon programme

    Je n'ai pas trouvé l'abort?

            void _invalid_parameter
    	(
    
    		const wchar_t * expression,
    		const wchar_t * function, 
    		const wchar_t * file, 
    		unsigned int line,
    		uintptr_t pReserved
    	);
    	_invalid_parameter_handler _set_invalid_parameter_handler( _invalid_parameter_handler pNew);
    	

    en outre j'ai trouvé sur le site

    0xC0000417
    STATUS_INVALID_CRUNTIME_PARAMETER

    An invalid parameter was passed to a C runtime function.


    Jean Noël Martin


    • Modifié JeanNoel53 samedi 6 décembre 2014 12:00
    samedi 6 décembre 2014 10:29
  • Vous n'avez pas regardé l'exemple dans l'article que j'ai linké.

    Paul Bacelar, Ex - MVP VC++

    samedi 6 décembre 2014 22:31
    Modérateur
  • Effectivement il y a un exemple dans la version 2013.

    Dois je mettre les instructions dans le main ou comment l'intégrer a mon environnement.


    Jean Noël Martin

    samedi 6 décembre 2014 23:25
  • Oui, à faire dans le main, le plus tôt possible.
    Attention, c'est juste pour le débugging de ce problème.
    Il faut retirer ce code après l'avoir corrigé.

    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 dimanche 7 décembre 2014 08:11
    • Non marqué comme réponse JeanNoel53 dimanche 7 décembre 2014 08:11
    dimanche 7 décembre 2014 00:04
    Modérateur
  • Ce qui change c'est que plus rien ne marche

    le code est devenu

    void myInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved)
    {
       wprintf(L"Invalid parameter detected in function %s.", L" File: %s Line: %d\n", function, file, line);
       wprintf(L"Expression: %s\n", expression);
       abort();
    }
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows XP avant la création de tout contrôle
    	   char* formatString;
    
       _invalid_parameter_handler oldHandler, newHandler;
       newHandler = myInvalidParameterHandler;
       oldHandler = _set_invalid_parameter_handler(newHandler);
    
       // Disable the message box for assertions.
       _CrtSetReportMode(_CRT_ASSERT, 0);
    
       // Call printf_s with invalid parameters.
    
       formatString = NULL;
       printf(formatString);
    	Application::SetCompatibleTextRenderingDefault(false);
    	Console::WriteLine("Specification loader: Initializaton");
    	SpecificationLoader::objSoftwareManager.Initialization( true);
    	Console::WriteLine("Specification loader: main menue");
    	// Créer la fenêtre principale et l'exécuter
    	Application::EnableVisualStyles();
    	Application::Run(gcnew SpecificationLoader::MainMenue());
    	return 0;
    }
    

    j'ai simplement le résultat suivant

    on passe dans l'abort au début du programme

    Le programme '[4908] SpecificationLoader.exe: Managé (v4.0.30319)' s'est arrêté avec le code 3 (0x3).


    Jean Noël Martin


    • Modifié JeanNoel53 dimanche 7 décembre 2014 08:22
    dimanche 7 décembre 2014 08:18
  • http://msdn.microsoft.com/en-us/library/k089yyh0.aspx

    J'ai dit de mettre un break-point sur l'appel de la fonction abort, pas de cliquer sur le bouton Abort du rapport d'erreur du débuggeur.

    Normalement, la console contient la description du problème.

    Si ce n'est pas le cas, appelez "fflush(std::cout);" avant l'abort (avec les .h qui vont bien).

    Avez-vous des difficultés à utiliser le débuggeur ???


    Paul Bacelar, Ex - MVP VC++

    dimanche 7 décembre 2014 16:07
    Modérateur
  • Bonjour

    le fflush déclenche le comportement suivant:

    Une exception de première chance de type 'System.AccessViolationException' s'est produite dans SpecificationLoader.exe
    Une exception non gérée du type 'System.AccessViolationException' s'est produite dans SpecificationLoader.exe
    
    Informations supplémentaires : Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    il se plante à la ligne 0 les autres champs sont non renseignés


    Jean Noël Martin


    • Modifié JeanNoel53 dimanche 7 décembre 2014 18:07
    dimanche 7 décembre 2014 18:00
  • Vous compilez tout en DEBUG ?

    Paul Bacelar, Ex - MVP VC++

    dimanche 7 décembre 2014 18:16
    Modérateur
  • Non je vais le faire

    Je l'ai fait voila le résultat:

    file = 0x5C3D76B0 "f:\dd\vctools\crt_bld\self_x86\crt\src\printf.c"
    function = 0x5C3D769C "printf"
    line = 54
    expression = 0x5C3D66D0 "(format != NULL)"

    ultérieurement il se plante à la sortie de:

    void __cdecl _lock_file (
            FILE *pf
            )
    {
            /*
             * The way the FILE (pointed to by pf) is locked depends on whether
             * it is part of _iob[] or not
             */
            if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )
            {
                /*
                 * FILE lies in _iob[] so the lock lies in _locktable[].
                 */
                _lock( _STREAM_LOCKS + (int)(pf - _iob) );
                /* We set _IOLOCKED to indicate we locked the stream */
                pf->_flag |= _IOLOCKED;
            }
            else
                /*
                 * Not part of _iob[]. Therefore, *pf is a _FILEX and the
                 * lock field of the struct is an initialized critical
                 * section.
                 */
                EnterCriticalSection( &(((_FILEX *)pf)->lock) );
    }
    sur l'exécution du fflush


    Jean Noël Martin



    • Modifié JeanNoel53 dimanche 7 décembre 2014 18:48
    dimanche 7 décembre 2014 18:32
  • ligne 54 de "f:\dd\vctools\crt_bld\self_x86\crt\src\printf.c", SVP.

    Vous utilisez très vraisemblablement la méthode printf avec de mauvais paramètres.

    fflush n'est peut-être pas safe dans cet Handler, utilisez le break-point si l'affichage dans la console ne fonctionne pas.


    Paul Bacelar, Ex - MVP VC++


    dimanche 7 décembre 2014 22:40
    Modérateur
  • j'ai l'explication c'est le "r" qui n'est pas acceptéexpression = 0x5C3D6178 "("Invalid file open mode",0)"

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 dimanche 7 décembre 2014 23:11
    • Non marqué comme réponse JeanNoel53 lundi 8 décembre 2014 16:56
    dimanche 7 décembre 2014 22:55
  • "r" et "R" sont pourtant des valeur documentées par la norme.

    Il n'y aurait pas un caractère invisible qui ce balade dans votre code source. Vérifiez aussi l'encodage de vos fichiers sources.


    Paul Bacelar, Ex - MVP VC++


    dimanche 7 décembre 2014 23:45
    Modérateur
  • L'ouverture se passe bien avec le r mais pas avec le R.

    mais à la sorte le pFile est non initialisé!!!

    il a fallu valider le chemin d'accès au fichier pour que ça marche.


    Jean Noël Martin


    • Modifié JeanNoel53 mardi 9 décembre 2014 01:30
    • Marqué comme réponse JeanNoel53 mardi 9 décembre 2014 01:30
    lundi 8 décembre 2014 16:57
  • Effectivement, "R" ne peut être utilisé seul.

    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 samedi 20 décembre 2014 11:35
    mardi 9 décembre 2014 10:32
    Modérateur