none
Fail assertion avec mfc120d.dll RRS feed

  • Discussion générale

  • Je suis en train de faire un portage d'une application MFC (générée sous Windows XP avec Visual Studio .NET 2003)  vers un PC sous Windows 7 et Visual Studio 2013. je rencontre pas mal de problème et le dernier en date concerne la dll mfc120d.

    Au lancement de mon application, j'ai le message Debug Assertion failed sur la fonction AddToRecentFileList. Je ne comprends pas l'erreur. Qui peux m'aider pour résoudre mon problème ?

    Merci d'avance.

    Je met ci-dessous les commentaires dans la fenêtre Pile des appels :

      mfc120d.dll!CRecentFileList::Add(const char * lpszPathName, const char * lpszAppID) Ligne 221 C++
      mfc120d.dll!CWinApp::AddToRecentFileList(const char * lpszPathName) Ligne 78 C++
      mfc120d.dll!CDocument::SetPathName(const char * lpszPathName, int bAddToMRU) Ligne 290 C++
      AppliSSTAD.exe!CVisionDoc::OnNewDocument() Ligne 87 C++
      [Code externe] 
      AppliSSTAD.exe!CVisionApp::InitInstance() Ligne 215 C++
      [Code externe] 
      AppliSSTAD.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Ligne 26 C++
      [Code externe] 
      [Les frames ci-dessous sont peut-être incorrects et/ou manquants, aucun symbole chargé pour ntdll.dll] 

    mardi 18 novembre 2014 09:27

Toutes les réponses

  • Le plus simple, c'est de lire le source. ;-)

    Le code de la méthode CRecentFileList::Add devrait indiquer le motif de l'assertion.(ligne 221, normalement) ;-)


    Paul Bacelar, Ex - MVP VC++

    mardi 18 novembre 2014 10:01
    Modérateur
  • Oui, en effet, cela se passe à la ligne 221 mais je ne trouve pas la cause de l'erreur.

    Contenu de mes variables :

    lpszPathName --> "C:\\ssta\\C++\\Test migration\\bin\\Appli"

    hr --> HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) : Le fichier spécifié est introuvable.  HRESULT

    Le fichier existe. Est-ce un problème de chemin mal défini dans les propriétés ?

    Extrait code du fichier fileList.cpp

    #ifdef UNICODE
     hr = _AfxSHCreateItemFromParsingName(lpszPathName, NULL, IID_IShellItem, reinterpret_cast<void**>(&psi));
    #else
     {
      USES_CONVERSION;
      LPOLESTR lpWPath = A2W(lpszPathName);
      hr = _AfxSHCreateItemFromParsingName(lpWPath, NULL, IID_IShellItem, (LPVOID*)&psi);
     }
    #endif

     ENSURE(SUCCEEDED(hr));

    mardi 18 novembre 2014 10:30
  • Je pense que vous n'êtes pas le premier :

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/8fd593a1-48f6-419e-8550-478ab2e8e027/onfilesave-throws-encountered-improper-argument-while-saving-the-new-file-document-mfc-mdi?forum=vcgeneral

    Pouvez-vous débugger l'appel à _AfxSHCreateItemFromParsingName ?

    "hr" vaut combien ?


    Paul Bacelar, Ex - MVP VC++

    mardi 18 novembre 2014 14:35
    Modérateur
  • hr vaut  HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) : Le fichier spécifié est introuvable.  HRESULT
    mardi 18 novembre 2014 16:02
  • "hr", c'est un entier sur 32 bits.

    et le debugging donne quoi ?


    Paul Bacelar, Ex - MVP VC++

    mardi 18 novembre 2014 16:34
    Modérateur
  • Bonjour,

    Nous changeons le type de votre question à « Discussion générale » parce que vous n’êtes pas revenu avec les informations sollicitées. Si vous avez plus de temps pour réexaminer la question et fournir plus d'informations, n'hésitez pas à modifier le type du thread à « Question ». Si le problème est résolu, s’il vous plaît partagez la solution avec nous afin que la réponse puisse être trouvée et utilisée par d'autres membres de la communauté ayant des questions similaires.

    Merci d'avance!

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    dimanche 30 novembre 2014 15:50
    Modérateur
  • Toutes mes excuses pour ma réponse tardive mais j'étais passée sur un autre projet.

    La valeur de hr est 0x80070002 The system cannot find the file specified. Cette erreur est générée par l'appel à la fonction SetPathName donc le code est ci-dessous. En faisant des recherches sur le forum, j'ai vu que l'on pouvait mettre la variable bAddToMRU à FALSE. J'ai effectivement essayé et tout marche correctement.

    1- Je ne comprends pas trop à quoi sert cette ajout à la MRU ? Est-ce vraiment utile ?

    2- Je voudrais savoir si la mise à FALSE de cette variable n'aura pas de conséquences néfastes pour mon application ?

    Merci pour votre réponse.

    BOOL CVisionDoc::OnNewDocument()
    {
    	if (!CDocument::OnNewDocument())
    		return FALSE;
    	SetPathName(GetAppParams->m_pIntituleModule->StrVal());
    
    	return TRUE;
    }
    


    JCOQUILLE

    lundi 1 décembre 2014 09:33
  • Toutes mes excuses mais j'étais passée sur un autre projet.

    J'ai repris aujourd'hui la conversation avec Paul Bacelar.

    Cordialement.


    JCOQUILLE

    lundi 1 décembre 2014 09:34
  • MRU = Most Recent Used

    C'est le mécanisme qui permet d'avoir la liste des derniers fichiers ouverts dans l'application dans le menu "Fichier" de l'application.

    Si vous le désactivé, votre liste des derniers fichiers ouverts dans le menu "Fichier" de l'application restera vide ou inchangé.

    C'est quand même très étrange que le fichier sensé avoir été créé n'existe pas ou pas encore.

    Si vous ne créez pas tout de suite le fichier, pourquoi appeler SetPathName ?


    Paul Bacelar, Ex - MVP VC++

    lundi 1 décembre 2014 13:31
    Modérateur
  • En fait, la structure générale de mon application a été crée il y longtemps et je me retrouve avec ce problème depuis le portage de l'appli sous VC2013.

    Cette fonction de voir la liste des derniers fichiers ouverts ne m'est pas indispensable.


    JCOQUILLE

    lundi 1 décembre 2014 14:50
  • Pour moi, c'est plus un symptôme d'un problème que le problème lui-même.

    Vous ne devriez jamais appeler SetPathName avec un fichier qui n'existe pas.


    Paul Bacelar, Ex - MVP VC++

    mardi 2 décembre 2014 15:25
    Modérateur
  • Ok, je vais essayer de creuser. Merci pour votre aide.

    Cordialement.


    JCOQUILLE

    lundi 8 décembre 2014 10:12