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 :

TShellExecuteInfoA et RunAs (FAQ Delphi)


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut TShellExecuteInfoA et RunAs (FAQ Delphi)
    Bonjour,

    Je fais référence à cette FAQ Delphi concernant l'UAC.
    http://pascalfonteneau.developpez.co...phi/vista/uac/


    Je travaille sous RAD Studio XE2 Pro 2011 avec Update 4 et dernier Hotfix.

    Station : W7 Home Premium 64bits

    J'appelle à l'aide pour résoudre un problème :

    Voici le code d'origine:

    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
    function RunAsAdmin(const Handle: Hwnd; aFile : string; Params: string): Boolean;
    //===============================================================================
    var
      sei: TShellExecuteInfoA;
    begin
     
      FillChar(sei, SizeOf(sei), 0);
     
      With sei do begin
         cbSize := SizeOf(sei);
         Wnd := Handle;
         fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
         lpVerb := 'runAs';
         lpFile := PChar(aFile);
         lpParameters := PChar(Params);
         nShow := SW_SHOWNORMAL;
      end;
     
      Result := ShellExecuteEx(@sei);
     
    end;
     
    procedure TFormZHPDiag.bbTestClick(Sender: TObject);
    // ***************************************************
    begin
     
      if RunAsAdmin(self.Handle,'C:\Windows\System32\calc.exe','')
      then showMessage('OK')
      else RaiseLastOSError;
    end;

    Le compilateur refuse et nécessite le remplacement des paramètres Pchar() par des PAnsiChar()

    Voici donc le nouveau 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
    function RunAsAdmin(const Handle: Hwnd; aFile : string; Params: string): Boolean;
    //===============================================================================
    var
      sei: TShellExecuteInfoA;
    begin
     
      FillChar(sei, SizeOf(sei), 0);
     
      With sei do begin
         cbSize := SizeOf(sei);
         Wnd := Handle;
         fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
         lpVerb := 'runAs';
         lpFile := PAnsiChar(aFile);
         lpParameters := PAnsiChar(Params);
         nShow := SW_SHOWNORMAL;
      end;
     
      Result := ShellExecuteEx(@sei);
     
    end;
    Là c'est bon pour le compilateur, il affiche seulement une alerte "Transtypage string en PAnsiChar suspect sur les lpFile et lpParameters

    Mais le clic sur le bouton "bbTest" déclenche le message d'erreur du deboggeur code 1155 ou bien code 2 (Fichier absent) :

    ---------------------------
    Notification des exceptions du débogueur
    ---------------------------
    Le projet ZHPDiag.exe a déclenché la classe d'exception EOSError avec le message 'Erreur système. Code : 1155.
    Aucune application n’est associée au fichier spécifié pour cette opération'.
    ---------------------------
    Il semble bien que lpFile ne soit pas reconnu ?

    J'ai essayé de mettre "Const aFile" au lieu de "aFile : string", mais cela génère une erreur du debuggeur "violation d'accès à l'adresse..."

    Voilà si vous avez une idée pour résoudre ce problème,

    Toute vos idées seront les bienvenues

    Merci d'avance.

    A bientôt...

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Je n'ai pas Delphi sous la main mais comme tu es en version >=2009 tu dois utiliser les versions "Wide" des APIs windows. cela vaut aussi pour les structures.

    Essaye, à partir du code original, de remplacer
    Par
    La QR que tu cites a du être écrite avant Delphi 2009 et utiliser les versions ansi (Nommées A) et non pas unicode (Nommées W).
    En fait il vaut mieux mettre quand c'est reconnu, car Delphi va associer directement le bon type en fontion de la version de Delphi.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Hello,

    Merci, cela fonctionne maintenant parfaitement avec TShellExecuteInfo.

    - Plus d'alerte de transtypage suspect,
    - Pas nécessaire de remplacer les PChar par PAnsiChar.

    C'est impéccable !

    C'est résolu.

    Bon dimanche

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    +1 avec Nono

    Sinon ton erreur vient fait que tu fais appel à ShellExecuteEx au lieu de ShellExecuteExA.

    [edit] arrf, trop tard !!

    @+

  5. #5
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Bonjour,

    Je relance ce post pour une question subsidiaire.

    J'utilise exactement la même routine avec pour but de forcer le controle UAC à s'afficher.
    En plus du code Pascal Fonteneau, je fais un WaitSingleObject, mais mon problème est au moment du ShellExecuteEx d'où je récupère un message

    Aucune application n’est associée au fichier spécifié pour cette opération.

    Le fichier en question est un msi, qui passe très bien quand je ne place pas lpverb à 'runas'.

    Avez-vous une idée pour résoudre ce problème ?

    Merci
    “La perfection est atteinte, non pas lorsqu'il n'y a plus rien à ajouter, mais lorsqu'il n'y a plus rien à retirer.” Antoine de Saint-Exupéry.

    D1..D7-2005,2006-Xe2 Ent-XE7 archi-MsSql 2005..2008 & R2, FB 1.5..2.5.x.x -Win10,Win7/64-Xp-
    _____________________________________________________

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

Discussions similaires

  1. Venez participer à la FAQ Delphi !
    Par Giovanny Temgoua dans le forum Contribuez
    Réponses: 45
    Dernier message: 06/02/2021, 12h23
  2. FAQ DELPHI : image dans un DBGrid
    Par yanba dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/02/2006, 01h17
  3. La FAQ Delphi : Le Cap des 700 QRs a été dépassé !!!
    Par Giovanny Temgoua dans le forum Delphi
    Réponses: 1
    Dernier message: 01/02/2006, 13h24

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