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

 Delphi Discussion :

Avec une fonction pour exécution fichier .bat ne se rafraichit pas !


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut Avec une fonction pour exécution fichier .bat ne se rafraichit pas !
    Bonjour à toutes et à tous,

    Avec cette fonction la première exécution est correcte mais ensuite cela bug comme si la 1ère exécution était toujours en cours.

    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
     
    function ExeAndWait(ExeNameAndParams: string; ncmdShow: Integer = SW_SHOWNORMAL): Integer;
    var
        StartupInfo: TStartupInfo;
        ProcessInformation: TProcessInformation;
        Res: Bool;
        lpExitCode: DWORD;
    begin
        with StartupInfo do //you can play with this structure
        begin
            cb := SizeOf(TStartupInfo);
            lpReserved := nil;
            lpDesktop := nil;
            lpTitle := nil;
            dwFlags := STARTF_USESHOWWINDOW;
            wShowWindow := ncmdShow;
            cbReserved2 := 0;
            lpReserved2 := nil;
        end;
        Res := CreateProcess(nil, PChar(ExeNameAndParams), nil, nil, True,
            CREATE_DEFAULT_ERROR_MODE
            or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInformation);
        while True do
        begin
            GetExitCodeProcess(ProcessInformation.hProcess, lpExitCode);
            if lpExitCode <> STILL_ACTIVE then
                Break;
            Application.ProcessMessages;
        end;
        Result := Integer(lpExitCode);
    end;
    Exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.Rbmp3_amrClick(Sender: TObject);
    begin
     
      ExeAndWait('Mp3_Amr.bat', SW_HIDE);
     
       end;
     
    procedure TForm1.Rbmp3_m4rClick(Sender: TObject);
    begin
     
      ExeAndWait('Mp3_M4r.bat', SW_HIDE);
     
    end;
    Si quelqu'un à une idée merci d'avance.

    @+,

    cincap

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    @ tous, désolé j'ai trouvé le pourquoi c'était dans mon fichier .bat à la fin j'ai enlevé l'instruction pause que j'avais placée lors de mes essais.

    Par conséquent le 1er fichier n'étant pas fermé forcément que l'autre ne savait pas démarré.

    Bonne fin de journée.

    @+,

    cincap

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    Bonjour à toutes et à tous,

    Juste une dernière question pour une explication, j'ai remarqué que la commande pour l'exécution du fichier .bat on ne peut pas définir une variable de type "string" pour définir le dossier de ce fichier par contre si le fichier .bat se trouve dans le même dossier que l'application il n'y a aucun problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TFormTest.Rbmp3_amrClick(Sender: TObject);
    var
    chappli : string;
     
    begin
     chappli := ExtractFilePath(Application.ExeName);
     
      ExeAndWait(chappli + 'Mp3_Amr.bat', SW_HIDE);
     
       end;

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Je ne suis pas sûr d'avoir compris la question, mais c'est pas le paramètre précédent du lpStartupInfo, qui sert à définir le répertoire de travail ?
    (
    [in, optional] LPCSTR lpApplicationName,
    [in, out, optional] LPSTR lpCommandLine,
    [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes,
    [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
    [in] BOOL bInheritHandles,
    [in] DWORD dwCreationFlags,
    [in, optional] LPVOID lpEnvironment,
    [in, optional] LPCSTR lpCurrentDirectory,
    [in] LPSTARTUPINFOA lpStartupInfo,
    [out] LPPROCESS_INFORMATION lpProcessInformation
    );
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  5. #5
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 539
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par cincap Voir le message
    Bonjour à toutes et à tous,
    Juste une dernière question pour une explication, j'ai remarqué que la commande pour l'exécution du fichier .bat on ne peut pas définir une variable de type "string" pour définir le dossier de ce fichier par contre si le fichier .bat se trouve dans le même dossier que l'application il n'y a aucun problème :
    [/CODE]
    voici un code que j'utilise actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure ExecuteC1_Bat(strep, StCom1: string; bSHOW: boolean = false);
    var
      sl1: TStringList;
    begin
      sl1 := TStringList.Create;
      sl1.Delimiter := ';';
      .../...
      sl1.SaveToFile(strep + 'C1.BAT');
      if bSHOW then
        ShellExecute(0, 'open', PChar(strep + 'C1.BAT'), 0, 0, SW_SHOWNORMAL)
      else
        ShellExecute(0, 'open', PChar(strep + 'C1.BAT'), 0, 0, SW_HIDE);
    end;
    Le "string" est transtypé en "PChar"

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    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 086
    Par défaut
    Citation Envoyé par cincap Voir le message
    Bonjour à toutes et à tous,

    Juste une dernière question pour une explication, j'ai remarqué que la commande pour l'exécution du fichier .bat on ne peut pas définir une variable de type "string" pour définir le dossier de ce fichier par contre si le fichier .bat se trouve dans le même dossier que l'application il n'y a aucun problème :
    le paramètre ExeNameAndParams est maladroit et donc autant le changer !

    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
    function ExeAndWait(const AExeName, AParams: string; ncmdShow: Integer = SW_SHOWNORMAL): Integer;
    var
        StartupInfo: TStartupInfo;
        ProcessInformation: TProcessInformation;
        Res: Bool;
        lpExitCode: DWORD;
        ExeNameAndParams : string; 
    begin
        with StartupInfo do //you can play with this structure
        begin
            cb := SizeOf(TStartupInfo);
            lpReserved := nil;
            lpDesktop := nil;
            lpTitle := nil;
            dwFlags := STARTF_USESHOWWINDOW;
            wShowWindow := ncmdShow;
            cbReserved2 := 0;
            lpReserved2 := nil;
        end;
        if AParams <> '' then
          ExeNameAndParams := AExeName + ' ' AParams
        else
          ExeNameAndParams := AExeName;
     
        Res := CreateProcess(nil, PChar(ExeNameAndParams), nil, nil, True,
            CREATE_DEFAULT_ERROR_MODE
            or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFileDir(AExeName)), StartupInfo, ProcessInformation);
        while True do
        begin
            GetExitCodeProcess(ProcessInformation.hProcess, lpExitCode);
            if lpExitCode <> STILL_ACTIVE then
                Break;
            Application.ProcessMessages;
        end;
        Result := Integer(lpExitCode);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Rbmp3_amrClick(Sender: TObject);
    begin
      ExeAndWait('Mp3_Amr.bat', '', SW_HIDE);
    end;
    Cela fait longtemps que j'ai écrit une fonction équivalente avec Redirection des entrées/sorties du process (ping) où Dossier, Programme et paramètres sont séparés pour plus de maitrise

    Et la fonction ExeAndWait doit consommer beaucoup de CPU durant l'attente avec une boucle très agressive, un CallCmd avec un Delay de 250ms c'est largement suffisant avec WaitEvent qui effectue les Refresh nécessaires (le Application.ProcessMessages, une fois par seconde c'est suffiant)
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 582
    Par défaut
    Merci @ tous,

    Ce que je voulais dire c'est que si mon fichier .bat se trouve dans un autre dossier que l'application, la fonction ne sait pas le lire

    exemple :


    var
    chappli : string;

    begin
    chappli := ExtractFilePath(Application.ExeName) +'Dossier\';

    ExeAndWait(chappli + 'Mp3_Amr.bat', '', SW_HIDE);
    J'utilise cette fonction parce que j'obtiens facilement une indication quand la conversion est terminée que j'exploite soit avec une Led soit avec un son.

    @ ALWEBER, en effet j'utilise aussi l'exécution du fichier .bat quand c'est avec un Shellexecute mais ta suggestion est toujours utile.

    @ ShaiLeTroll, merci de ta suggestion, j'ai testé et j'obtiens une erreur "Identificateur non déclaré" " ExeNameAndParams".

    @ Lung si c'est cela alors le répertoire est défini par défaut et par conséquent le fichier .bat doit se trouver dans le même répertoire que l'application ?

    @+,

    cincap

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/10/2018, 11h01
  2. [Batch] Souci avec une commande dans un fichier bat
    Par coolanso dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 07/08/2014, 00h55
  3. Réponses: 14
    Dernier message: 01/05/2007, 19h25
  4. [BAT] commande AT pour exécuter fichier .bat
    Par PatLogan dans le forum Scripts/Batch
    Réponses: 10
    Dernier message: 04/01/2005, 16h51
  5. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29

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