+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Nouveau Membre du Club 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : avril 2006
    Messages : 133
    Points : 38
    Points
    38

    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 :
    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 :
    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
    Administrateur forum

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

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

    Informations forums :
    Inscription : mai 2002
    Messages : 8 422
    Points : 17 881
    Points
    17 881

    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
    Nouveau Membre du Club 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : avril 2006
    Messages : 133
    Points : 38
    Points
    38

    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 Confirmé Sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2006
    Messages : 4 878
    Points : 9 650
    Points
    9 650

    Par défaut

    +1 avec Nono

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

    [edit] arrf, trop tard !!

    @+
    A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.

  5. #5
    Membre actif Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    février 2009
    Messages
    285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59

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

    Informations forums :
    Inscription : février 2009
    Messages : 285
    Points : 151
    Points
    151

    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

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •