none
ShellExecute ERROR 1155 VC++ RRS feed

  • Question

  • Bonjour ,

    En utilisant la fonction ShellExecute j'obtiens systématiquement l'erreur 1155 qui indique :

    Failed to run :"c:\Projets\StructureDoc\01 -  Autom0bile\MonDocument. Docx

    L'objectif est de pouvoir ouvrir ce document en cliquant sur un bouton. Ce code que j'utilisais dans un ancien programme sous Windows XP puis Win7 ne fonctionne plus.

    Voici mon code complet si cela peut vous aider à m'aider :

    void CArchiveDocDlg::OnBnClickedBtnEmail()
    {
                    CString szFullPath;
                    CString szMainFolder;
                    char lpFilename[_MAX_PATH];
                    CString lpFilenameFinal;
                    DWORD len = _MAX_PATH;
                    lpFilename[0] = 0;
    
                    //On va reconstituer le chemin complet du fichier sélectionné par l'utilisateur
                    int row = m_cListCtrlRem.GetSelectionMark();
                    if (row < 0) return;
                    
                 CString szFilename = m_cListCtrlRem.GetItemText(row, 0);         //Nom du document sélectionné
                    
                    HTREEITEM hItem = m_cTreeCtrl.GetSelectedItem();
                    CString szFolder = m_cTreeCtrl.GetItemText(hItem);               //Dossier sélectionné par l'utilisateur
    
                    GetDlgItemText(IDC_EDIT_ROOTFOLDER,szMainFolder);
                    szFullPath.Format("%s\\%s\\%s",szMainFolder,szFolder, szFilename);
                    strcpy_s(lpFilename, szFullPath.GetBuffer());
                    if (strlen(lpFilename) != 0)
                    {
                                   int ch = 92;
                                   char *pdest;
                                   pdest = strrchr(lpFilename, ch);
                                   int Pos = (int)(pdest - lpFilename + 1);
                                   CString sfilname = lpFilename;
                                   CString FilePath = sfilname.Left(Pos - 1);
                                   CString FileName = sfilname.Right(sfilname.GetLength() - Pos);
                                   AfxMessageBox(lpFilename);
                                   
                                   HINSTANCE hInstance = ShellExecute(NULL, _T("open"), lpFilename, NULL, FilePath, SW_SHOWNORMAL);
                                   
                                   if (hInstance <= (HINSTANCE)32)
                                   {
                                                   TCHAR sMsg[1024];
                                                   _stprintf_s(sMsg, _T("Failed to run \"%s\", Error: %d"), lpFilename, GetLastError());
                                                   MessageBox(sMsg, lpFilename, MB_OK | MB_ICONEXCLAMATION);
                                                   return ;
                                   }
    
                    }
    
    }

    le chemin complet vers le fichier que je veux ouvrir est ceci :

    "c:\Projets\StructureDoc\01 -  Automobile\MonDocument. Docx

    Merci d'avance


    jeudi 20 juillet 2017 13:54

Réponses

  • CA MARCHE!!!!!

    Merci beaucoup Castorix31 pour toutes ces aides sans quoi je n'aurai pas trouvé.

    Finalement, comme tu avais dit, le problème venait de la base de registre. Après le nettoyage avec un outil spécifique qui a supprimé une centaine d'entrées non valide, j'ai aussi modifier manuellement dans les paramètres de Windows 10 les associations programmes/types de fichiers. Pour cela j'ai réinitialisé les valeurs par défaut pour windows puis j'ai modifier spécifiquement les types de données PDF qui étaient affectés par défaut à Microsoft Edge et non à Acrobat Reader ou a Adobe Acrobat.

    ShellExecute et ShellExecuteEx se sont dons mises à fonctionner. Ouffff!

    J'ai découvert aussi dans mes recherches le moyen d'afficher par programme la boîte de dialogue "Ouvrir avec..." qui peut être utile si ShellExecute ne fonctionne pas.

    Je me suis donc permis le luxe d'utiliser ShellExecute et si cela ne marche pas j'utilise ShellExecuteEx et si les deux ne marchent pas tant pis je donne la possibilité aux utilisateurs de choisir eux même le programme souhaité pour ouvrir le fichier souhaité.

    Voici le bout de code qui fait ça :

      CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
      
      HINSTANCE hInstance = ShellExecute(NULL, szAction, lpFilename, NULL, NULL, SW_SHOWNORMAL);
      if (hInstance <= (HINSTANCE)32)
      {
       //On tente de traiter le document avec ShellExecuteEx
       SHELLEXECUTEINFO sei;
       sei.cbSize = sizeof(SHELLEXECUTEINFO);
       sei.fMask = NULL;
       sei.hwnd = NULL;
       sei.lpVerb = "open";
       sei.lpFile = lpFilename;
       sei.lpParameters = NULL;
       sei.nShow = SW_SHOWNORMAL;
       sei.hInstApp = NULL;
       sei.lpIDList = NULL;
       sei.lpClass = NULL;
       sei.hkeyClass = NULL;
       sei.dwHotKey = NULL;
       sei.hIcon = NULL;
       sei.hProcess = NULL;
       sei.lpDirectory = NULL;
       BOOL ret = ShellExecuteExA(&sei);
       if (!ret) {
        //On recupère d'abord le message d'erreur et on informe l'utilisateur qu'on va lui proposer de choisir le manuemment le programme
        //qui doit ouvrir le fichier
        TCHAR sMsg[1024];
        sprintf_s(sMsg, _T("Problème d'ouverture du fichier \"%s\", Error: %d \nVeuillez sélectionner un programme pour ouvrir le fichier"), lpFilename, GetLastError());
        //MessageBox(sMsg, lpFilename, MB_OK | MB_ICONEXCLAMATION);
        if (GetErrorMessage((int)hInstance) == 0) {     
         char lpArguement[512];
         sprintf_s(lpArguement, "shell32.dll, OpenAs_RunDLL %s", lpFilename);
         HINSTANCE hInstance = ShellExecute(0, 0, "rundll32.exe", lpArguement, 0, SW_SHOW);     
        }
       }
       return;
      }
      CoUninitialize();

     



    • Marqué comme réponse cheickna1966 samedi 22 juillet 2017 23:43
    • Modifié cheickna1966 dimanche 23 juillet 2017 20:47 correction erreur
    samedi 22 juillet 2017 23:43

Toutes les réponses

  • 1155, c'est ERROR_NO_ASSOCIATION

    Dans ton exemple, il y a un espace à ". Docx"


    jeudi 20 juillet 2017 17:18
  • Bonjour Castorix31,

    Merci pour votre retour mais non malheureusement le problème ne vient pas de cet espace entre le point et l'extension Docx. Cette écriture est une faute de frappe de ma part. Dans le code ci-dessous les fichiers sont sélectionnés dans un MFC Shell List control. Les fichiers affichés sont bien fonctionnels sans erreur d'écriture pouvant créer un problème d'association. Si je double-clique sur mes fichiers Docx d'exemples ils s'ouvrent bien. Le problème est donc ailleurs.

    Ce problème semble d'ailleurs fréquents car plusieurs discussions sont envoyées sur les forums mais je ne trouve pas les raisons de cette erreur 1155

    jeudi 20 juillet 2017 19:09
  • Je n'arrive pas à reproduire cette erreur.

    En lançant en dur le code minimal avec un fichier de test :

    HINSTANCE hInstance = ShellExecute(NULL, L"open", L"C:\\test.docx", NULL, NULL, SW_SHOWNORMAL);
    ça m'ouvre bien Word avec le document test.docx, sous Windows 10

    jeudi 20 juillet 2017 19:47
  • Bonsoir Castorix31,

    Comme convenu j'ai testé la solution avec le chemin en dur comme vous l'avez fait :

    HINSTANCE hInstance = ShellExecute(NULL, L"open", L"C:\\test.docx", NULL, NULL, SW_SHOWNORMAL);


    J'ai obtenu une erreur à cause du L"open"

    Message d'erreur : "Erreur (active) E0167 l'argument de type "const wchar_t *" est incompatible avec le paramètre de type "LPCSTR"
    J'ai alors remplacé L"open" par _T("open")  et L"C:\\test.docx" par _T("C:\\test.docx") comme suit :

    HINSTANCE hInstance = ShellExecute(NULL, _T("open"), _T("C:\\test.docx"), NULL, NULL, SW_SHOWNORMAL);

    Le résultat est exactement le même : Error 1155

    Il doit donc y avoir d'autres problèmes qui empêche cette fonction ShellExecute de fonctionner comme elle doit

    Merci d'avance pour votre aide

    vendredi 21 juillet 2017 19:43
  • Et ça renvoie la même erreur avec d'autres extensions, comme un simple fichier texte .txt ?
    vendredi 21 juillet 2017 21:10
  • Oui tout à fait. J'ai essayé un fichier texte, pdf, exe et même jpg : même résultat
    vendredi 21 juillet 2017 22:59
  • L'erreur sur L"", c'est parce que tu n'es pas en Unicode, mais pas de rapport avec cette erreur.
    Si rien ne marche, il y a un problème au niveau de la base de registre.
    En contournement, mais ça peut ne pas marcher dans ton cas, on peut récupérer l'exécutable associé à une extension pour lancer le fichier ensuite :   
    En Unicode (WCHAR, à remplacer par char en Ansi), test avec fichier texte  =>
        
    HRESULT hr;
    WCHAR wsPath[MAX_PATH];
    DWORD cchSize = MAX_PATH;
    if (SUCCEEDED(hr = AssocQueryString(0, ASSOCSTR_EXECUTABLE, _T(".txt"), NULL, wsPath, &cchSize)))
    {    
       // lancement exécutable récupéré dans wsPath    
       // ...                
    }

    samedi 22 juillet 2017 09:08
  • Bonjour, ceci est effectivement une autre méthode dans la partie //lancement  de l'executable on reviendra toujours à utiliser une autre fonction comme Shellexecute ou Create Process ou Start, etc.

    C'est néanmoins intéressant de regarder ShellExecute car c'est frustant que pour le même environnement (Visual studio) une fonction qui est supposée être une API ne fonctionne pas d'une version à l'autre. Sur le même PC j'ai un programme développé en VC++ 6.0 qui fait appel à ShellExecute et cela fonctionne bien.

    Il est clair que la fonction ShellExecute est instable et ne facilite pas la maintenabilité d'une application. Le pire est que je viens de remplacer ShellExecute par ShellExecuteEx et le résultat est JUSTE ENORME.

    J'ai essayé d'exécuter les 3 exemples de fichiers (.docx, .txt et .pdf ) et ça marche avec le fichier texte mais j'obtiens la même erreur avec le docx et le pdf (étrangement étonnant). 

    ShellExecute se base bien sur les associations de fichier pour lancer une application et j'ai vérifier dans les paramètres de windows que .docx était bien associé à Word et .pdf était bien associé Acrobat Reader.

    Voici le code qui marche pour le fichier texte :

    		CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    		SHELLEXECUTEINFO sei;
    		sei.cbSize = sizeof(SHELLEXECUTEINFO);
    		sei.fMask = NULL;
    		sei.hwnd = NULL;
    		sei.lpVerb = "open";
    		//sei.lpFile = "c:\\test.pdf";
    		//sei.lpFile = "c:\\test.docx";
    		sei.lpFile = "c:\\test.txt";
    		sei.lpParameters = NULL;
    		sei.nShow = SW_SHOWNORMAL;
    		sei.hInstApp = NULL;
    		sei.lpIDList = NULL;
    		sei.lpClass = NULL;
    		sei.hkeyClass = NULL;
    		sei.dwHotKey = NULL;
    		sei.hIcon = NULL;
    		sei.hProcess = NULL;
    		sei.lpDirectory = "C:\\";
    		::ShellExecuteEx(&sei);
    		CoUninitialize();

    Avec .docx et .pdf le message est le suivant :

    Je me pose une dernière question : 

    Le jeux de caractère que j'utilise n'est pas Unicode mais Multioctet MBCS ( deux seuls choix dans les options de configuration du visual studio communauty 2017. L'ancien projet que j'ai et qui fonctionne avait il me semble un jeu de caractère ansi...le problème ne vient-il pas des jeux de caractères?

    Désolé pour la longueur du message mais j'aimerai percer le mystère de ce problème.

    samedi 22 juillet 2017 13:12
  • Sur le même PC j'ai un programme développé en VC++ 6.0 qui fait appel à ShellExecute et cela fonctionne bien.

    Si ça fonctionne avec toutes les extensions, même .docx, dans ce programme sur le même OS, le problème doit venir alors de la configuration de l'autre projet.

    (quand j'ai un projet qui semble avoir un problème, je repars d'un tout nouveau projet, en rajoutant les sources et autres fichiers 1 par 1 pour repartir d'un environnement "propre")

    (et tout en Unicode)

    samedi 22 juillet 2017 13:37
  • Effectivement, c'est une bonne démarche mais dans mon cas présent le problème est que le premier projet a été développé sous Visual C++ 6.0 et l'actuel en Visual C++ 2017... J'ai les sources du premier projet mais je n'ai plus l'environnement visual studio d'avant. Donc incapable de connaître les options de configurations de l'époque. La seule chose dont je suis sûr c'est que ce n'était pas en Unicode car je changement du jeu de caractère était une des premières actions que nous effectuions. Bref!

    Je vais essayer de chercher un outil pour nettoyer la registry windows et voir si le problème ne vient de là car ERR_ASSOCIATION ne vient que de là comme tu as d'ailleurs dit aussi.

    Affaire à suivre....

    samedi 22 juillet 2017 14:15
  • CA MARCHE!!!!!

    Merci beaucoup Castorix31 pour toutes ces aides sans quoi je n'aurai pas trouvé.

    Finalement, comme tu avais dit, le problème venait de la base de registre. Après le nettoyage avec un outil spécifique qui a supprimé une centaine d'entrées non valide, j'ai aussi modifier manuellement dans les paramètres de Windows 10 les associations programmes/types de fichiers. Pour cela j'ai réinitialisé les valeurs par défaut pour windows puis j'ai modifier spécifiquement les types de données PDF qui étaient affectés par défaut à Microsoft Edge et non à Acrobat Reader ou a Adobe Acrobat.

    ShellExecute et ShellExecuteEx se sont dons mises à fonctionner. Ouffff!

    J'ai découvert aussi dans mes recherches le moyen d'afficher par programme la boîte de dialogue "Ouvrir avec..." qui peut être utile si ShellExecute ne fonctionne pas.

    Je me suis donc permis le luxe d'utiliser ShellExecute et si cela ne marche pas j'utilise ShellExecuteEx et si les deux ne marchent pas tant pis je donne la possibilité aux utilisateurs de choisir eux même le programme souhaité pour ouvrir le fichier souhaité.

    Voici le bout de code qui fait ça :

      CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
      
      HINSTANCE hInstance = ShellExecute(NULL, szAction, lpFilename, NULL, NULL, SW_SHOWNORMAL);
      if (hInstance <= (HINSTANCE)32)
      {
       //On tente de traiter le document avec ShellExecuteEx
       SHELLEXECUTEINFO sei;
       sei.cbSize = sizeof(SHELLEXECUTEINFO);
       sei.fMask = NULL;
       sei.hwnd = NULL;
       sei.lpVerb = "open";
       sei.lpFile = lpFilename;
       sei.lpParameters = NULL;
       sei.nShow = SW_SHOWNORMAL;
       sei.hInstApp = NULL;
       sei.lpIDList = NULL;
       sei.lpClass = NULL;
       sei.hkeyClass = NULL;
       sei.dwHotKey = NULL;
       sei.hIcon = NULL;
       sei.hProcess = NULL;
       sei.lpDirectory = NULL;
       BOOL ret = ShellExecuteExA(&sei);
       if (!ret) {
        //On recupère d'abord le message d'erreur et on informe l'utilisateur qu'on va lui proposer de choisir le manuemment le programme
        //qui doit ouvrir le fichier
        TCHAR sMsg[1024];
        sprintf_s(sMsg, _T("Problème d'ouverture du fichier \"%s\", Error: %d \nVeuillez sélectionner un programme pour ouvrir le fichier"), lpFilename, GetLastError());
        //MessageBox(sMsg, lpFilename, MB_OK | MB_ICONEXCLAMATION);
        if (GetErrorMessage((int)hInstance) == 0) {     
         char lpArguement[512];
         sprintf_s(lpArguement, "shell32.dll, OpenAs_RunDLL %s", lpFilename);
         HINSTANCE hInstance = ShellExecute(0, 0, "rundll32.exe", lpArguement, 0, SW_SHOW);     
        }
       }
       return;
      }
      CoUninitialize();

     



    • Marqué comme réponse cheickna1966 samedi 22 juillet 2017 23:43
    • Modifié cheickna1966 dimanche 23 juillet 2017 20:47 correction erreur
    samedi 22 juillet 2017 23:43