IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dev-C++ Discussion :

erreur si sélection fichiers à la racine (dev-cpp,windows)


Sujet :

Dev-C++

  1. #1
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut erreur si sélection fichiers à la racine (dev-cpp,windows)
    bonjour,
    je m'explique :
    grâce à vous, j'ai mis en place un petit programme
    pour explorer les répertoires/fichiers des supports,
    ça fonctionne ( enfin je crois ), sauf si je fais une
    sélection multiple sur des fichiers à la racine d'un
    support. les programmes associés à ces fichiers
    sont bien lancés, mais "mon" programme s'arrête.
    pouvez-vous m'aider ? car je ne vois pas mon
    (mes) erreur(s).
    ci-dessous la source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    #include <windows.h>
    #include <string>
    #include <shellapi.h>
     
    OPENFILENAME ofn;
    using namespace std;
     
    char Progr[]="° Explorateur ° Mars 2005 °";
    char rep[MAX_PATH]="";    // répertoire
    char szFileName[2048]=""; // fichier
    char Ini[MAX_PATH] = "";  // fichier .ini
    char szClassName[] = "WindowsApp";
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    BOOL Explorer(HWND hwnd)
    { if (!GetOpenFileName(&ofn)) return false;
      unsigned long length;
      char* pnt = szFileName;
      int PrFois=0;
      char mem[MAX_PATH]="";
      char inter[MAX_PATH]="";
      // ce que renvoie GetOpenFileName est de la forme
      // répertoire \0 fichier 1 \0 fichier 2 \0 ... dernier fichier \0 \0
      // ou un seul fichier \0 \0
      while ( (length = strlen(pnt)) != 0 )
            {     if ( PrFois==0 )      // mémoriser 1er poste
                       { strcpy(mem,pnt); }
                  else                  // lancer le programme associé
                       { strcpy(inter,mem);
                         char* fin = inter + strlen(inter) - 1;
                         if ( fin != "\\" ) { strcat(inter,"\\");  }
                         strcat(inter,pnt);
                         ShellExecute(hwnd,NULL,inter,NULL,NULL,SW_SHOWNORMAL);  }
                  pnt += length + 1;     // poste suivant
                  PrFois++; }
      if ( PrFois==1 )  // si 1 seul fichier sélectionné
           { ShellExecute(hwnd,NULL,mem,NULL,NULL,SW_SHOWNORMAL); }
      strcpy(rep,mem);
      return true;    } // on continuera
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    LRESULT CALLBACK WindowProcedure (      HWND hwnd,
                                            UINT message,
                                            WPARAM wParam,
                                            LPARAM lParam)
    {   switch (message)      
        {   case WM_DESTROY:
                PostQuitMessage (0);
                break;
            default:                
                return DefWindowProc (hwnd, message, wParam, lParam);    }
        return 0;            }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int WINAPI WinMain (    HINSTANCE hThisInstance,
                            HINSTANCE hPrevInstance,
                            LPSTR lpszArgument,
                            int nFunsterStil    )
    {   HWND hwnd;
        MSG messages;
        WNDCLASSEX wincl;
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;
        wincl.style = CS_DBLCLKS;
        wincl.cbSize = sizeof (WNDCLASSEX);
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;
        wincl.cbClsExtra = 0;
        wincl.cbWndExtra = 0;
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
        if (!RegisterClassEx (&wincl))    return 0;
        hwnd = CreateWindowEx (    0,szClassName,Progr,WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT,CW_USEDEFAULT,0,0,HWND_DESKTOP,
                                   NULL,hThisInstance,NULL           );
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ZeroMemory(&ofn, sizeof(ofn)); // préparation fenêtre explorateur                           
        szFileName[0] = 0;
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hwnd;
        ofn.lpstrFile = szFileName;
        ofn.nMaxFile = MAX_PATH;
        ofn.lpstrTitle=Progr;
        ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY |
                    OFN_ALLOWMULTISELECT | OFN_NODEREFERENCELINKS |
                    OFN_LONGNAMES | OFN_SHAREAWARE ;
        ofn.lpstrInitialDir=lpszArgument;
        ofn.lpstrFilter = "Tous\0*\0Executables\0*.bat;*.com;*.exe;*.hta\0Textes\0*.doc;*.rtf;*.txt\0*\0*\0\0";
        GetModuleFileName(0,Ini,sizeof(Ini)-1);
        char suffixe[]="ini";
        for ( int i=0;i<sizeof(suffixe)-1;i++ )
            { Ini[strlen(Ini)-i-1]=suffixe[i]; }
        char fic[_MAX_PATH]=""; // fichiers à lister
        GetPrivateProfileString("Paramètres","Fichiers",false,fic,sizeof(fic),Ini); 
        if ( sizeof(fic)>0 )
             {  for ( int i=0; i<sizeof(fic); i++ )
                   { if (fic[i]=='|' ) fic[i]='\0';  }
                ofn.lpstrFilter=fic; }
        if ( lpszArgument[0]=='\0' )
             {  GetPrivateProfileString("Paramètres","Répertoire",false,
                                        rep,sizeof(rep),Ini);
                ofn.lpstrInitialDir=rep;  }
        BOOL EnCours=true;
        while ( EnCours )
            { EnCours=Explorer(hwnd);   }
        WritePrivateProfileString("Paramètres","Répertoire",rep,Ini); }
     
    /*######################################################################*/
    toutes les remarques à propos de mon 1er
    programme en c++ sont les bienvenues.
    merci d'avance. @+

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Difficile de t'aider. Y'a un gros paquet de code, et c'est du code Windows et pas C++ standard.
    Il faut localiser l'erreur (exécuter avec le debuger).
    Je vois des strcpy, des strcat... utilise plutot std::string, surtout que Rolka t'avait donné le code pour faire ce que tu veux avec les string C++.
    http://c.developpez.com/faq/cpp/?page=strings

  3. #3
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    merci de la réponse,
    cela m'a semblé plus simple, ici,
    de faire comme j'ai fait plutôt que
    d'utiliser std::string ( mais j'ai
    sûrement tort .. )

    en fait, j'ai mis tout le code "au cas ou",
    mais le problème se situe entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while ( EnCours )
            { EnCours=Explorer(hwnd);   }
    et la fonction Explorer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                       { strcpy(inter,mem); 
                         char* fin = inter + strlen(inter) - 1; 
                         if ( fin != "\\" ) { strcat(inter,"\\");  } 
                         strcat(inter,pnt); 
                         ShellExecute(hwnd,NULL,inter,NULL,NULL,SW_SHOWNORMAL);  }
    enfin, je crois, puisque le programme s'arrête uniquement
    lors d'une multi-selection de fichiers s'ils sont à la racine
    d'un support, dans tous les autres cas, ça baigne ( mono
    sélection et/ou fichiers dans un répertoire )
    le reste n'a pas d'influence, je pense (?).
    je ne parviens d'ailleurs pas à utiliser le debuger,
    enfin à visualiser les variables, je vais insister.
    @+

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( fin != "\\" ) { strcat(inter,"\\");  }

    erreur classique

    il faut utiliser une fonction de comparaison de chaine

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Chose qui ne serait pas arrivé avec std::string...
    Je pense qu'il voulait faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( *fin != '\\' )

  6. #6
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    même punition, même motif ...
    j'aimerai, quoiqu'il arrive,
    résoudre ce problème, sans votre
    aide j'en suis bien incapable,
    même si utiliser les char c'est pas
    bien... y'a pas de raison.
    @+

  7. #7
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    j'ai essayé aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if ( strcmp( fin, "\\") !=0 ) { strcat(inter,"\\");  }
     if ( strcmp( fin, '\\') !=0 ) { strcat(inter,"\\");  }
     if ( strcmp( *fin, "\\") !=0 ) { strcat(inter,"\\");  }
     if ( strcmp( *fin, '\\') !=0 ) { strcat(inter,"\\");  }
    ... même souci...
    à mon avis l'erreur n'est pas là, si ?
    @+

  8. #8
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // la c'est ok !
    char* fin = inter + strlen(inter) - 1; 
     
    // ici cela change un peu
    if ( *fin != '\\' ) { strcat(inter,"\\");  }

    il y a aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( *fin != '\\' ) 
    {
         *(++fin) = '\\';
         *(++fin) = '\0';
    }

  9. #9
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    même chose,
    mais j'insiste : je pense que l'erreur est ailleurs ...
    les fichiers sélectionnés sont bien
    traités
    , donc l'ajout du / se passe
    bien
    ??? ( quelle que soit la manière
    d'ajouter ce / en fin ), mais le
    programme se termine.
    @+

  10. #10
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Passe en mode debug dans ton code, tu verras comment il réagit

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Soit déjà sûr de l'emplacement de l'erreur...

  12. #12
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    Passe en mode debug
    je n'arrive pas à le faire avec dev-cpp
    Soit déjà sûr de l'emplacement de l'erreur
    euh, pas de message d"erreur...
    si je connaissais l'emplacement de l'erreur
    ce serait sûrement résolu, par vous.
    mais merci de vous intéresser.
    je vais réessayer le debug.
    @+

  13. #13
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    après moultes difficultés, j'ai réussi à
    comprendre comment avancer avec debug
    alors,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (!GetOpenFileName(&ofn)) return false;
    ça vient de l'utilisation de GetOpenFileName,
    si l'on peut dire...

    au départ on appelle Explorer() GetOpenFilename => on sélectionne plusieurs
    fichiers sous la racine
    tout se passe bien dans la fonction,
    les fichiers sélectionnés sont bien traités
    et la fonction retourne true;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        while ( EnCours )
            { EnCours=Explorer(hwnd);   }
    donc on rappelle Explorer
    et GetOpenFileName(&ofn) cette fois,
    ne propose pas de sélectionner des fichiers
    mais retourne immédiatement false, donc mon
    programme s'arrête.

    suis-je clair ?
    sauriez-vous me dire pourquoi ?
    ou me donner des pistes de recherche ?
    merci de votre patience.
    @+

  14. #14
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    bon, finalement ça fonctionne si je
    rajoute szFileName[0] = 0;
    dans la fonction Explorer() !
    comprend pas réellement pourquoi,
    je vais mettre "résolu"
    merci à vous,
    pouvez-vous m'expliquer quand même ?

  15. #15
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    lpstrFile
    Pointer to a buffer that contains a file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary. When the GetOpenFileName or GetSaveFileName function returns successfully, this buffer contains the drive designator, path, file name, and extension of the selected file.
    Il faut respecter l'initialisation de la structure OPENFILENAME. Pour connaître tous les attributs et leur initialisation direction la MSDN.

  16. #16
    bul
    bul est déconnecté
    Membre habitué Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 193
    Points : 133
    Points
    133
    Par défaut
    même si je suis nul en anglais
    ( eh oui, là aussi ) : j'ai compris !
    merci, pour tout, à tous.
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture d'un fichier son sous dev-cpp
    Par yashiro dans le forum Dev-C++
    Réponses: 4
    Dernier message: 02/05/2006, 17h26
  2. erreur avec dev cpp
    Par rimbaut dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 25/02/2006, 16h21
  3. Réponses: 2
    Dernier message: 14/11/2005, 11h07
  4. Un VRAI fichier d'aide pour Dev-Cpp ?
    Par TheRedLed dans le forum Dev-C++
    Réponses: 3
    Dernier message: 08/06/2005, 19h37
  5. [Dev-Cpp] Erreur "Macro Names Must be Identifiers"
    Par TheRedLed dans le forum Dev-C++
    Réponses: 6
    Dernier message: 07/06/2005, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo