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 :

Problème Shell Execute


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2012
    Messages : 136
    Par défaut Problème Shell Execute
    Bonjour,

    Mon application est développer en Delphi 4, je fais un shell execute qui doit me retourner un integer. L' application appeler est InfoNomen en Delphi 2006.

    L'application appeler fonctionne très bien, le problème est soit au niveau des paramètres que je passe...

    Merci

    Voici comment j'appelle mon shell

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const REPERTOIRE = 'C:\Develop\ServiceNomen\ServNomen.exe';
    sParametre := FerNR + ' ' + IDXfo;
     
    iFerNR := shellexecute(0, PChar('OPEN'), PChar(REPERTOIRE), PChar(sParametre), PChar(''), SW_HIDE );

    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
    program ServNomen;
     
    {$APPTYPE CONSOLE}
     
    uses
      Forms,
      SysUtils,
      InfoNomen in 'InfoNomen.pas',
      bomwoservice in 'bomwoservice.pas',
      querywoservice in 'querywoservice.pas',
      StrUtils;
     
    var
      nResult : integer;
      sValeur : String;
     
     
    begin
     
        Application.Initialize;
     
        sValeur := LeftStr(ParamStr(0), 5);
        if (sValeur = 'FerNR') then
          nResult := _ElementNR()
     
        else if (sValeur = 'FerMX') then
          nResult := _ElementMAX();
     
      // Valeur de retour
      ExitCode := nResult;
     
     
    end.
    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
    unit InfoNomen;
     
    interface
     
    uses
         querywoservice, bomwoservice, StrUtils, SysUtils;
     
    const
        STATUS_FALSE : integer = 1;
        STATUS_ERROR_UNKNOWNFUNCTION : integer = 2;
        STATUS_ERROR_INVALIDARGUMENT : integer = 3;
        STATUS_ERROR_UNKNOWN : integer = 4;
     
        function ElementNR(dXfo : String): Integer;
        function ElementMAX(dXfo : String): Integer;
     
        function _ElementNR(): Integer;
        function _ElementMAX() : Integer;
     
     
    implementation
     
    function _ElementNR(): Integer;
    var
        sIdXfo : String;
        nResult : Integer;
    begin
     
        sIdXfo := ParamStr(2);
        nResult := ElementNR(sIdXfo);
    end;
     
    function _ElementMAX(): Integer;
    var
        sIdXfo : String;
        nResult : Integer;
    begin
     
        sIdXfo := ParamStr(2);
        nResult := ElementMAX(sIdXfo);
    end;
     
     
    function ElementMAX(dXfo : String): Integer;
    var
        Service1 : iquerywoservice;
        Service2 : ibomwoservice;
        V_P_FER_MAX : String;
        V_P_FER : ArrayOfBomWoDto;
        Num: WoDto;
     
    begin
        Service1 := querywoservice.GetIQueryWoService(TRUE);
        Num := Service1.GetWoCore('DG', StrToInt(Copy(dXfo, 1, (Pos('-', dXfo)-1))));
        Service2 := bomwoservice.GetIbomwoservice(TRUE);
        V_P_FER := Service2.GetListByVariableWoNo('DG', Num.WoNo, 'V_P_FER');
     
        if (Length(V_P_FER)=2)then begin
          if (Pos('N/R',V_P_FER[0].Component)>0)then begin
              V_P_FER_MAX := RightStr(V_P_FER[1].Component, 4);
          end else
          if  (Pos('N/R',V_P_FER[1].Component)>0)then begin
              V_P_FER_MAX := RightStr(V_P_FER[0].Component, 4);
          end;
        end;
        result := StrToInt(V_P_FER_MAX);
     
    end;
     
    function ElementNR(dXfo : String): Integer;
    var
        V_P_FER_NR : String;
        V_P_FER : ArrayOfBomWoDto;
        Service1 : iquerywoservice;
        Service2 : ibomwoservice;
        Num: WoDto;
     
    begin
        Service1 := querywoservice.GetIQueryWoService(TRUE);
        Num := Service1.GetWoCore('DG', StrToInt(Copy(dXfo, 1, (Pos('-', dXfo)-1))));
        Service2 := bomwoservice.GetIbomwoservice(TRUE);
        V_P_FER := Service2.GetListByVariableWoNo('DG', Num.WoNo, 'V_P_FER');
     
        if (Length(V_P_FER)=2)then begin
          if (Pos('N/R',V_P_FER[0].Component)>0)then begin
              V_P_FER_NR := RightStr(V_P_FER[0].Component, 4);
          end else
          if  (Pos('N/R',V_P_FER[1].Component)>0)then begin
              V_P_FER_NR := RightStr(V_P_FER[1].Component, 4);
          end;
        end;
        result := StrToInt(V_P_FER_NR);
    end;
     
    end.

  2. #2
    Membre éclairé

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Par défaut
    Bonjour

    Personnellement j'utilise ExecuteFile, au lieu de ShellExecute, fonction se trouvant dans Delphi\...\Doc\FmxUtils.pas, qui ne pose aucun problème.
    Faites aussi une recherche dans les discussions de Developpez.

  3. #3
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 512
    Par défaut
    Bonjour,
    je n'ai pas Delphi4, mais je suppose que tu as déjà essayé de remplacer Pchar('') [ ou Pchar(' ')] par nil ?

    A+
    Charly

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    ShellExecute renvoie un pseudo-handle indiquant une erreur à la création du processus si inférieur ou égale à 32 et non le code de sortie de l'application. Ce qui serait de toute façon impossible puisque ShellExecute n'est pas synchrone et retourne immédiatement

    Il faut passer par ShellExecuteEx en spécifiant SEE_MASK_NOCLOSEPROCESS pour que le handle de la nouvelle instance reste valide après l'exécution de la fonction. De là, il faut attendre que le processus se termine par WaitForSingleObject sur ce handle. Ensuite seulement, tu peux appeler GetExitCodeProcess pour tester le code de sortie.

    Ne pas oublier de lancer un CloseHandle sur hProcess...

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2012
    Messages : 136
    Par défaut Problème Shell execute
    Bonjour,

    Mon problème était dans la façon d'appeler mon service qui me retourne une valeur.

    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
    function TFormXfoHisto.InfoNomen(sParametre : String) : Integer;
    var
       SEInfo: TShellExecuteInfo;
       ExitCode: DWORD;
       ExecuteFile, ParamString, StartInString: String;
     
       const REPERTOIRE = 'C:\Develop\ServiceNomen\ServNomen.exe';
    begin
         ExecuteFile := REPERTOIRE;
         FillChar(SEInfo, SizeOf(SEInfo), 0);
         SEInfo.cbSize := SizeOf(TShellExecuteInfo);
         with SEInfo do
         begin
              fMask := SEE_MASK_NOCLOSEPROCESS;
              Wnd := Application.Handle;
              lpFile := PChar(ExecuteFile);
              lpParameters := PChar(sParametre);
              nShow := SW_HIDE;
         end;
     
         if ShellExecuteEx(@SEInfo) then begin
            repeat
                  GetExitCodeProcess(SEInfo.hProcess, ExitCode);
            until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
         end;
         Result := ExitCode;
    end;

  6. #6
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2012
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2012
    Messages : 136
    Par défaut Shell execute problème
    Merci de votre aide

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Un Sleep dans cette boucle ne serait pas du luxe

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/06/2012, 21h40
  2. Réponses: 10
    Dernier message: 11/07/2007, 08h45
  3. [Tomcat][plugin]Problème d'execution de Tomcat 5
    Par Carlito_superheros dans le forum Eclipse Java
    Réponses: 14
    Dernier message: 11/03/2005, 13h56
  4. problème d'execution de JSP avec eclipse - TOMCAT
    Par Staron dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/12/2004, 21h48
  5. problème lancement executable avec winexec()
    Par semenzato dans le forum MFC
    Réponses: 5
    Dernier message: 19/01/2004, 11h48

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