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 :

ShellExecute et Print sur un document Office 2010


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Par défaut ShellExecute et Print sur un document Office 2010
    Bonjour,

    J'ai une commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ShellExecute(Handle, 'Print', PChar(sFilename), nil, nil, SW_HIDE);

    Cette commande fonctionnait bien depuis des années et le principe était que je détruit le fichier (qui est en fait temporaire) juste après. Mais sur des postes où sont installés Office 2010 ou office 2013, l'utilisateur a un message d'erreur indiquant que le fichier n'existe pas. Le fichier est donc effacé trop vite.
    La question est: pourquoi ça marchait avec les autres versions d'Office? Comment prévenir ça?

    PS: J'ai essayé avec des Sleep, ça ne fonctionne pas.

    Merci.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par Ben_Le_Cool Voir le message
    Cette commande fonctionnait bien depuis des années et le principe était que je détruit le fichier (qui est en fait temporaire) juste après. Mais sur des postes où sont installés Office 2010 ou office 2013, l'utilisateur a un message d'erreur indiquant que le fichier n'existe pas. Le fichier est donc effacé trop vite.
    La question est: pourquoi ça marchait avec les autres versions d'Office? Comment prévenir ça?

    PS: J'ai essayé avec des Sleep, ça ne fonctionne pas.
    La présence du fichier est-elle vérifiée avant l'appel à ShellExecute ?
    L'erreur affichée est-elle celle fournie par ShellExecute ?
    Comment se fait la suppression sachant que ShellExecute rend la main dès le traitement lancé (et donc pas forcément terminé) ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    La présence du fichier est-elle vérifiée avant l'appel à ShellExecute ?
    L'erreur affichée est-elle celle fournie par ShellExecute ?
    Comment se fait la suppression sachant que ShellExecute rend la main dès le traitement lancé (et donc pas forcément terminé) ?
    Oui, il y a une vérification juste avant l'appel à ShellExecute.
    L'erreur est affichée en dehors de mon application.
    La suppression se fait juste après l'appel à ShellExecute. Mais comme je l'ai mentionné plus haut, cette portion de code fonctionnait depuis des années. Il a fallu qu'on installe Office 2010 ou Office 2013 pour que l'erreur apparaisse. Sur le même poste, si désinstalle Office 2010 et on installe Office 2003, l'erreur n'apparait pas et l'impression est faite le plus normalement du monde.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par Ben_Le_Cool Voir le message
    Oui, il y a une vérification juste avant l'appel à ShellExecute.
    L'erreur est affichée en dehors de mon application.
    La suppression se fait juste après l'appel à ShellExecute. Mais comme je l'ai mentionné plus haut, cette portion de code fonctionnait depuis des années. Il a fallu qu'on installe Office 2010 ou Office 2013 pour que l'erreur apparaisse. Sur le même poste, si désinstalle Office 2010 et on installe Office 2003, l'erreur n'apparait pas et l'impression est faite le plus normalement du monde.
    Avez vous essayé avec ShellExecuteEX qui ne permet de "reprendre" la main qu'une fois que l'application appelée a rendu la main ?
    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
    var
      SEInfo: TShellExecuteInfo;
      ExitCode: DWORD;
    //..
      //
      FillChar(SEInfo, SizeOf(SEInfo), 0);
      SEInfo.cbSize := SizeOf(TShellExecuteInfo);
      SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
      SEInfo.Wnd := Self.Handle;
      SEInfo.lpVerb := PChar('print');
      SEInfo.lpFile := PChar(sFilename);
      SEInfo.nShow := SW_HIDE;
     
      if ShellExecuteEx(@SEInfo) then
        repeat
          Sleep(250);
          GetExitCodeProcess(SEInfo.hProcess, ExitCode) ;
        until (ExitCode <> STILL_ACTIVE) or Application.Terminated
      else
          MessageDlg('Erreur d''impression de ' + sFilename, mtError, [mbOK], 0);
    Sinon, quelle version de Delphi ? quel nom de fichier (c.a.d. des caractères hors du commun) ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 245
    Par défaut
    Je testerai ce bout de code demain et je te tiendrai au courant.
    Pour le nom de fichier, pas de soucis de ce coté, comme je l'ai dit, ce bout de code fonctionne très bien avec les autres versions d'Office.
    J'utilise Delphi 2010.

Discussions similaires

  1. Testez vos connaissances sur Microsoft Office 2010
    Par Tofalu dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 08/03/2011, 11h22
  2. Office 2010 : vidéo sur les champs calculés Access 2010
    Par Maxence HUBICHE dans le forum Access
    Réponses: 18
    Dernier message: 11/01/2010, 03h27

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