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

API, COM et SDKs Delphi Discussion :

[D2010] Est-il possible d'utiliser un chemin réseau avec CreateProcess


Sujet :

API, COM et SDKs Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 685
    Points : 7 152
    Points
    7 152
    Par défaut [D2010] Est-il possible d'utiliser un chemin réseau avec CreateProcess
    Sous D2010, est-il possible d'utiliser un chemin réseau avec CreateProcess ?
    Sous D6 ça fonctionne bien, mais pas sous D2010.

    Voici mon code :
    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
     
    type
      TTableauWideChar = Array of WideChar;
    ...
      procedure Remplir(const Fichier: String; var Tableau: TTableauWideChar);
      var
        i: Integer;
      begin
        for I := 1 to Length(Fichier) do
          Tableau[i - 1] := Fichier[i];
      end;
    var
        StartupInfo: TStartupInfo;
        ProcessInfo: TProcessInformation;
        Tmp: String;
        Variable : TTableauWideChar;
    begin
       ZeroMemory(@StartupInfo, Sizeof(StartupInfo));
       StartupInfo.cb := Sizeof(StartupInfo);
       StartupInfo.dwFlags := STARTF_USESHOWWINDOW;         StartupInfo.wShowWindow := SW_SHOWNORMAL;     
       Tmp := FormMain.REPERTOIRE_FICHIERS + FormMain.num_fiche + '\Couts_' + FormMain.num_fiche + '.xls';
       SetLength(Variable, Length(Tmp));
       Remplir(Tmp, Variable);
       if not CreateProcess(@Variable,nil, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
       begin
          ShowMessage(SysErrorMessage(GetLastError));
          Exit;
       end;
    (Bien sur, le chemin passé en variable est bon; j'ai vérifié).


  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 375
    Points : 41 929
    Points
    41 929
    Billets dans le blog
    65
    Par défaut
    Il doit y avoir un problème Unicode
    String D6 = AnsiString pour D2010
    une suggestion : - avec D2010 utilise plutôt CreateProcessW

    et ,je ne suis pas sur de moi sur ce point, mais ne ne faut-il pas doubler les '\' ?

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 685
    Points : 7 152
    Points
    7 152
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Il doit y avoir un problème Unicode
    String D6 = AnsiString pour D2010
    une suggestion : - avec D2010 utilise plutôt CreateProcessW
    En D2010, CreateProcess est défini comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function CreateProcess; external kernel32 name 'CreateProcessW';
    Ca veut pas dire que c'est la même chose ?

    Citation Envoyé par SergioMaster Voir le message
    je ne suis pas sur de moi sur ce point, mais ne ne faut-il pas doubler les '\' ?
    Même résultat pour le CreateProcess.
    Par contre, le FileExists lui, n'aime pas.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 803
    Points : 25 821
    Points
    25 821
    Par défaut
    passé @ d'un tableau dynamique, ça doit faire un peu bcp, ça fait pointeur de pointeur !
    Utilise [0] pour passer le premier Char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       if not CreateProcess(@Variable[0], ...
    C'est un peu compliqué tout ça ?
    Normalement, Tmp c'est un String donc implicite UnicodeString
    PChar c'est PWideChar ?
    Il doit pouvoir accepter le cast comme avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Tmp := FormMain.REPERTOIRE_FICHIERS + FormMain.num_fiche + '\Couts_' + FormMain.num_fiche + '.xls';
       if not CreateProcess(PChar(Tmp),...

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 856
    Points : 13 660
    Points
    13 660
    Par défaut
    Je passerais aussi par PChar(Tmp).

    Sinon, sur le remplissage de Variable, il manque le #0 final et si ça marchait sous D6, c'était juste un gros coup de bol !
    Mais comme dit Shai, @Variable est l'adresse du pointer et non du premier caractère du tableau. Ça ne devrait de toute façon pas fonctionner

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 685
    Points : 7 152
    Points
    7 152
    Par défaut
    En fait, au début j'avais essayé en premier la méthode simple avec un PChar.
    Mais comme j'avais obtenu une violation d'accès, j'ai essayé mille et une solutions, en espérant tomber sur la bonne.

    J'ai remis un PChar, et cette fois j'obtiens :
    %1 n'est pas une application Win32 valide


    Par contre, ça marche enfin avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tmp := 'C:\Program Files\Microsoft Office\Office14\excel.exe "' + REPERTOIRE_FICHIERS + num_fiche + '\Couts_' + num_fiche + '.xls"';
    Mais ça ne me convient pas.
    Je ne veux pas avoir à spécifier l'exe correspondant au fichier, comme on peut le faire avec ShellExecute.

    Précision : si j'utilise CreateProcess, c'est pour obtenir le PID du processus et le surveiller après.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 803
    Points : 25 821
    Points
    25 821
    Par défaut
    Ne confond pas ShellExecute qui fait un peu comme le Double-Clic sur un fichier, il ouvre le programme associé à l'extension !
    Mais, tu peux aussi trouver sur PID en trichant un peu [D7] Ouvrir Excel dans une form

    Avec CreateProcess, tu dois bien lancer un programme ! Il n'y pas d'association automatique !
    ce code pourrait t'interesser pour créer ta surveillance

    Sinon Excel, on peut l'utiliser par Automation, c'est bien plus efficace, tu pourras, le cacher, le manipuler (ajouter des menus, imprimer...)

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 856
    Points : 13 660
    Points
    13 660
    Par défaut
    Citation Envoyé par Lung Voir le message
    Précision : si j'utilise CreateProcess, c'est pour obtenir le PID du processus et le surveiller après.
    Tu peux le faire avec ShellExecuteEx :

    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
    function RunAndWait(aVerb, aApp, aParams :string; aShow :integer): boolean;
    var
      Info: TShellExecuteInfo;
     
    begin
      ZeroMemory(@Info, SizeOf(Info)) ;
      Info.cbSize       := SizeOf(TShellExecuteInfo);
      Info.fMask        := SEE_MASK_NOCLOSEPROCESS;
      Info.lpFile       := PChar(aApp);
      Info.lpParameters := PChar(aParams);
      Info.lpVerb       := PChar(aVerb);
      Info.nShow        := aShow;
     
      Result := ShellExecuteEx(@Info);
     
      if Result then
        WaitForSingleObject(Info.hProcess, INFINITE);
    end;

  9. #9
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 685
    Détails du profil
    Informations personnelles :
    Âge : 44
    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 685
    Points : 7 152
    Points
    7 152
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Sinon Excel, on peut l'utiliser par Automation, c'est bien plus efficace, tu pourras, le cacher, le manipuler (ajouter des menus, imprimer...)
    Je sais bien. Je l'utilise beaucoup.


    Citation Envoyé par Andnotor Voir le message
    Tu peux le faire avec ShellExecuteEx
    Génial !
    Je ne connaissais pas cette API. Elle a l'air de faire plein de choses intéressantes.

    Pour mon problème, c'est tout bon.
    Avec le paramètre SEE_MASK_NOCLOSEPROCESS, mon application reprend la main quand la fenêtre excel que j'ai lancée (et pas une autre) se ferme.


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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/12/2010, 00h26
  2. Réponses: 0
    Dernier message: 23/08/2007, 16h42
  3. Est-il possible d'utiliser la fonction TOP avec un argument variable ?
    Par 16-Marco dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 06/03/2007, 23h21
  4. Est-il possible d'utiliser des fichiers xsl en cascade ?
    Par Faekk dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/08/2005, 13h34
  5. Réponses: 1
    Dernier message: 28/04/2004, 20h18

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