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 :

Problème avec ShellExecute


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut Problème avec ShellExecute
    Salut à tous,

    Voilà mon problème:

    Avec mon application principale je lance un Exe .Net.
    Pour le moment tout va bien.

    Par contre j'ai une autre fonction qui me lance Excel pour y faire diverse chose et une fois que j'ai fermé le classeur, si je veux relancer mon exe .Net celui ci plante ou se comporte bizarement (notamement il ne detecte plus un fichier qui se trouve à un endroit fixe)

    code qui lance mon exe .net :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handle_fenetre := ShellExecute(0,'open',PChar(extractfilepath(application.ExeName)+'administration\Modele.exe'),'',nil,SW_SHOWNORMAL);
    cela marche tant que je n'ai pas à faire avec Excel

    Code qui lance Excel :

    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
    function open_excel_dialogue_panel(var v : olevariant; var nom_fichier : string ; panel : TPanel ; var h : THandle) : boolean;
    const
      TimeOut = 10000; // 10 secondes
    var  I: integer;
    //     h: THandle;
         t: DWORD;
         Nom_doc, texte : string;
    begin
      result := false;
      if (VarType(v) = VarEmpty) then
      begin
        Screen.Cursor := CrHourGlass;
        v := CreateOleObject('Excel.Application');
        Screen.Cursor := CrDefault;
      end
      else
      begin
        try
          if (VarType(v) = VarDispatch)
          then v.Visible := true;
          Except
            on EOleSysError do
            begin
              Screen.Cursor := CrHourGlass;
              v := unassigned;
              v := CreateOleObject('Excel.Application');
              Screen.Cursor := CrDefault;
            end;
          end;
        end;
      OpenDialogue.Filter := 'Fichiers Excel (*.xls)|*.xls|Tous les fichiers (*.*)|*.*';
      OpenDialogue.FilterIndex := 1; { Commence à montrer tous les fichiers }
      // Permet de ne pas aller dans le répertoire documents par défaut.
      opendialogue.FileName := '';
      opendialogue.InitialDir := chemin_enregistrement;
      if opendialogue.Execute then
      begin
        screen.Cursor := crHourGlass;
        nom_fichier:=opendialogue.FileName;
        v.workbooks.open(nom_fichier,,false);
        result := true;
        // chargement dans le panel
        h:= 0;
        t:= GetTickCount;
        nom_doc := ExtractFileExt(extractfilename(nom_fichier));
        if ExtractFileExt(extractfilename(nom_fichier)) = '.xls'
        then nom_doc := 'Microsoft Excel - '+extractfilename(nom_fichier);
        while (h = 0) and (GetTickCount - t < TimeOut) do
        begin
          h:= FindWindow(nil, PChar(nom_doc));
          Application.ProcessMessages;
        end;
        if h <> 0 then
        begin
    //      Windows.SetParent(h, panel.Handle);
        end;
        screen.Cursor := crDefault;
        v.visible := true;
      end;
    end;
    Et enfin quand je quitte Excel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure close_application_excel(v : olevariant);
    begin
      try
        if (VarType(v) <> VarEmpty) then
        begin
          v.quit;
          v := unassigned;
        end;
      Except on EOleSysError do
        v := unassigned;
      end;
    end;
    Et la pour finir : Mon code .net

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    begin
      if FileExists('Import.txt') then
       Application.Run(ProprieteTE_Class.Create)
    else
      begin
       Application.Run(CreationP_Class.Create);
      end;
    end.
    voilà

    merci

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Peut-être faut-il que tu fasses une temporisation avant d'accéder à ton fichier, le temps qu'Excel ait fini ses opérations de fermeture de fichier.

    Peux-tu par exemple tester l'accès au fichier toutes les secondes, et lancer ton programme uniquement quand le fichier est accessible ?

  3. #3
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Salut,

    en fait le fichier que je tente d'ouvrir avec mon appli .Net n'est pas le même que celui d'Excel.

    Le seul rapport dans tout ça c'est que quand j'ouvre Excel, et bien ça bousille L'ouverture de mon Exe en .net

    Est ce un problème de Handle ? ou dans le genre ?
    j'ai tenté plusieurs combinaison de commande forçant à activer le handle du prog principale mais ça ne donne rien

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Que donne la même opération mais en exécutant le soft .NET via une console et pas via ton appli ?

  5. #5
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    heuu via une console ?

    En tout cas ce que je peux dire c'est qu'il marche très bien si je le lance moi même ou si je le lance par l'appli si je me suis pas encore servi de mon module qui utilise Excel

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Essaie en renseignant dans l'appel de ShellExecute le paramètre
    Directory : Répertoire par défaut utilisé dans le cas où FileName désigne une application. Correspond en général au chemin de l'élément exécuté, ou nil si le chemin est absolu ou si le chemin de démarrage n'a pas d'importance.

  7. #7
    Membre régulier Avatar de SkYsO
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 217
    Points : 122
    Points
    122
    Par défaut
    Ralalalla, merci


    En fait merci encore (j'en ai des problèmes ces derniers temps )

    Pourquoi dans ce cas il marche sans soucis ?
    car en fait certaine fois il se lançait mais pas avec les bon paramètres. Donc il trouvait l'exe.

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SkYsO
    Pourquoi dans ce cas il marche sans soucis ?
    Cela rejoins ton dernier problème .
    Je suppose que la gestion des assemblies référence le répertoire d'installation de l'exécutable .NET et que le Runtime construit les chemins d'accés à partir du répertoire courant et non pas celui de l'exécutable.
    Mais pour en être certain il faudrait consulter le SDK .NET 1.1.
    En creusant un peu on pourrait retrouver ce type de problèmatique déjà sous MS-DOS...

    Citation Envoyé par SkYsO
    j'en ai des problèmes ces derniers temps
    D'avoir des problèmes en soi c'est pas gênant, ce serait de ne pas avoir de solution qui serait ennuyant.

    [edit]
    Pour avoir une réponse plus pertinente sur ce pb d'accés le mieux est de poster dans le forum général .NET en taguant le post [.NET]

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

Discussions similaires

  1. Problème avec Shellexecute sous Vista
    Par scara dans le forum Langage
    Réponses: 2
    Dernier message: 19/11/2007, 19h09
  2. Problème avec ShellExecute
    Par lou_delphdev dans le forum Web & réseau
    Réponses: 3
    Dernier message: 28/08/2007, 14h59
  3. Problème avec Shellexecute
    Par cincap dans le forum Composants VCL
    Réponses: 10
    Dernier message: 20/08/2007, 00h08
  4. [VBA]Problème avec ShellExecute()
    Par Sunchaser dans le forum SDK
    Réponses: 1
    Dernier message: 24/06/2007, 20h27
  5. Problème avec ShellExecute
    Par Xav++ dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/05/2006, 14h58

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