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

C++Builder Discussion :

ouvrir un .exe avec ShellExecute en tant que fenetre Fille


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Par défaut ouvrir un .exe avec ShellExecute en tant que fenetre Fille
    bonsoir,

    tout d'abord je voudrais m'excuser si ma question est stupide mai sincèrement je ne trouve pas de réponse a celle ci donc je voulais savoir comment faire pour exécuter un programme externe en tant que fenêtre fille avec ShellExecute

    pour être plus précis je voudrais que le fichier.exe s'affiche a l’intérieur de la fenêtre(Form1) principal

    voici le code en question ou je me suis arreter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(Form1, "open", "D://ProjetBorland//aplic//applic2//fichier.EXE", NULL, NULL, SW_SHOWNORMAL);
    merci a vous,

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    confusion / et \ dans les chemins
    Le Premier pour le monde linux ou web
    le Second pour windows

    confusion / et \ comme caractère d'échappement
    / est un caractère normal
    \ est utilisé comme caractère d'échappement

    conclusion remplace les // par \\
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    confusion / et \ dans les chemins
    Le Premier pour le monde linux ou web
    le Second pour windows

    confusion / et \ comme caractère d'échappement
    / est un caractère normal
    \ est utilisé comme caractère d'échappement

    conclusion remplace les // par \\
    Merci a toi ShaiLeTroll je savais pas pourtant les 2 solutions marche pareil mai je vais quand même suivre ton conseil merci, ceci dis je ne sais toujours pas si on peut ouvrir un fichier .exe externe en tant que fenêtre fille

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Utilise CreateProcess avec le Handle retourné tu pourras utiliser un EnumWindows ou CreateToolhelp32Snapshot pour trouver la fenêtre voulu puis faire un SetParent

    Sinon, avec ShellExecute, FindWindow et SetParent c'est possible, mais le contexte d'execution est plus "risquée"


    Afficher une autre application dans un exe
    Fenêtre dans une autre?
    [D7] Ouvrir Excel dans une form
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Utilise CreateProcess avec le Handle retourné tu pourras utiliser un EnumWindows ou CreateToolhelp32Snapshot pour trouver la fenêtre voulu puis faire un SetParent

    Sinon, avec ShellExecute, FindWindow et SetParent c'est possible, mais le contexte d'execution est plus "risquée"
    oulaaa!!! sa a l'aire plus compliquer que je le pensais je vais faire des recherche sur CreateProcess pour voir comment sa se place dans le code mais sinon tu entend quoi par plus "risquée"?

    en tous cas je te remercie de m'avoir répondu je teste tout ça et je te tien au courant

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    sa a l'aire ou cela à l'air ?

    Si l'on devait s'arrêter à chaque obstacle, tu as en plus choisi le C++, c'est un langage très utilisé mais pas le plus simple par rapport au Visual Basic ou au Delphi !

    Le CreateProcess fait que ton programme est propriétaire de l'exe lancé, si on arrête ton programme, normalement, cela arrête l'autre aussi (à tester selon les options de Startup), tu dois d'ailleurs pouvoir empêcher sa fermeture plus facilement car tu as déjà tous les identifiants utilies dans lpProcessInformation et tu peux en détourner les Pipes (pratique pour une application console)

    le ShellExecute lance le programme mais c'est l'explorer le propriétaire de l'exe, comme le programme est indépendant, il faut faire gaffe à ce que l'on ne ferme pas le programme alors que tu as détourné la fenêtre, violation d'accès assuré sinon !
    Mais tu dois pouvoir aussi masquer l'exe pour éviter qu'on le ferme, c'est juste plus pénible car il faut retrouver les handles nécessaires aux API

    Les deux méthodes peuvent provoqués des Violations d'Accès, la modification du Parent via _WINDOWS_::SetParent est une bidouille !
    Le plus propre serait que ton programme appelé fournisse un Control ActiveX (DLL) le contexte d'execution sera différent (partage de la mémoire grandement facilité)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Par défaut
    salut ShaiLeTroll

    je voulais dire cela a l'aire... lol mais bon je suis pas du genre a m’arrêter devant un obstacle j'adore les défit c'est ce qui me fait avancer.

    Donc pour revenir a mon petit problème j'ai réussis a faire ce que je voulais a une chose près, le problème c'est que je doit d'abord ouvrir le fichier.exe pour que le bouton dans mon programme le prenne en charge dans mon form1

    ce qui ne sert strictement a rien si je doit d'abord l'ouvrir pour qu'il apparaisse dans mon forme1

    y aurait il une erreur dans mon code s'il te plait si tu peu m'aider encore un peu?


    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
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION procInfo;
    memset(&startupInfo, 0, sizeof(STARTUPINFO));
    memset(&procInfo, 0, sizeof(PROCESS_INFORMATION));
    startupInfo.cb = sizeof(STARTUPINFO);
    startupInfo.lpReserved = NULL;
    startupInfo.dwFlags = STARTF_USESHOWWINDOW;
    startupInfo.wShowWindow = SW_SHOWNORMAL;
     
     
    AnsiString teste=CreateProcess( NULL,
    				"C:\\Users\\keusty\\Desktop\\teste\\fichier.exe",
    				NULL,
    				NULL,
    				FALSE,
    				NORMAL_PRIORITY_CLASS,
    				NULL,
    				NULL,
    				&startupInfo,
    				&procInfo);
     
    HWND HWindow = FindWindow(NULL, "fichierexe");
    HWND HNewParent =  Form1->Handle;
    if (HWindow != NULL && HNewParent != NULL)
    ::SetParent(HWindow, HNewParent);

    merci encore

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    le problème c'est que je doit d'abord ouvrir le fichier.exe
    Que veux tu dire ?
    CreateProcess lance le programme, tu devrais utiliser SW_HIDE au lieu de SW_SHOWNORMAL, ton programme sera invisible, c'est surement cela que tu décris, en même temps, il serait bon d'étudier le code que tu écris (ou copies)


    Puis tu capture sa fenêtre via SetParent
    Au besoin, tu force un ShowWindow(HWindow, SW_SHOW) après le SetParent
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Par défaut
    CreateProcess lance le programme, tu devrais utiliser SW_HIDE au lieu de SW_SHOWNORMAL, ton programme sera invisible, c'est surement cela que tu décris, en même temps, il serait bon d'étudier le code que tu écris (ou copies)
    c est exactement ça pourtant j'ai supprimé tout le reste et garder que le createprocess et remplacer SW_SHOWNORMAL par SW_HIDE mais rien y fait le programme est toujours visible je comprend pas je vais encore chercher, si tu a une petite idée je suis preneur

    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
     
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION procInfo;
    memset(&startupInfo, 0, sizeof(STARTUPINFO));
    memset(&procInfo, 0, sizeof(PROCESS_INFORMATION));
    startupInfo.cb = sizeof(STARTUPINFO);
    startupInfo.lpReserved = NULL;
    startupInfo.dwFlags = STARTF_USESHOWWINDOW;
    startupInfo.wShowWindow = SW_HIDE;
     
    CreateProcess( NULL,
    				"C:\\Users\\keusty\\Desktop\\teste\\fichier.exe",
    				NULL,
    				NULL,
    				FALSE,
    				NORMAL_PRIORITY_CLASS,
    				NULL,
    				NULL,
    				&startupInfo,
    				&procInfo);

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Essaye avec Notepad ou Explorer, ainsi qu'un tout petit programme Delphi !
    Tu verras que le programme Delphi devrait ignorer SW_HIDE (à mes souvenirs, cela peut dépendre de la version) alors que Notepad ou Explorer vont s'y plier !

    Si tu peux modifier le programme appelé, ajoute un paramètre sur la ligne de commande pour le forcer à faire ShowMainForm à false ou alors utilise GetStartupInfo()

    j'ai évoqué le phénomène de certains programmes réticents à ShowWindow SW_HIDE via CreateProcess

    Essaye de le faire comme ceci
    on va brièvement voir la fenêtre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HWND HWindow = FindWindow(NULL, "fichierexe");
    if (HWindow)
      ::ShowWindow(HWindow, SW_HIDE); 
     
    HWND HNewParent =  Form1->Handle;
    if (HWindow != NULL && HNewParent != NULL)
    {
      ::SetParent(HWindow, HNewParent);
      ::ShowWindow(HWindow ,SW_SHOW); 
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 188
    Par défaut
    Merci ShaiLeTroll je viens d'essayer aussi avec le code que tu m'a donner rien y fait le programme s’exécute quand même, et disparait pour apparaitre dans mon Form1 seulement quand je clic sur le bouton, de plus quand il es dans mon Form1 et que je le ferme il ne s'ouvre plus après le clic je suis toujours obliger de l’exécuté manuellement en dehors de mon programme pour qu'il réagit au clic du bouton qui se trouve dans mon Form1 la je crains que je ne puisse plus avancé je suis vraiment bloquer

    Si tu peux modifier le programme appelé, ajoute un paramètre sur la ligne de commande pour le forcer à faire ShowMainForm à false ou alors utilise GetStartupInfo()
    et en ce qui concerne le paramètre pour le forcer a faire un ShowMainForm à false je n'ai aucune idée de "ou je dois le placer ni comment" j'ai été voir sur le lien que tu m'a donner mai je suis sincèrement désolé je n'y comprend rien et j'ai visité d'autre site et je n'est rien trouver qui puisse me faire comprendre un peu mieux le fonctionnement de ce ShowMainForm et de ce GetStartupInfo() en tout cas je te remercie sincèrement d'avoir pris la peine d'essayer de m'aider encore un grand merci

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    consulte la documentation :
    ShowMainForm
    GetStartupInfo

    Tu semble être l'auteur de l'application lancée "fichier.exe", cela facilite grandement les choses !

    Le code fourni lance le programme puis capture sa fenêtre !
    As-tu essayé avec NotePad ou Explorer, le comportement est-il meilleur ?
    si oui, c'est qu'il faut modifier le programme "fichier.exe", tu ne pourras pas faire mieux depuis l'extérieur !

    Après je ne comprends pas ton histoire de bouton !

    tu dois faire le CreateProcess\FindWindow\SetParent dans la même fonction pour que la capture soit la plus rapide que possible et que l'on est presque pas le temps de voir l'application d'origine !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Hello,
    ci -dessous un exemple avec l'exécution d'un fenêtre fille de Notepad

    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
     
     
    .....
    startupInfo.wShowWindow = SW_HIDE;
    startupInfo.dwX=0;
    startupInfo.dwY=0;
    startupInfo.dwXSize=Form1->Width;  // on fixe la largeur de la fenêtre fille
    startupInfo.dwYSize=Form1->Height;  // on fixe la Hauteur de la fenêtre fille
    startupInfo.dwFlags =STARTF_USESHOWWINDOW|STARTF_USESIZE|STARTF_USEPOSITION;
    ProcessCreated=CreateProcess( NULL,
    				"C:\\Windows\\System32\\Notepad.exe",
    				NULL,
    				NULL,
    				FALSE,
    				NORMAL_PRIORITY_CLASS,
    				NULL,
    				NULL,
    				&startupInfo,
    				&procInfo);
     if(ProcessCreated) Sleep(100);
     HWND HWindow = FindWindow(NULL, "Sans titre- Bloc-notes"); // Caption de la fenêtre
     HWND HNewParent =  Form1->Handle;
      if (HWindow != NULL && HNewParent != NULL)
       {
    	::SetParent(HWindow, HNewParent);
    	ShowWindow(HWindow,SW_SHOW); // on affiche la fenêtre fille
       }
     
     
    ....
    // ne pas oublier de tuer le process créé auparavant,   par exemple dans le destructeur de la Form
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
      // procInfo est un membre privé de la classe TForm 
      TerminateProcess(procInfo.hProcess,0); // on termine le process
      WaitForSingleObject( procInfo.hProcess, INFINITE ); // on attend sa fermeture
      CloseHandle( procInfo.hProcess ); // libération des Handles créés
      CloseHandle( procInfo.hThread );
     
    }
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

Discussions similaires

  1. Réponses: 22
    Dernier message: 20/05/2008, 10h25
  2. Réponses: 8
    Dernier message: 16/11/2006, 10h15
  3. ouvrir un .exe avec un .swf
    Par philkeeper dans le forum Flash
    Réponses: 24
    Dernier message: 17/10/2006, 10h14
  4. Problème de bord avec image en tant que lien
    Par gids01 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 16/05/2006, 20h03
  5. [LG] Inversion avec une boucle tant que
    Par erickson dans le forum Langage
    Réponses: 2
    Dernier message: 09/12/2005, 15h15

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