[..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

[..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#1

Message par amphase »

Bonjour et merci de prendre du plaisir à m’éclairer pour le problème énoncé ci-dessous :
  • Deux (ou plus) scripts compilés doivent échanger des paramètres alternativement.
    Seul un script peut être actif à la fois.
    Le(s) script(s) compilés additionnels sont compilés dans le script principal pour n’en faire qu’un et ils devront impérativement s’installer dans %TEMP%.
Pour illustrer le cahier des charges tout en sortant le problème d’un environnement complexe, j’ai mis en scène les échanges (platoniques) de Roméo et Juliette.

Romeo.exe est le programme principal (il contiendra Juliette.exe) :
#include <MsgBoxConstants.au3>

If $CmdLineRaw = "Merci" Then Exit MsgBox($MB_TOPMOST, "Ici Roméo !", "Diantre, Juliette vient de me remercier de lui avoir envoyé mon adresse.")

Local $bErrFlag = FileInstall("Juliette.exe", @TempDir & "\Juliette.exe", 1)
If $bErrFlag = False Then MsgBox($MB_TOPMOST, "Juliette veut pas !", "FileInstall dans %TEMP% refusé.")

Local $sTxtParam = @ScriptFullPath
Local $sTransfertPath = @TempDir & "\Juliette.exe" & ' "' & $sTxtParam & '"' ; espace de séparation après le path
Local $iPID = Run($sTransfertPath, @TempDir)
If Not $iPID Then Exit MsgBox($MB_TOPMOST, "Juliette veut pas !", "Juliette.exe ne se lance pas.")
Et voici Juliette :
#include <MsgBoxConstants.au3>

If Not $CmdLineRaw Then Exit MsgBox($MB_TOPMOST, "Roméo plante !", "Il n'arrive pas à passer son adresse à Juliette.")

Local $sTxtParam = $CmdLineRaw

MsgBox($MB_TOPMOST, "Ici Juliette", "J'ai reçu les paramètres suivants :" & @CRLF & $sTxtParam & @CRLF & @CRLF & "C'est l'adresse de Roméo que je vais pouvoir remercier céant !")

Local $iPID = Run($sTxtParam & " Merci") ; espace de séparation après le path
If Not $iPID Then Exit MsgBox($MB_TOPMOST, "Roméo plante !", "Romeo.exe ne se lance pas dans %TEMP%.")
J’ai tout d’abord compilé Juliette.exe, puis Romeo.exe (logique puisque Romeo contient Juliette).
Romeo.exe s’exécute parfaitement bien et Juliette.exe lui répond tout aussi bien.
Donc, jusqu’ici, tout va bien. :D

Puis, j’ai imaginé que l’histoire du couple shakespearien fût réécrite par Walt Disney et que le « happy end » Hollywoodien impose un : « Ils vécurent heureux et eurent beaucoup d’enfants ». Chaque bébé.exe pèserait environ 1 Mo à la naissance. :idea: Puisque Romeo.exe contenait l’interpréteur AutoIt, j’allais compiler les scripts additionnels au format .a3x pour alléger la mule. Donc, dans Romeo.au3, j’ai remplacé tous les « .exe » par des « .a3x » et ajouté en-tête « #pragma compile(AutoItExecuteAllowed, True) » puis compilé Juliette.a3x et Romeo.exe.
À partir de là, les amants se sont brouillés : Romeo.exe n’arrive pas à lancer Juliette.a3x. :( Cependant, Juliette.a3x minaude, mais accepte d’être lancée manuellement depuis le dossier Temp.
À présent, j’aimerais bien que vous soulagiez la mule :!: sans vexer Juliette en narrant la suite de l’histoire…

Merci.
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#2

Message par amphase »

Bonjour,

J’ai pesté sur le manque de documentation de l'instruction « #pragma compoile(AutoItExecuteAllowed, Truie) » (que j'utiliserai comme une insulte à la première occasion :twisted: ) et le fait qu’une cinquantaine de badauds ait lu plus que le titre de mon appel de détresse, posté le mois dernier, sans qu’un seul ne m'ai indiqué l'ombre d'un soupçon de début de piste. :o

Tenace, j’ai cherché, comme un singleton, à scinder le problème qui bloquait mon script dont le squelette était presque terminé, puisque toutes ses fonctions ronronnaient... à une exception près. Du coup, j’ai réduit l’obstacle en éliminant 2 innocents fausses pistes :
  1. Le fait que l’interpréteur doive être en mémoire au moment du lancement de Juliette.a3x.
  2. Celui d’utiliser un répertoire que l’on ne peut pas adresser de façon relative d’un script à l’autre (@ScriptDir-@TempDir).
À ce moment-là, j’ai découvert la dure réalité : j’étais bloqué par 2 lignes de code (à raison d’une par script). Pour vous faire partager la vexation, voici 2 amants maudits contemporains (ils seront plus nombreux dès que cela fonctionnera) :

Bonnie :
; compilé en a3x dans le même directory que Clyde.au3
MsgBox(262144, "C'est moi, Bonnie !", "Est-ce bien toi qui me lances enfin, Clyde ?")
Clyde :
; inutile de compiler
Local $iPID = RunWait(@ScriptDir & "\Bonnie.a3x")
If Not $iPID Then MsgBox(262144, "Erreur " & @error, "Bonnie.a3x ne se lance pas.")
Bonnie.a3x ne se lance pas autrement que manuellement ! Pourquoi ?
La réponse serait-elle sous élémentaire et dans ce cas je vais être à l’étroit dans le trou que j’aurais creusé pour cacher ma honte. :oops: Surtout quand je serai rejoint par celles et ceux qui ont lu le présent sujet. :mrgreen:

Malheureusement, à suivre…
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#3

Message par amphase »

C'est loin d'être académique, mais celà fonctionne :
Local $iPID = Run(@ComSpec & ' /c ' & '"' & @ScriptDir & "\Bonnie.a3x" & '"', "", @SW_HIDE)
If Not $iPID Then MsgBox(262144, "Erreur " & @error, "Bonnie.a3x ne se lance pas dans l'invite de commandes.")
Il se fait tard, le timer espion de processus c'est pour demain, mais très subjectivement (forcément, sans timer :wink: ), j'ai l'impression que c'est bien long à se lancer.

Je me remercie pour cette petite avancée et me souhaite une bonne nuit bien méritée.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#4

Message par Tlem »

Bonjour amphase.
Je n'ai malheureusement pas beaucoup de temps pour vous donner une aide détaillée avec exemple qui va bien, mais si vous téléchargez la pack AutoItFr et que vous jettez un œil au code, vous y trouverez sûrement une piste (voir la réponse).

Pour info, le pack consiste en une archive 7Zip autoextractible qui lance un script au3 non compilé.
J'embarque l'interpréteur AutoIt.exe qui me sert à lancer le/les scripts. Si vous voulez le faire depuis un exécutable AutoIt compilé, vous devez avant tout l'avoir compilé en ayant pris soins de rajouter la directive AutoItExecuteAllowed, True au début du script qui sera compilé et qui servira d'interpréteur.

Après, rien ne vous empêche de faire comme dans le pack. Vous trouverez dans l'archive la totalité des sources afin de réaliser l'autoextractible avec 7Zip.

Après, l'avantage, c'est que c'est plus simple à maintenir. ;)

Édit : voici le lien vers la doc qui explique entre autre comment lancer un script au3 à l'aide de l'interpréteur AutoIt.exe ou d'un script compilé.
https://www.autoitscript.fr/autoit3/doc ... unning.htm


Envoyé de mon appareil mobile avec Tapatalk
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#5

Message par orax »

amphase a écrit :
Local $iPID = RunWait(@ScriptDir & "\Bonnie.a3x")
If Not $iPID Then MsgBox(262144, "Erreur " & @error, "Bonnie.a3x ne se lance pas.")
Bonnie.a3x ne se lance pas autrement que manuellement ! Pourquoi ?
Un fichier .a3x n'est pas exécutable comme un .exe par exemple, donc Run ou RunWait ne fonctionnera pas, il faut utiliser ShellExecute ou ShellExecuteWait.

Si AutoIt est installé sur le système alors le script suivant peut fonctionner :
Local $iPID = ShellExecute(@ScriptDir & "\Bonnie.a3x")
;~ Local $iPID = ShellExecute(@ScriptDir & "\Bonnie.au3") ; <= ça peut marcher aussi
If Not $iPID Then MsgBox(262144, "Erreur " & @error, "Bonnie.a3x ne se lance pas.")
Comme le montre la ligne en commentaire, on peut exécuter directement un fichier .au3, il n'y a pas besoin de le compiler en .a3x.

Par contre, si AutoIt N'est PAS déjà installé sur le système alors il faut embarquer l'interpréteur (voir le message #4 de Tlem).
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#6

Message par amphase »


amphase : doigts qui ripent et mémoire qui flanche ; la fin est proche.


Dans le désordre :

@orax
C’était stupide de ma part :oops: d’avoir pensé qu’un fichier .a3x est exécutable. À force de ne compiler que des .exe, la partie la plus bête de mon inconscient à amalgamé compilé et exécutable. Voyant que Run ne fonctionnait pas, par acquit de conscience, j’ai tout essayé pour démarrer Bonnie, même la manivelle et les saucisses :shock: . Quand j’ai expérimenté ShellExecute, tellement convaincu que cela ne fonctionnerait pas, j’ai du faire une erreur de frappe ou de copier-coller (un acte manqué selon Sigmund) qui a généré une erreur de syntaxe me confortant dans ma réalité. L’on vit toujours sa réalité (poil au nez).
Si mon inconscient ne s’en mêle pas, il se pourrait éventuellement que ceci fonctionne aussi : :wink:
Local $oShell = ObjCreate("shell.application")
$oShell.ShellExecute (@ScriptDir & "\Bonnie.a3x")
$oShell = 0
Merci de m’avoir remis en phase, orax. :)

@Tlem
J’ai beaucoup apprécié la réponse tant par son contenu que par l’intention.
J’avais envisagé d’embarquer l’interpréteur et des fichiers .au3, mais avec une compilation AutoIt, non avec 7z seul, ce qui me fait dire que de toutes les pistes celle-ci semble la plus sensée.
Probablement, n’ai-je pas suffisamment mis en évidence le fait que je traquais l’économie de chaque µS. Les temps d’accès disque (surtout en écriture) vous rappellent très vite que vos fonctions sont dans des fichiers et pas en mémoire. Mais ce sont les opérations de décompactage qui sont les plus chronophages et gourmandes en mémoire. La durée du compactage et/ou compilation pour le gros des fichiers n’a pas grande importance, puisqu’elle ne se fait qu’une fois, lors de la création, alors que le décompactage a lieu à chaque utilisation. Je dois également envisager la possibilité d’embarquer un fichier lourd (700 Mo) déjà compilé ; il n’est pas question de toucher à son intégrité pour des raisons de licence. Il est absurde de le recompacter, puis le décompacter pour l’exécution, puisqu’il est déjà compacté lors de sa compilation d’origine. Si j’utilise Aut2exe.exe, à ma connaissance, le commutateur /comp me laisse un seul choix de taux de compression pour les FileInstall. Y aurait-il un moyen de définir 2 taux de compression différents, selon le fichier ? Je n’ai pas encore cherché par là, ni testé l’excellente idée 7Zip auto extractible. J’ai eu un peu trop le nez dans le guidon pour ce projet ; je dois prendre du recul sinon d’autres ShellExecute vont me passer sous le nez en ricanant. Je vais écrire un timer de processus qui permettra de comparer les performances (et pour un autre usage de détecter les processus furtifs) et répondre à la taquine provocation de mikell en postant un peu code https://www.autoitscript.fr/forum/viewt ... =6&t=14239.

Encore merci. :)

Je garde le sujet ouvert pour y poster…
… la suite.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#7

Message par orax »

> Je vais écrire un timer de processus qui permettra de comparer les performances
La page Tutorial Optimizing - AutoIt Wiki pourra peut-être t'aider dans cette tâche.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#8

Message par amphase »

@orax
Merci pour le lien.
Avec ça, je vais pouvoir traquer la pS (1e-12) ! :D
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#9

Message par amphase »

Une semaine est passée depuis mon dernier post ; il est temps de faire le point.
Indiscutablement, la proposition 7z de Tlem est la mieux adaptée aux besoins du projet parce que c'est la plus flexible. :)

En ce qui concerne le timer, celui proposé par orax est des plus intéressants pour être utilisé comme include dans un script. Par exemple, dans ce script, 'profiler.au3' aurait mis en évidence que le goulot d'étranglement se situait en ligne 33 ; il aurait été possible de voir quelles étaient les lignes les plus pénalisantes à l'intérieur même de la fonction _ArrayAdd. Malheureusement, dans ce projet-ci, les différents programmes communiquent entre-eux alternativement et unilatéralement. Il n'est donc pas possible d'évaluer le temps des interactions de l'intérieur ; un programme externe et autonome devra prendre en charge les mesures.

Voici donc le détecteur de processus qui alimentera le timer. Ce détecteur de processus a évidemment bon nombre d'autres applications possibles. Je l'ai utilisé pour débusquer un processus aussi furtif que suspect et qui avait l'air de se déclencher aléatoirement. En fait, il s'agissait tout bonnement de mon antivirus qui avait changé son moteur interne (sans crier gare, comme Saint-Lazare) et provoquait depuis l'étrange phénomène qui m'avait rendu paranoïaque. :cry: Il peut vous servir également à surprendre votre femme en lui faisant apparaître un message du type suivant : " Encore en train de jouer à Mario, espèce de fainéante, alors que je n'ai plus qu'une seule chemise propre dans le placard et qu'elle n'est même pas encore repassée. Là, t'as pris un mauvais pli ; comme si ça ne te suffisait pas d'être ridée de la fesse comme ta mère ". :lol: Mais ça, je vous déconseille. Ou alors, si vous voulez vraiment faire l'expérience, essayez d'abord sur la belle-mère. J'indique qu'il ne s'agissait là que d'un exemple comme un autre et décline toute responsabilité en cas de répercussions consécutives à une mauvaise utilisation dudit script. Personnellement, je suis très doux et aimant avec les femmes 8) (de bonne volonté, ce qui exclut la plupart des belles-doches que je connais).

Pour parler code, car je suis là aussi un peu pour ça, c'eut été plus élégant de récupérer l'évènement et d'utiliser WMI pour le PID ainsi que pour le nom et le PID du parent, mais au stade de mes connaissances sur WMI, les 10 premières minutes de recherche ont été suffisamment explicites pour que je sache que si je poursuivais dans cette voie, j'allais tâtonner pendant un long moment ; j'ai opté pour la facilité en utilisant WinAPIProc.au3. Ce petit script a eu quelques petites difficultés prénatales : j'ai pourchassé le bogue jusque sous le siège :!: avant de me remémorer que je m'étais déjà promis et encore promis de ne plus me faire avoir par l'insuffisance de privilèges :x ; eh oui, s'il est possible de lister les processus en mode normal, guetter le déclenchement d'un processus nécessite le mode administrateur. Ensuite je me suis fâché avec mon fidèle porte-fanion $bErrFlag (en lignes 33 et 48), qui m'a suggéré la question suivante : "dans l'aide Référence UDF, ne vaudrait-il pas mieux écrire que la valeur de retour d'_ArrayColDelete, en cas de succès, est le nombre de colonnes restantes + 1 ? La colonne 0 pourrait revendiquer son droit à l'existence (la dimension sous celle du point serait de la couleur du néant)". Si j'ai laissé la parole à ma variable, c'est que je joue la prudence ; en effet, dans une expérience récente je suis redescendu de la cinquième dimension, sans parachute, pour m'écraser dans un coin du forum AutoIt, 8) vous voyez le tableau…
Aussi, posterai-je ce code avant minuit et ferai preuve de rigueur orthographique dès à présent en signalant que je sais bien que l'on ne dit pas des processus, mais des processi ; les pluriels des mots latins dont le suffixe est us ont leurs pluriels en i ; il en va de même pour les mots italiens finissant par o, comme spaghetto (pour les pauvres) ou lavabi (pour les riches). En souhaitant qu'il n'y ait pas de bogue(s) dans le texte ou pire, que le script ne tourne pas chez vous…
Merci de m'avoir lu jusqu'au bout. :)

Je garde le sujet ouvert pour y poster…
… la suite.
; https://msdn.microsoft.com/en-us/library/windows/desktop/aa394374&#40;v=vs.85&#41;.aspx

#include <Array.au3>
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIProc.au3>

#RequireAdmin ; ===== SciTE DOIT ÊTRE EN MODE ADMINISTRATEUR, SINON LE SCRIPT NE TOURNE PAS ! =====

Opt("MustDeclareVars", 1)

If _Singleton(@ScriptName) = 0 Then Exit MsgBox($MB_TOPMOST, "ATTENTION !", "Une occurrence de ce programme est déjà en cours !")

; 'HotKeySet' serait mise en attente car la boucle '$oEvents.NextEvent' est considérée comme une fonction bloquante (elle attend un évènement) - reste 'Ctrl + Break' et 'tray icon' pour abandonner.

; EXEMPLE :
Global $sProcessToWatch = "explorer.exe"; le NOM DU PROCESSUS (insensible à la casse) à surveiller doit être renseigné ici, tel qu'il apparait dans le gestionnaire des tâches

 _GetToTrue() ; fonction voyeuse (parité oblige)

Func _GetToTrue()
   Local $aProcessFirstList
   Local $iPID = ProcessExists($sProcessToWatch) ; processus existe déjà dans les tâches en cours ?
   Local $bErrFlag = False

If $iPID Then
      $aProcessFirstList = ProcessList($sProcessToWatch) ; si 1 ou plusieurs processus du même nom coexistent, liste les
      $aProcessFirstList[0][1] = $aProcessFirstList[0][0] ; copie le nbre d'éléments de col 0 à col 1
      $bErrFlag = _ArrayColDelete($aProcessFirstList, 0, 1) ; supprime la col 0 - ne garde que les PID
      If $bErrFlag <> 0 Then Exit MsgBox($MB_TOPMOST, "Erreur !", $bErrFlag) ; il doit rester 1 col
   EndIf
   _ArrayDelete($aProcessFirstList, 0) ; supprime le premier élément (du nbre d'éléments)
;~    _ArrayDisplay($aProcessFirstList, "FirstList") ; curiosité locale 1/3

   Local $sComputer = "." ; local pour WMI
   Local $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\root\CIMV2") ; espace
   If Not IsObj($oWMIService) Then Exit MsgBox($MB_TOPMOST, "Erreur !", "L'objet WMI n'a pas été trouvé.")
   Local $oEvents = $oWMIService.ExecNotificationQuery('SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = ' & '"' & $sProcessToWatch & '"') ; cf. lien ligne 1

   While $oEvents.NextEvent ; attend de détecter l'évènement StartProcess pour $sProcessToWatch
   WEnd ; boucle basse consommation (en lignes comme en ressources UC) - dans le genre d'AdLib

   Sleep(300) ; sieste - sinon peut louper le coche, prendre la mouche et retourner une liste vide

   Local $aProcessLastList = ProcessList($sProcessToWatch) ; refait une liste pour comparer à l'autre
   $aProcessLastList[0][1] = $aProcessLastList[0][0] ; copie le nbre d'éléments de col 0 à col 1
   $bErrFlag = _ArrayColDelete($aProcessLastList, 0, 1) ; supprime la col 0 - ne garde que les PID
   If $bErrFlag <> 0 Then Exit MsgBox($MB_TOPMOST, "Erreur !", $bErrFlag) ; il doit rester 1 col

   If $aProcessLastList[0] = 1 Then _DisplayAll($aProcessLastList[1]) ; processus unique - direction la sortie

   _ArrayDelete($aProcessLastList, 0) ; supprime le premier élément (celui du nbre d'éléments)
;~    _ArrayDisplay($aProcessLastList, "LastList") ; curiosité locale 2/3

   Local $oDico = ObjCreate("Scripting.Dictionary") ; rapide dès 2 items, farpètement !
   If Not IsObj($oDico) Then Exit MsgBox($MB_TOPMOST, "Erreur !", "L'objet Dictionnaire '" & $oDico & "' n'a pas pu être créé !")
   For $i = 0 To UBound($aProcessLastList) - 1
      $oDico.Add($aProcessLastList[$i], $aProcessLastList[$i])
   Next
   For $i In $aProcessFirstList
      If $oDico.Exists($i) Then $oDico.Remove($i) ; retire les PID des processus préexistants
   Next
   Local $aPIDend = $oDico.Keys
;~    _ArrayDisplay($aPIDend, "Différence Last-First") ; curiosité locale 3/3
   _DisplayAll($aPIDend[0]) ; accompagne le PID qui reste vers la sortie
EndFunc   ;==>_GetToTrue


Func _DisplayAll($iPID) ; montre tout (ou presque) du PID trouvé par _GetToTrue()
   Local $sMsgOut = "Processus[PID] :" & @TAB & $sProcessToWatch & "[" & $iPID & "]"
   Local $iPapaPID = _WinAPI_GetParentProcess($iPID) ; envoyé par son papa ?
   If $iPapaPID Then
      Local $sPapaName = _WinAPI_GetProcessName($iPapaPID) ; et comment qu'il s'appelle le papa ?
      $sMsgOut &= @CRLF & @CRLF & "Parent[PID] :" & @TAB & $sPapaName & "[" & $iPapaPID & "]"
   EndIf
   $sMsgOut &= @CRLF & @CRLF & "Continuer la surveillance du même processus ?"
   Local $IDbutton = MsgBox(BitOR($MB_TOPMOST, $MB_OKCANCEL), "Démarrage d'un processus !", $sMsgOut)
   If $IDbutton = $IDOK Then _GetToTrue() ; c'est reparti avec remise à zéro !
   Exit
EndFunc   ;==>_DisplayAll
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#10

Message par amphase »

Voici une suite que j'aurais préféré différente. :( Dans le cadre du projet qui est à l'origine de ce sujet et que je dévoilerai dès que j'aurais fait un choix définitif parmi les options les plus importantes, je suis bloqué par un problème qui semble a priori dérisoire, mais sur lequel je sèche depuis un moment. J'ai sorti le sujet de préoccupation de son contexte, avant qu'il n'y moisisse, et l'ai adapté pour être plus explicite.
  • Créer un dossier "Temp" dans %TEMP%.
  • Créer un dossier nommé "Dossier_dans_TEMPTemp" à l'intérieur.
  • Écrire un fichier quelconque à l'intérieur de ce dossier.
  • Lire le contenu du fichier et l'afficher.
  • Renommer le dossier "Dossier_dans_TEMPTemp" en "Dossier_Renommé".
  • Supprimer le dossier "Temp", ce qui signifie supprimer l'ensemble.
Je dois préciser que dans le contexte, je ne peux pas me servir des fonctions intégrées à AutoIt "DirMove" et "DirRemove", d'où l'utilisation en lignes de commande.
Si le script est écrit de façon purement procédurale, comme ci-dessous, il s'exécute parfaitement bien.
#include <MsgBoxConstants.au3>

;~ #RequireAdmin

Opt("MustDeclareVars")

Global $sTEMPTempPath = @TempDir & "\Temp"
Global $sDirName = "Dossier_dans_TEMPTemp"
Global $sDirPath = $sTEMPTempPath & "\" & $sDirName

Local $bErrFlag = ShellExecute(@TempDir) ; c'est là que ça va se passer
If $bErrFlag = 0 Then MsgBox($MB_TOPMOST, "Erreur !", "Impossible d'ouvrir le dossier %TEMP%" & @CRLF & "n° " & @error)

$bErrFlag = DirCreate($sTEMPTempPath)
If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur lors de la création du dossier 'Temp' dans %TEMP%" & @CRLF & "n° " & @error)

$bErrFlag = DirCreate($sDirPath) ; création de 'Dossier_dans_TEMPTemp'
If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur lors de la création du dossier 'Dossier_dans_TEMPTemp'" & @CRLF & "n° " & @error)

Local $hWnd = FileOpen($sDirPath & "\Fichier_FéeCoucou", 2)
$bErrFlag = FileWrite($hWnd, @LF & "Ici le Fichier_FéeCoucou !" & @LF & @LF & "Coucou !" & @LF) ; écrit un fichier dans le dossier 'Dossier_dans_TEMPTemp'
If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur d'écriture fichier !", @CRLF & "n° " & @error)
FileClose($hWnd)

$hWnd = FileOpen($sDirPath & "\Fichier_FéeCoucou", 0)
Local $sFileContent = FileRead($hWnd) ; lit le fichier
MsgBox($MB_TOPMOST, "Lecture fichier", $sFileContent)
If @error Then MsgBox($MB_TOPMOST, "Erreur de lecture fichier !", @CRLF & "n° " & @error)
FileClose($hWnd)

;~    $bErrFlag = FileDelete($sDirPath & "\Fichier_FéeCoucou")
;~    If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur d'effacement fichier !", @CRLF & "n° " & @error)

Local $sDirRenCmd = @ComSpec & " /c " & "rename " & $sDirPath & " Dossier_Renommé"
RunWait($sDirRenCmd, "", @SW_HIDE)
If @error Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur au renommage de 'Dossier_dans_TEMPTemp'" & @CRLF & "n° " & @error)

RunWait(@ComSpec & " /c " & "rd /s /q " & $sTEMPTempPath, "", @SW_HIDE)
If @error Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur à l'effacement de TEMPTemp " & @CRLF & "n° " & @error)
C'est quand j'ai essayé d'insérer des fonctions (sans changer quoi que ce soit d'autre au script) que c'est devenu problématique.
Si le fichier est lu par la fonction "_FileInDirRead()", la suite du script ne s'exécute plus correctement ; le renommage du dossier "Dossier_dans_TEMPTemp" n'a pas lieu, la suppression de "Dossier_dans_TEMPTemp" non plus ; seul le fichier à l'intérieur est effacé.
Si je commente -ligne 16- la fonction "_FileInDirRead()" pour la rendre inopérante, le script s'exécute normalement.
En allant voir -lignes 53 et 54- où se produisait le blocage, j'ai trouvé le message "accès refusé" dans la console DOS. En quoi le fait de lire le fichier influence-t-il le renommage du dossier ? Car, au risque de me répéter, sans cette lecture, tout se déroule bien. Par acquit de conscience et pour avoir été échaudé, j'ai même essayé en mode administrateur, même si j'ai trouvé cela dénué de sens.
Atteignant (presque) le bout de ma perspicacité, je confie cela à la vôtre. :)
D'avance merci.
#include <MsgBoxConstants.au3>

;~ #RequireAdmin

Opt("MustDeclareVars")

Global $sTEMPTempPath = @TempDir & "\Temp"
Global $sDirName = "Dossier_dans_TEMPTemp"
Global $sDirPath = $sTEMPTempPath & "\" & $sDirName

Local $bErrFlag = ShellExecute(@TempDir) ; c'est là que ça va se passer
If $bErrFlag = 0 Then MsgBox($MB_TOPMOST, "Erreur !", "Impossible d'ouvrir le dossier %TEMP%" & @CRLF & "n° " & @error)

_DirCreate()
_FileInDirWrite()
Local $sFileContent; = _FileInDirRead() ; c'est cette fonction de lecture qui produit le bogue !!
MsgBox($MB_TOPMOST, "Lecture fichier", $sFileContent)
;~ _FileInDirDelete() ; effacer le fichier n'a aucune influence sur le bogue
_DirRename() ; si _FileInDirRead() est utilisé, la console DOS affiche : Accès refusé. et le dossier n'est pas renommé
_AllDirErase() ; si _FileInDirRead() est utilisé, les dossiers restent intacts, seul le fichier est effacé


Func _DirCreate() ; crée un dossier 'Temp' dans %TEMP%
   $bErrFlag = DirCreate($sTEMPTempPath)
   If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur lors de la création du dossier 'Temp' dans %TEMP%" & @CRLF & "n° " & @error)

   $bErrFlag = DirCreate($sDirPath) ; création de 'Dossier_dans_TEMPTemp'
   If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur lors de la création du dossier 'Dossier_dans_TEMPTemp'" & @CRLF & "n° " & @error)
EndFunc   ;==>_DirCreate

Func _FileInDirWrite() ; écrit quelques mots dans un nouveau fichier 'Fichier_FéeCoucou'
   Local $hWnd = FileOpen($sDirPath & "\Fichier_FéeCoucou", 2)
   $bErrFlag = FileWrite($hWnd, @LF & "Ici le Fichier_FéeCoucou !" & @LF & @LF & "Coucou !" & @LF) ; écrit un fichier dans le dossier 'Dossier_dans_TEMPTemp'
   If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur d'écriture fichier !", @CRLF & "n° " & @error)
   FileClose($hWnd)
EndFunc   ;==>_FileInDirWrite

Func _FileInDirRead() ; lit le fichier 'Fichier_FéeCoucou'
   $hWnd = FileOpen($sDirPath & "\Fichier_FéeCoucou", 0)
   Return FileRead($hWnd) ; lit le fichier
   If @error Then MsgBox($MB_TOPMOST, "Erreur de lecture fichier !", @CRLF & "n° " & @error)
   FileClose($hWnd)
EndFunc   ;==>_FileInDirRead

Func _FileInDirDelete()
   $bErrFlag = FileDelete($sDirPath & "\Fichier_FéeCoucou")
   If $bErrFlag <> 1 Then MsgBox($MB_TOPMOST, "Erreur d'effacement fichier !", @CRLF & "n° " & @error)
EndFunc   ;==>_FileInDirDelete

Func _DirRename() ; renomme 'Dossier_dans_TEMPTemp' en 'Dossier_Renommé'
   Local $sDirRenCmd = @ComSpec & " /c " & "rename " & $sDirPath & " Dossier_Renommé"
   RunWait($sDirRenCmd, "", @SW_HIDE)
;~    Local $sDirRenCmd = @ComSpec & " /k " & "rename " & $sDirPath & " Dossier_Renommé"
;~    RunWait($sDirRenCmd, "", @SW_SHOW)
   If @error Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur au renommage de 'Dossier_dans_TEMPTemp'" & @CRLF & "n° " & @error)
EndFunc   ;==>_DirRename

Func _AllDirErase() ; efface tout en supprimant le dossier Temp dans %TEMP%
   RunWait(@ComSpec & " /c " & "rd /s /q " & $sTEMPTempPath, "", @SW_HIDE)
   If @error Then MsgBox($MB_TOPMOST, "Erreur !", "Erreur à l'effacement de TEMPTemp " & @CRLF & "n° " & @error)
EndFunc   ;==>_AllDirErase
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#11

Message par orax »

Je vois une erreur dans la fonction _FileInDirRead. Ce qui suit la ligne Return FileRead($hWnd) ; lit le fichier n'est jamais exécuté. Le FileClose qui suit ne peut être exécuté donc le fichier reste ouvert en lecture.
Petite remarque : dans ce cas, on peut utiliser FileRead directement avec le nom du fichier. Par exemple : FileRead($sDirPath & "\Fichier_FéeCoucou").
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#12

Message par amphase »

Bon sang, mais c'est bien sur !
Commissaire Bourrel, défenseur de la nouille française et de l'imperméable repassé.
Pour avoir regardé les actualités juste avant, je me suis demandé s'il ne s'agissait pas encore d'un attentat des frères Piègeac !
J'ai salement manqué de chronologique, merci de m'avoir mis le nez dedans... et à une vitesse record avec ça ; proportionnellement, j'ai les neurones qui se croisent les bras.

Merci encore & encore merci orax ! :D
Je garde le sujet ouvert pour y poster…
… la suite.
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#13

Message par amphase »

Non sans difficulté, j'ai fini par trouver la raison des messages obscènes "method not supported" que j'obtenais à la création de l'auto-exécutable "7zS.sfx". La méthode de compression par défaut (LZMA2) n'est pas supportée par "7zS.sfx". Ce n'est pas mentionné dans les "Exit Codes from 7-Zip" du fichier d'aide pourtant plutôt détaillé.

Dès le passage en LZMA, les insultes ont cessé pour faire place à un autre problème : je n'ai pas trouvé de switch (ni quoi que ce soit d'autre) pour éviter le mode administrateur requis au lancement de l'auto-exécutable.

Si le mode administrateur est incontournable, je vais devoir abandonner cette voie et opter pour une stratégie hybride exe/au3-compressé 7z. :( Dans mes recherches, il m'a été donné de voir que 7Zip surpassait WinRAR 5. J'ai également vu la masse de travail déployée par Tlem autour de 7Zip ; aussi, s'il existe une solution pour éviter l'UAC, je sais au moins qui la détient... :wink:

Merci de dire oui, Tlem, et de m'indiquer une marche à suivre non apocalyptique, car le prochain épisode devrait être celui des révélations...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#14

Message par Tlem »

Oui. ^^

Quelques informations ici : http://www.7zsfx.info/en/

Sinon pour votre problème d'élévation de droits, il suffit d'avoir le bon module sfx.
Il en existe plusieurs. Certains obligent la demande d'élévation de droits et d'autres non. ^^

Envoyé de mon appareil mobile avec Tapatalk
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#15

Message par amphase »

Merci du oui, fût-il sourcilleux. Je m'occupe de la publication des bans et j'avertis M. le curé. Tu te charges de la liste des invités et du menu ? :lol:

Plus sérieusement (quoique...), j'ai troqué "7zS.sfx" contre "7zsd_All.sfx", plus léger de 20 Ko, et ça gaze well, :) l'accès à l'auto-exécutable s'est démocratisé. Merci de m'avoir indiqué l'aspect multi facettes de 7zip avec le lien vers les versions 2012. Dans la doc 2016, ça n'y figure pas.

Puisque tu es dans le coin, j'en profite pour poser une autre question : pour écrire les métadonnées, une fois l'archive finalisée, il y a-t-il un procédé plus élégant et plus rapide que la solution bovine qui consiste à embarquer "Resource Hacker" pour l'utiliser en ligne de commande ? L'automatisation c'est bien, mais c'est qu'il commence à y avoir du monde dans la besace et je ne compte pas l'alimentaire.

Remerciements réitérés.
À bientôt. :)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#16

Message par Tlem »

Peux tu être plus explicite concernant la dernière partie ?

Donne nous des détails ou images tel que tu sait le faire. :)

Envoyé de mon appareil mobile avec Tapatalk
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#17

Message par amphase »

Je me demande s'il ne s'agit pas là d'une fine manoeuvre pour me neutraliser un petit moment : pendant que "j'explicite", je ne pose plus de question... M'enfin, comme tu m'as dit "oui", comment te dire "non". :)

En vérité, je n'avais pas du tout écrit le script pour commander Resource Hacker, ni prévu de le faire ; j'espérais que tu aurais une ruse pour m'éviter d'utiliser ce dernier recours. Maintenant que je l'ai fait, je peux confirmer les raisons de mes réticences :
  • 5 Mo de plus à embarquer, puis à décompresser. Mais c'est loin d'être le pire.
  • C'est une opération lente (même en cas d'optimisation) qui vient s'ajouter à d'autres opérations lentes, mais incontournables. Il convient de limiter autant que possible tout ce qui fait appel à l'écriture disque et si possible, même à la lecture. Le temps de réponse importe ici. Le ralentissement, c'est gênant.
  • L'antivirus se satellise complètement. Le mien est encore en orbite ou alors il est parti chasser les virusses de race Poutine en Sibérie (là où l'on peut être élu à 105%). Déjà qu'il ne voit pas AutoIt d'un bon oeil, alors, transférer les ressources d'un exécutable à un autre de façon automatisée sous son nez, c'en est trop pour lui. Ça, c'est un problème majeur ; d'autant plus lorsqu'il émane d'un programme censé améliorer la sécurité. :mrgreen:
#cs
 **********  Automatisation du transfert de ressources d'un exécutable à un autre  **********
 **************** MAL UTILISE, CA PEUT FAIRE DES TROUS DANS LES CHAUSSETTES  ****************
#ce

#include <MsgBoxConstants.au3>

Opt("MustDeclareVars")

Global $sRHpath = @ScriptDir & "\resource_hacker\ResourceHacker.exe" ; vers. 4.3.20 portable (2016)
Global $sOriginPrgmPath = @ScriptDir & "\Avant.exe" ; le fichier à modifier (est copié non modifié)
Global $sTemplatePgrmPath = @ScriptDir & "\Après.exe" ; le fichier modèle (reste inchangé)
Global $sNewPrgmPath = @ScriptDir & "\AvantAprès.exe" ; ne change que l'habillage, pas le contenu
Global $sRscPath = "" ; chemin de la ressource qui sera utilisée dans la fonction
Global $sRscName = "" ; nom de la ressource qui sera utilisée dans la fonction
Global $sCmd = "" ; la commande destinée à RH
Local $sPropPath = @ScriptDir & "\VersionInfo.res" ; ressource 'propriétés'
Local $sIconPath = @ScriptDir & "\IconAll.res" ; fichier ressource 'icones' format écriture

; @ Tlem : merci de ne pas me signaler ce qui suit :
; 1) je ferais un script ResourceHacker à commandes multiples si je garde RH  :(  là, j'ai la flemme
; 2) il y a peut-être moyen de passer par une variable pour contourner les successions R/W disque qui
; sont chronophages au possible, mais, pour le même motif que dans le 1)... - même pas honte

_ReadResource("-extract", $sPropPath, "VERSIONINFO") ; extraction des propriétés
_ReadResource("-extract", $sIconPath, "IconGroup") ; extraction des icônes
_WriteResource("-addoverwrite", $sPropPath, "VERSIONINFO") ; écriture des propriétés
_WriteResource("-addoverwrite", $sIconPath, "IconGroup") ; écriture des icônes


Func _ReadResource($sCmd, $sRscPath, $sRscName) ; lecture ressource
   Local $iPID = RunWait($sRHpath & " " & $sCmd & " " & $sTemplatePgrmPath & ", " & $sRscPath & ", " & $sRscName & ",,")
   If @error <> 0 Then Exit MsgBox($MB_TOPMOST, $sRscName, "Y-a une nouille dans la lecture" & @CRLF & @CRLF & "erreur " & @error)
EndFunc   ;==>_ReadResource


Func _WriteResource($sCmd, $sRscPath, $sRscName) ; écriture ressource
   $iPID = RunWait($sRHpath & " " & $sCmd & " " & $sOriginPrgmPath & ", " & $sNewPrgmPath & ", " & $sRscPath & ", " & $sRscName & ",,")
   If @error <> 0 Then Exit MsgBox($MB_TOPMOST, $sRscName, "Y-a une nouille dans l'écriture" & @CRLF & @CRLF & "erreur " & @error)
EndFunc   ;==>_WriteResource
Modifié en dernier par amphase le ven. 30 sept. 2016 08:22, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#18

Message par Tlem »

Bonjour amphore.
En réalité, j'attendais des explications sur le but de la manœuvre.

- Quel est cet Exe qui contient des ressources ? Un programme tiers ? Un script AutoIt ?

- Dans quel but vous voulez transférer des ressources ?

Concernant les fichiers joints, oui il y a une limite de taille et surtout les Exes même compressés sont prohibés, car là c'est mon AV qui ce satellise et qui bloque mes sauvegardes régulières.

Je n'ai pas la possibilité pour l'instant d'inspecter Cahu.zip, mais s'il contient un Exe, je vous serais reconnaissant de le supprimer ou d'en sortir tout éléments qui pourrait déclencher un faux positif.

Cordialement

Envoyé de mon appareil mobile avec Tapatalk
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#19

Message par orax »

Pour éditer les ressources d'un exécutable : Adding, Deleting, and Replacing Resources (MSDN).
Il y a des exemples dans l'aide d'AutoIt. Dans l'aide, voir la fonction _WinAPI_BeginUpdateResource par exemple.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
amphase
Niveau 3
Niveau 3
Messages : 40
Enregistré le : mar. 30 août 2016 00:28
Status : Hors ligne

Re: [..] Format .a3x et passage des paramètres de la ligne de commande dans %TMP%

#20

Message par amphase »

Voici trois semaines que je n'ai pas fait d'apparition sur le forum, en voici l'explication : une douleur au poignet qui s'est étendue de la main jusqu'à l'avant-bras et qui poursuivait sa montée et amplifiait son intensité de jour en jour. Le diagnostic est tombé : "syndrome du canal carpien". Le port d'une attelle est censé limiter l'évolution de la pathologie, mais, pour l'instant, je ne suis sur que d'une chose, c'est que cela améliore l'inconfort de la situation. Quand j'ai entendu parler de chirurgie, :shock: j'ai pris la question plus au sérieux et ai commandé une souris verticale ; jusqu'à présent, je ne savais même pas que cela existait. Elle me sera livrée d'ici une semaine. En attendant, j'ai dépoussiéré un vieux programme de reconnaissance vocale qui, moyennant un training de plusieurs heures, accepte de transcrire sans trop de difficultés un texte dicté (je l'utilise en ce moment), mais il n'est pas question de l'utiliser pour coder, à moins de prévoir un apprentissage de très longue durée, et encore...
J'ignore totalement l'origine du problème, sachant que je n'ai pas changé de souris, ni utilisé l'ordinateur différemment ou plus que d'habitude. Peut-être ais-je fait trop de bras d'honneur, alors que de simples doigts auraient suffi. En attendant la réparation du nerf, je poursuis à petite vitesse. On en était là :

@Tlom :P
Tu m'as traité de vieille cruche (amphore = vase antique - et tac !), ce qui est une offense majeure et qui aurait pu constituer un casus belli si je m'étais souvenu avoir habité Soissons. Mais je pense qu'il s'agit là d'un (Clo)vice de forme entièrement imputable à ton clavier (c'est vaseux, mais c'est parce que je ne suis pas amphore-meuh). Ce genre de problème n'arrivera plus avec l'arrivée de Windows 11 qui sera livré avec un clavier composé de trois touches uniquement, éliminant ainsi les fautes de français, comme les erreurs de saisie ; évidement, il s'agit de Ctrl, Alt et Suppr, les seules touches indispensables au bon fonctionnement de l'OS. :lol:
Pour satisfaire ta demande, j'ai retiré aussitôt les fichiers exécutables en supprimant le zip ainsi que les commentaires l'accompagnant, ménageant ainsi la tranquillité des possesseurs d'antivirus susceptibles. Parler d'exécutables sans en fournir m'a fait penser à l'histoire du chomiste de Coluche : "Je t'aurais bien fait une omelette au lard ; malheureusement, j'ai pas d'oeufs."
Afin de me retrouver à nouveau en phase avec toi et maintenant que j'ai exercé ma terrible vengeance, :) comme promis, je vais dévoiler ce que je prépare, répondant ainsi à tes trois points d'interrogation.

@orax
Une fois de plus, tu as parfaitement répondu à ma demande d'aide. Pour les rares fois qu'une fonction _WinAPI est accompagnée d'un exemple, j'ai trouvé moyen de passer à côté. Pourtant, pour avoir, bon nombre de fois, écrit des instructions qui existaient déjà dans les UDF d'AutoIt, je balaye du regard les nombreuses _WinAPI avant de me lancer dans l'écriture du script. Bien évidemment, _WinAPI_BeginUpdateResource a retenu mon attention, mais pour une raison aussi obscure que mes douleurs au poignet, je l'ai affectée à la rubrique pinceaux, brosses et curseurs, en l'éliminant du coup de mon centre d'intérêt. Pourtant l'exemple peut être utilisé tel quel dans mon script. Malheureusement, il n'en va pas de même pour les métadonnées (propriétés) de l'exécutable. J'ai bien pensé à pomper les bonnes lignes de code dans le wrapper d'AutoIt, mais un simple regard :roll: dans le script a déclenché chez moi une peur et une envie de courir. Je vais probablement embarquer ResourceHacker qui fera ça très bien, d'autant plus que j'ai déjà écrit la fonction ; à moins que je n'utilise les deux. Quoiqu'il en sera, merci de ta juste réponse. :)

Je m'aperçois que je vous en ai encore collé une tartine, aussi vais-je interrompre mon laïus ici avant que vous n''ayez le regard profond. Suite et fin du sujet dans les 48 heures (à moins que le mal ne gagne la gorge ou qu'EDF se mette en grève). Afin de ne pas avoir posté un rédactionnel sans une seule ligne de code, pour les curieux qui ne connaissent pas, voici un test qui est bel exemple de faux positif : une seule ligne suffit pour faire hurler votre antivirus.

FileWrite(@DesktopDir & "\eicar.com", "X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*")

Merci de m'avoir lu. :)
Répondre