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

MFC Discussion :

Se débarasser de la fenetre pop-up de la commande "system"


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut Se débarasser de la fenetre pop-up de la commande "system"
    Bonjour a tous,

    Je suis nouveau sur le forum...mais pas sur le site, qui m'a deja rendu de nombreux services via ses tutos.
    Masi, voici le temps de ma premiere question..et deuxieme dans la foulee!

    Voila mon premier probleme.
    J'aimerais me débarasser des fenetres qui apparaissent furtivement a chaque fois que mon code execute la commande "system". Cela fait du plus mauvais effet ces fenetres qui gachent ma boite de dialogue! ;-)

    Et mon deuxieme.
    Je cherche en vain a faire centrer de maniere automatique mes fenetres ,boites de dialogues et messageBox au milieu de l'ecran quelquesoit la resolution du PC.

    Merci de votre aide

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Pour ta première question, tu as avantageusement à remplacer system par shellexecute, regarde dans la faq http://c.developpez.com/faq/vc/

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Désolé mais je ne trouve pas dínformations concernant Shellexecute sur la page que tu m'as recommandée.
    Allons voir sur MSDN!

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    J'ai jete un coup d óeil a cette fonction "ShellExecuteEx".
    Cependant, ce la ne resout pas mon probleme. En effet, la commande que j'execute avec "system" est une commande "DOS maison", qui nessecite le formatage suivant dans la fenetre de commande :

    Encode -p "fichier.txt" -d "fichier.fty"

    Comment declarer une telle commande au sein de ShellExecuteEx?
    Cela ne me semble pas possible au regard de ce que j'ai lu sur MSDN.

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par Mac Twist
    J'ai jete un coup d óeil a cette fonction "ShellExecuteEx".
    Cependant, ce la ne resout pas mon probleme. En effet, la commande que j'execute avec "system" est une commande "DOS maison", qui nessecite le formatage suivant dans la fenetre de commande :

    Encode -p "fichier.txt" -d "fichier.fty"

    Comment declarer une telle commande au sein de ShellExecuteEx?
    Cela ne me semble pas possible au regard de ce que j'ai lu sur MSDN.
    salut,
    tu n'as pas bien lu ou regardé le lien de la faq.
    tes options sont considerées comme des arguments .
    dans le cas de shellexecutex il suffit de mettre les arguments dans
    ExecuteInfo.lpParameters comme dans le lien de la faq...


  7. #7
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Si Encode est un programme console, sa console sera visible par défaut. Pour la cacher, il faut passer par CreateProcess avec CREATE_NO_WINDOW.
    Regarde dans la FAQ VC++.

  8. #8
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Suivant vos conseils, j'ai partiellement réussi a convertir toutes mes commandes "system" par des ShellExecuteEx.
    Le probleme cest que tout ne fonctionne plus tres rond!
    Voila ce que je cherche a faire:
    1- Copier un fichier texte reference
    2- Modifier ce fichier texte
    3- L'encoder en un autre format
    4- Effacer le fichier texte

    Tout fonctionnait parfaitement avec la commande system. A present, ca bugge et je n'arrive pas a remonter la a source du probleme : insertions de messageBox pour voir ou ca coince,etc...
    Je me suis dit que je devais oublier de faire quelquechose avec les commandes ShellExecuteEx..j'ai donc ajouté quelques lignes pour etre sur que mes process soient bien termines avant de passer a autre chose (par ex pour etre sur que mes fichiers soient crees avant d'ecrire dedans)...mais voila ca coince toujours. Ci-dessous mon code...

    A votre bon coeur..(j'ai attendu quelques jours histoire déssayer tout seul..en vain)

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    int CreateSeparator(char depth[50],char* prefixString,char* suffixString,HWND hwnd)
    {
        FILE *f;
        int i=0,depthLength=0,depthBufferLength=0,lengthDiff=0;
        char buffer[100],depth2[20],commandString1[50],commandString2[50],commandString3[50];
        char key[20] = "\"";    
     
        //Recording length of depth number
        depthLength=strlen(depth);
     
        strcpy(commandString1,"/c copy \"C:\\WINDOWS\\Separator_Model.txt\" \"");
     
        strcpy(commandString2,"Separator_");
        strcpy(commandString3,".txt\"\0");
     
        strcat(commandString1,commandString2); 
        strncat(commandString1,depth,depthLength);
        strcat(commandString1,".txt\"");
     
        strncat(commandString2,depth,depthLength);
        strcat(commandString2,".txt");
     
        //Execute copy command
        //system(commandString1);
     
     
        //C++ Way 
     
        SHELLEXECUTEINFO ExecuteCopyInfo;    
        memset(&ExecuteCopyInfo, 0, sizeof(ExecuteCopyInfo));
     
        ExecuteCopyInfo.cbSize       = sizeof(ExecuteCopyInfo);
        ExecuteCopyInfo.fMask        = 0;                
        ExecuteCopyInfo.hwnd         = 0;                
        ExecuteCopyInfo.lpVerb       = "open";                      
        ExecuteCopyInfo.lpFile       = "c:\\windows\\system32\\cmd.exe";
        ExecuteCopyInfo.lpParameters = commandString1;
        ExecuteCopyInfo.lpDirectory  = 0;
        ExecuteCopyInfo.nShow        = SW_HIDE;
        ExecuteCopyInfo.hInstApp     = 0;    
        if(ShellExecuteEx(&ExecuteCopyInfo) == FALSE)
        {
        // erreur
        }
        else 
        { 
            MessageBox(hwnd,commandString2,"Comandstring",MB_OK);
          WaitForSingleObject(ExecuteCopyInfo.hProcess, INFINITE); 
        }
        ::CloseHandle(ExecuteCopyInfo.hProcess);
     
    //    MessageBox(hwnd,commandString2,"Comandstring",MB_OK);
     
        f = fopen( commandString2 , "r+" );
    //    MessageBox(hwnd,commandString2,"Comandstring",MB_OK);
        while(strcmp(buffer,key)!=0 )
        {
            fscanf(f,"%s",buffer);
        }
     
                         //MessageBox(hwnd,"ok","ok",MB_OK);
        //Prepare ASCII file
        fseek (f,0,SEEK_CUR);
        fputs (" ",f);
        fputs (prefixString,f);
        fputs (" ",f);
        fputs (depth,f);
        fputs (suffixString,f);
     
        fputs (" \"",f);
     
        fclose(f);
     
        //Encode ASCII to PDS
     
        strcpy(commandString1,"/c pdsencode -d \"Separator_");
        strcpy(commandString2,".txt\" -p \"Separator_");
        strcpy(commandString3,".pds\"");
        strcpy(depth2,depth);
     
        strcat(commandString1,depth); 
        strcat(commandString1,commandString2);
        strcat(commandString1,depth);
        strcat(commandString1,commandString3);
        //MessageBox(hwnd,commandString1,"PDS encode Command",MB_OK);
        //i = system (commandString1);
     
        SHELLEXECUTEINFO ExecuteEncodeInfo;    
        memset(&ExecuteEncodeInfo, 0, sizeof(ExecuteEncodeInfo));
     
        ExecuteEncodeInfo.cbSize       = sizeof(ExecuteEncodeInfo);
        ExecuteEncodeInfo.fMask        = 0;                
        ExecuteEncodeInfo.hwnd         = 0;                
        ExecuteEncodeInfo.lpVerb       = "open";                      
        ExecuteEncodeInfo.lpFile       = "c:\\windows\\system32\\cmd.exe";
        ExecuteEncodeInfo.lpParameters = commandString1;
        ExecuteEncodeInfo.lpDirectory  = 0;
        ExecuteEncodeInfo.nShow        = SW_HIDE;
        ExecuteEncodeInfo.hInstApp     = 0;    
        if(ShellExecuteEx(&ExecuteEncodeInfo) == FALSE)
        {
        // erreur
        }
        else 
        { 
          WaitForSingleObject(ExecuteEncodeInfo.hProcess, INFINITE); 
        }
        ::CloseHandle(ExecuteEncodeInfo.hProcess);
     
        //Delete ASCII File
        strcpy(commandString1,"/c del \"Separator_");
        strcpy(commandString2,".txt");
     
        strcat(commandString1,depth);
        strcat(commandString1,commandString2);
     
        //i = system (commandString1);
        //MessageBox(hwnd,commandString1,"PDS encode Command",MB_OK);
        SHELLEXECUTEINFO ExecuteDeleteInfo;    
        memset(&ExecuteDeleteInfo, 0, sizeof(ExecuteDeleteInfo));
     
        ExecuteDeleteInfo.cbSize       = sizeof(ExecuteDeleteInfo);
        ExecuteDeleteInfo.fMask        = 0;                
        ExecuteDeleteInfo.hwnd         = 0;                
        ExecuteDeleteInfo.lpVerb       = "open";                      
        ExecuteDeleteInfo.lpFile       = "c:\\windows\\system32\\cmd.exe";
        ExecuteDeleteInfo.lpParameters = commandString1;
        ExecuteDeleteInfo.lpDirectory  = 0;
        ExecuteDeleteInfo.nShow        = SW_HIDE;
        ExecuteDeleteInfo.hInstApp     = 0;    
        if(ShellExecuteEx(&ExecuteDeleteInfo) == FALSE)
        {
        // erreur
        }
        else 
        { 
          WaitForSingleObject(ExecuteDeleteInfo.hProcess, INFINITE); 
        }
        ::CloseHandle(ExecuteDeleteInfo.hProcess);*/
     
        return 0;
    }

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    Salut, l'interpréteur cmd.exe ne fonctionne pas comme ca.

    De plus, je te conseille de remplacer les appels à un programme de copy par l'api win32 en elle meme. ==>CopyFile(...)

  10. #10
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Merci...Je decouvre les commandes equivalentes pour win32!!
    Cependant, j'ai un probleme avec CopyFile. Voila, des que j'essaie de copier un fichier qui est dans mon repertoire par defaut, je ne rencontre aucun probleme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyFile("Model.fnl","copyModel.fnl",TRUE);
    Mais, des que mon addresse de fichier veut remonter plus haut (par exemple C:WINDOWS\Model.fnl), cela ne fonctionne plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CopyFile("C:Windows\Model.fnl","copyModel.fnl",TRUE);
    Que manque t'il?

    A votre bon coeur!

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    il faut doubler les \, à savoir :
    C:\\Windows\\Model.fnl

  12. #12
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Voila, j ai suivi tes conseils: j ai remplace mes "anciennes" commandes par des "CopyFile" et "DeleFile".

    Cependant, il semble que mon application efface mes fichiers textes pendant que je le utilise avec mon process d'encodage via "ShellExecute" (les fichiers encodes sont vides).
    Chose bizarre (ou pas ), il suffit que je rajoute une ligne de code juste avant ma commande "deleteFile" (genre "MessageBox(hwnd,"blabla","blbla",MB_OK);" ) pour que tout se passe bien : ie mon fichier est encode via ShellExecute et ensuite efface avec DeleteFile.

    Pourtant, j'utilise bien les lignes de la FAQ Visual C++ qui sont censees garantir que l'application ne continue pas tant que le process est actif.

    Je desespere...

  13. #13
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    qu'est-ce que tu utilises pour attendre la fin de ton process ?

  14. #14
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Je passe par "WaitForSingleObject(ExecuteEncodeInfo.hProcess, INFINITE);"

    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
    SHELLEXECUTEINFO ExecuteEncodeInfo; 
    memset(&ExecuteEncodeInfo, 0, sizeof(ExecuteEncodeInfo));
     
    ExecuteEncodeInfo.cbSize = sizeof(ExecuteEncodeInfo);
    ExecuteEncodeInfo.fMask = 0; 
    ExecuteEncodeInfo.hwnd = 0; 
    ExecuteEncodeInfo.lpVerb = "open"; 
    ExecuteEncodeInfo.lpFile = "c:\\windows\\system32\\cmd.exe";
    ExecuteEncodeInfo.lpParameters = commandString1;
    ExecuteEncodeInfo.lpDirectory = 0;
    ExecuteEncodeInfo.nShow = SW_HIDE;
    ExecuteEncodeInfo.hInstApp = 0; 
    if(ShellExecuteEx(&ExecuteEncodeInfo) == FALSE)
    {
    // erreur
    }
    else 
    { 
    WaitForSingleObject(ExecuteEncodeInfo.hProcess, INFINITE); 
    }
    ::CloseHandle(ExecuteEncodeInfo.hProcess);

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    on utilise pas l'interpreteur de commande ainsi !

    y a quoi dans
    commandString1 ?

  16. #16
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Voila, un example de que commandString contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /c pdsencode -d Separator_555.txt -p Separator_555.pds
    Et voila le code qui remplit commandString; depth est un parametre de la fonction qui contient ces lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    strcpy(commandString1,"/c pdsencode -d \"Separator_");
        strcpy(commandString2,".txt\" -p \"Separator_");
        strcpy(commandString3,".pds\"");
     
        strncat(commandString1,depth,depthLength); 
        strcat(commandString1,commandString2);
        strncat(commandString1,depth,depthLength);
        strcat(commandString1,commandString3);
    Merci encore de ton aide

  17. #17
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Désolé dávoir gaspiller ton temps.
    En fait, il me manquait la ligne suivante!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExecuteEncodeInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    Encore désolé : je suis le premier a rager quand les gens ne cherchent pas par eux-memes!

  18. #18
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    pas de soucis, pense à marquer le post comme résolu

  19. #19
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 53
    Par défaut
    Quelqu'un semble l'avoir déja fait...

  20. #20
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    non, ce n'est pas le cas ; mais je m'en occupe

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

Discussions similaires

  1. Fenetre pop up taille
    Par marty499 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/05/2009, 12h10
  2. Réponses: 9
    Dernier message: 04/01/2008, 15h49
  3. affichage d'une fenêtre pop-up
    Par zizoux5 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/08/2007, 22h35
  4. Réponses: 1
    Dernier message: 22/07/2007, 17h42
  5. [VBA-E]fenetre pop-up à minuterie et toujours au premier plan
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/10/2006, 14h49

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