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

Langage Delphi Discussion :

ma commande ExecAndWait (de source forge) ne fonctionne plus avec Windows XP mais bien avec NT4


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut ma commande ExecAndWait (de source forge) ne fonctionne plus avec Windows XP mais bien avec NT4
    Bonjour,

    Un programme de recherche de composition de courriers tourne parfaitement avec NP4(sp2), mais plus(y a dû avoir une mise à jour) du tous avec XP(sp3),

    Depuis quelque jours je reçois un message "Acces violation at address 007516A3 in module Query~1.exe read of adress 00000000.
    Quand je lance une commande ExecAndWait vers un logiciel de reporting : Query Reporter de allroundautomations,
    sans trop pouvoir vous donner de precision, cette commande interroge une base de donnée à travers un scripts pré-enregistré et parametré comme suit :
    le chemin de Query Reporter est dans path_query
    le nom du script : courrier_prod.rep
    sa variable : modele_chercher
    le résultat se retrouve dans spool_prod.txt
    La commande ressemble un peu à ceci est fonctionne parfaitement sous NT, fonctionnait un moment aussi sous XP, avant que certain paramètre des machines ne changent
    path_exe := path_query + ' &modele=' + modele_chercher + ' exec=' + 'courrier_prod.rep TSV=spool_prod.txt HIDE' ;
    ExecAndWait(path_exe, SW_SHOW); // ou SW_HIDE
    Existe-il une autre façon de lancer un logiciel et d'attendre son résultat sous Windows XP, autre que l'un des fameux ExecAndWait que j'avais trouve dans source Forge,
    Ou comment contourner ce problème ?

    Merci de vos conseils ou info
    Cordialement,
    Henri

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    tu lances Delphi tu compiles le produit et tu cherche l'erreur à l'adresse $007516A3, c'est probablement un endroit ou tu fais références à un pointeur ou une classe qui est à nil
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Bonjour

    voici ma fonction ExecAndWait ci-dessouson la retrouve chez http://www.swissdelphicenter.ch/ ou sourceforge

    apparemment ç'a bloque quand mon Query Reporter est lancé avec cette ligne <<while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do >>
    J'ai regarder avec View CPU, mais ç'a me dit pas grand chose, ou j'ai pas compris !
    J'ai essayé de lancer ce Query Reporter en ligne de commande avec un autre petit bout d'exe que j'ai fais pour l'occasion, qui ne comporte que la fonction ci-dessous, et là aucun problème ç'a fonctionne impeccable
    J'ai un doute sur une suite d'unités de SYNAPSE http://synapse.ararat.cz/doku.php qui me permet de faire du ftp et du telnet sécurisé (SFTP et SSH)
    Ces unité fonctionne bien et c'est les seules que j'ai trouvé gratuit(mes patrons sont devenus radins au possible)
    mais mon programme ne s'arrete plus correctement depuis que je les utilise

    //************ la fonction miracle ****************************************************************

    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
    function Tform1.ExecAndWait(const FileName: string; const CmdShow: Integer): Longword;
    var { by Pat Ritchey }
    zAppName: array[0..512] of Char;
    zCurDir: array[0..255] of Char; // OK
    //zCurDir: array[0..512] of Char;
    WorkDir: string;
    StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    AppIsRunning: DWORD;
    begin
    StrPCopy(zAppName, FileName);
    GetDir(0, WorkDir);
    StrPCopy(zCurDir, WorkDir);
    FillChar(StartupInfo, SizeOf(StartupInfo), #0);
    StartupInfo.cb := SizeOf(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := CmdShow;
    if not CreateProcess(nil,
    zAppName, // pointer to command line string
    nil, // pointer to process security attributes
    nil, // pointer to thread security attributes
    False, // handle inheritance flag
    CREATE_NEW_CONSOLE or // creation flags
    NORMAL_PRIORITY_CLASS,
    nil, //pointer to new environment block
    nil, // pointer to current directory name
    StartupInfo, // pointer to STARTUPINFO
    ProcessInfo) // pointer to PROCESS_INF
    then Result := WAIT_FAILED
    else 
    begin 
    while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do 
    begin
    Application.ProcessMessages;
    Sleep(50);
    end; 
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    end;
    end; { WinExecAndWait32 }
    Merci Paul

    Henri

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    un programme qui ne s'arrête pas, c'est souvent lié à un Thread mal géré et l'application attend qu'il se termine...sans qu'il le fasse

    sinon mis à part un usage barbare de array of char alors que les string sont compatibles PChar depuis Delphi 2, rien ne me saute aux yeux dans ce code.

    par contre, je n'aime pas bcp appeler Application.ProcessMessages, je préfère de loin l'une de ces deux solutions :
    1) vérifier dans Application.OnIdle l'état du process...
    2) lancer le traitement dans un Thread qui peu alors être bloqué sur le Wait.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    a force de gratter j'ai fini par découvrir qu'entre le moments ou j'ai écris ce programme qui a bien fonctionné dans un premier temps et maintenant, les services informatique de la boite ont installé le Service Pack 3 pour Xp
    Avant cette mise à jour, ç'a fonctionnait,
    Après l'installation de ce SP3 j'ai ce blocage,
    Que savez-vous de la compatibilité/incompatibilité entre le SP3 et execandwait ou SP3 et Delphi ?Bonjour

    Merci de votre intérêt pour ce post
    Cordialement,

    Henri

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part, j'ai toujours utilisé celle que l'on a dans la et ca focntionne très bien, même sous Xp SP3

    http://delphi.developpez.com/faq/?pa...oleapplication
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Sitôt lu, sitôt testé,
    J'ai testé le bout de code trouvé dans la FAQ, même résultat, plantage !
    Si bien sur je mets ce bout de code dans une petite applic avec juste un bouton pour le lancer, ça fonctionne bien, tous comme execandwait d'ailleurs,
    Je ne pige pas trop

    Merci pour votre aide,
    Henri

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Henri-gp Voir le message
    Bonjour,

    Sitôt lu, sitôt testé,
    J'ai testé le bout de code trouvé dans la FAQ, même résultat, plantage !
    Si bien sur je mets ce bout de code dans une petite applic avec juste un bouton pour le lancer, ça fonctionne bien, tous comme execandwait d'ailleurs,
    Je ne pige pas trop

    Merci pour votre aide,
    Henri
    Si le bout de code fonctionne dans une autre application, c'est que ton problème ne vient pas de cette fonction.

    En faisant un pas à pas, tu n'arrives pas mieux à cibler d'où vient la violation d'accès ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    C'était déjà dans un post plus haut, mon troisième message, le message du 11/03/2010 à 12h25,

    apparemment ç'a bloque quand mon Query Reporter est lancé avec cette ligne <<while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do >>

    Henri

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Henri-gp
    le chemin de Query Reporter est dans path_query
    le nom du script : courrier_prod.rep
    sa variable : modele_chercher
    le résultat se retrouve dans spool_prod.txt
    Qui créer "courrier_prod.rep" et à quel moment?
    Le fichier est peut-être incomplet lors du lancement du query...
    (buffer text non vide)

    Qu'est-ce qui arrive si "spool_prod.txt" est en read only
    lorsque tu lance le query?
    (le fichier est ouvert par quelqu'un d'autre...mal fermé la fois d'avant par exemple)

    simple réflexion.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    La requete SQl courrier_prod.rep est écrite depuis longue date,
    c'est une requête paramétré qui prends un seul argument en ligne de commande, va lire un blob et l'écrire dans un fichier
    Comme je le dit précédemment, j'interprète ces requête avec un Query reporter de chez allroundautomations sur une base Oracle 9
    Query reporter de chez allroundautomations est une de mes vielle connaissance, de la même famille que PL/SQL developper mais plus léger, gratuit, bien foutu et justement pilotable en ligne de commande
    Comme je le dis aussi précédemment :
    j'efface le fichier spool_prod.txt,
    j'ai fais un petit soft dans le même repertoire avec juste un bouton auquel j'ai lié ma fonction EXECANTWAIT et une ligne de saisi oû j'écris la commande(un peu modifié pour le chemin du soft)ci-dessous :
    <<path_query + ' &modele=' + modele_chercher + ' exec=' + 'courrier_prod.rep TSV=spool_prod.txt >>
    c'est Query reporter qui ecrit le fichier spool_prod.txt avec : TSV=spool_prod.txt
    et là, tous se passe bien !
    autre chose :
    j'utilise aussi EXECANTWAIT pour piloter Gostscripts, et là tous est OK aussi,
    Bonne journée à tous
    Henri

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Un bout de code serait mieux. Qui montre comment tu appels et utilises l'ensemble.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    je me demande du coup si la définition de
    WaitForSingleObject() n'est pas overwrite
    quelque part dans le programme
    en faute...

    Une définition qui utiliserait un index au lieu du nom...
    entre NT4.0 et XP sp3 y a peut être un changement d'index
    de WaitForSingleObject() dans Kernel32.dll.

    Du coup, on appèle plus la bonne API et vlan!
    Acces violation at address 007516A3 in module blabla.exe read of adress 00000000

    Ce qui n'est pas évident d'obtenir avec le bon
    WaitForSingleObject() même avec des paramètres
    volontairement complètement farfelu!


    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
    Index windows xp SP3
    624 OpenEventW
    ...
    895 WaitForMultipleObjectsEx
    896 WaitForSingleObject
    897 WaitForSingleObjectEx
    
    Index Win2k sans service pack
    771 WaitForMultipleObjectsEx
    772 WaitForSingleObject
    773 WaitForSingleObjectEx
    
    Index NT4.0 (Serveur)
    623 WaitForMultipleObjectsEx
    624 WaitForSingleObject
    625 WaitForSingleObjectEx
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Bonsoir,

    Voici la procédure rattaché au bouton qui déclenche mon fameux ExecAndWait(path_exe, SW_SHOW); // habituellement en SW_Hide
    Certaine des variable sont dans un fichier *.ini

    path_query= C:\Program Files\Query Reporter\QueryReporter.exe
    je n’ai pas la requête sous le coude car je n’ai pas non plus oracle sur ma machine perso

    Merci à tous
    Henri

    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
     
     
    //******************** pour envoyer une requete avec le nom du courrier à Query reporter
    procedure TForm1.Query_qualifClick(Sender: TObject);
    var
    nb_ligne,  n : integer;
    //s :string ;
    begin
     
    DeleteFile('spool_qualif.txt'); // on vire le dernier modele
    if  modele_chercher <> '' then  //on verifie si on a un modele trouvé, sinon rien
      begin
      if client_qualif.Text = '' then
        begin
          //****** On sort le dernier flot en date,  avec le nom de courrier *******
          Compar_mod.Hint := ' ' ;
          path_exe := path_query + ' &modele=' + modele_chercher + ' exec=' + 'courrier_bis.rep TSV=spool_qualif.txt HIDE' ; //CSV=sas.txt HIDE'
        end
      else
        begin  //ref.client  Qulaif_client_et_refenrence.rep
         if trim(client_qualif.Text) = '%' then
            begin
            //****** On sort le flot en date,  avec le nom de courrier et la REF Client Ou le joker % pour tous les flots *******
            Compar_mod.Clear;        // pour pouvoir visualiser les Status et les noms de client dans le combo Compar_mod
            Compar_mod.Hint := '%' ; // pour conserver le resultat dans le combo
            end;
         path_exe := path_query + ' &modele=' + modele_chercher +  ' &ref.client=' + client_qualif.Text +' exec=' + 'Qualif_client_et_refenrence.rep TSV=spool_qualif.txt HIDE' ; //CSV=c:\sas.txt HIDE'
        end;
        //********************************************************************************
        statusbar1.Panels[1].Text := path_exe ;
        ExecAndWait(path_exe, SW_SHOW);
        spool_qualif.Clear;
        spool_qualif.Lines.LoadFromFile('spool_qualif.txt') ;
    //**************** on elimine les lignes vide ******************************
      n := 0 ; //OK
      for n := spool_qualif.Lines.Count - 1 downto 0 do  // OK
        if (spool_qualif.Lines.Strings[n] = '') or (copy(spool_qualif.Lines.Strings[n],1,1) = #9 ) then
           begin
            Compar_mod.Items.Insert(0,modele_chercher + ' ' + StringReplace(spool_qualif.Lines.Strings[n],#9,' ', [rfReplaceAll, rfIgnoreCase]));
            spool_qualif.Lines.Delete(n);
           end;
    //**************************************************************************
    //if spool_qualif.Lines.Strings[0] = 'DONNEES'  then Break;  // on essaye de sortir ! ! !
        if spool_qualif.Lines.Count > 2  then
           begin
            spool_qualif.Lines.Delete(0);
            nb_ligne := spool_qualif.Lines.Count;
              while trim(spool_qualif.Lines.Strings[nb_ligne -1]) <> 'F999' do
              begin
                //showmessage(inttostr(nb_ligne) + ' :  ' + spool_qualif.Lines[nb_ligne]);
                spool_qualif.Lines.Delete(nb_ligne);
                dec(nb_ligne);
              end;
            end;
      onglet.ActivePage := 'SPOOL';
      qualif.ActivePage := 'SPOOL' ;
      prod.ActivePage := 'SPOOL';
      end
    else
        begin
         Showmessage('Vous n'+ chr(39) + 'avez pas de modele à chercher !');
        end;
    end;

  15. #15
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Henri-gp Voir le message
    Bonsoir,

    Voici la procédure rattaché au bouton qui déclenche mon fameux ExecAndWait(path_exe, SW_SHOW); // habituellement en SW_Hide
    Certaine des variable sont dans un fichier *.ini

    path_query= C:\Program Files\Query Reporter\QueryReporter.exe
    je n’ai pas la requête sous le coude car je n’ai pas non plus oracle sur ma machine perso

    Merci à tous
    Henri
    c'est quel composant Compar_mod ? une ListBox ? Une TStringList ?

    Sinon pour ma part, je sépare toujours le chemin de l'exécutable et les paramètres quand je fais appel au CreateProcess
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    C'est un combo box qui me sert à noter certaine différence entre mes trois environnement Développement/Qualification/Production,
    Je mets juste à jour sa propriété int qui me sers dans d'autre action,
    Le int et le tag suivent chaque composant, donc facile à utilisé pour trimballer des valeurs tout au long de la session, pas besoin comme ça de créer des variable,

    la ligne parfaite de ma commande serai ceci :
    C:\Program Files\QueryReporter\QueryReporter.exe &modele=atdattest EXEC=d:\bd\export5\courrier_prod.rep TSV=d:\bd\export5\spool_prod.txt HIDE
    si je l'écris ainsi et que je la lance avec Démarrer/ exécuter de cette façon :
    "C:\Program Files\QueryReporter\QueryReporter.exe" &modele=atdattest EXEC=d:\bd\export5\courrier_prod.rep TSV=d:\bd\export5\spool_prod.txt HIDE
    Tous se passe bien,
    J'ai bein sur fais la modifs dans mon programme ainsi :
    path_exe := #34 + path_query + #34 + ' &modele=' + modele_chercher + ' exec=' + getcurrentdir + '\courrier_bis.rep TSV=' + getcurrentdir + '\spool_qualif.txt HIDE' ; //CSV=sas.txt HIDE'

    malgré les "" que entoure le nom de l'exe je me retrouve toujours ave le même problème, toujours la même erreur !
    et pourtant ç'a fonctionne bien avec Démarrer/ exécuter,
    Dois-je entourer autre chose avec des doubles cotes ?

    Merci de votre aide et de vos conseils
    Henri

  17. #17
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essaie avec cette procedure

    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
     
    function ExecuteAndWait (sExeName : String;Param : String) : Boolean;
    Var  StartInfo   : TStartupInfo;
         ProcessInfo : TProcessInformation;
         Fin         : Boolean;
     
    begin
      { Mise à zéro de la structure StartInfo }
      FillChar(StartInfo,SizeOf(StartInfo),#0);
      { Seule la taille est renseignée, toutes les autres options }
      { laissées à zéro prendront les valeurs par défaut }
      StartInfo.cb     := SizeOf(StartInfo);
     
      { Lancement de la ligne de commande }
      If CreateProcess(PChar(sExeName),PChar(Param) ,nil , Nil, False,
                    0, PChar(ExtracFilePath(sExeName)), Nil, StartInfo,ProcessInfo) Then
      Begin
        { L'application est bien lancée, on va en attendre la fin }
        { ProcessInfo.hProcess contient le handle du process principal de l'application }
        Fin:=False;
        Repeat
          { On attend la fin de l'application }
          Case WaitForSingleObject(ProcessInfo.hProcess, 200)Of
            WAIT_OBJECT_0 :Fin:=True; { L'application est terminée, on sort }
            WAIT_TIMEOUT  :;          { elle n'est pas terminée, on continue d'attendre }
          End;
          { Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée. }
          Application.ProcessMessages;
        Until Fin;
        { C'est fini }
      End
      Else RaiseLastOSError;
     
    end;
    Puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     sPathExe := '"C:\Program Files\QueryReporter\QueryReporter.exe"';
     sParam := '&modele=atdattest EXEC=d:\bd\export5\courrier_prod.rep TSV=d:\bd\export5\spool_prod.txt HIDE';
     
    ExecuteAndWait(sPathExe,sParam);
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Désolé si j'insiste, mais j'ai peine à imaginer obtenir un
    "Acces violation" en utilisant WaitForSingleObject()

    J'aimerais bien qu'on essaie ce code dans la vilaine
    application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      p1,p2:pointer;
    Begin
      p1:=@WaitForSingleObject;
      p2:=@Windows.WaitForSingleObject;
      if p1<>p2 then application.MessageBox('WaitForSingleObject est redéfinit quelque part!','ouch!',mb_ok);
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 237
    Points : 150
    Points
    150
    Par défaut
    Bonjour Rayek,

    Voici la syntaxe qui fonctionne sans me créer d'erreur à la compilation,
    If CreateProcess(NIL, PChar(sExeName + param) , NiL, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo) Then

    Mais pour mon plus grand déplaisir, j'ai toujours la même erreur à l'exécution
    Même si je remplis tous à la main style :

    If CreateProcess(NIL, '"C:\Program Files\QueryReporter\QueryReporter.exe" &modele=atdattest EXEC=d:\bd\export5\courrier_prod.rep TSV=d:\bd\export5\spool_prod.txt HIDE', NiL, Nil, False, 0, Nil, Nil, StartInfo,ProcessInfo) Then

    c'est la même syntaxe que quand je le mets dans Démarrer/exécuter qui fonctionne très bien et que j'ai déjà essayé,

    Bonjour Eric,

    J'ai testé vos ligne de code pour comparer deux pointeurs, et je ne lève pas d'erreur,

    Merci à tous
    Henri

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/09/2012, 19h42
  2. [AJAX] mon code ne fonctionne pas avec IE mais bien avec FF
    Par beegees dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/01/2009, 14h59
  3. Réponses: 7
    Dernier message: 19/02/2008, 15h30
  4. Réponses: 4
    Dernier message: 14/02/2008, 20h13
  5. Mon script fonctionne avec un bouton, mais pas avec l'image!
    Par julien.63 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/04/2006, 16h26

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