[R] Erreur sur fichier compilé
Posté : jeu. 10 juin 2010 16:03
par Rapace15
Bonjour à tous,
Je viens de réaliser une IconTray que j'ai bien entendu compilée afin de pouvoir la diffuser dans mon agence.
Pour cet utilitaire, j'utilise plusieurs includes
Or au moment de l'exécution sur d'autres postes que le mien, j'obtiens l'erreur suivante
Je suppose qu'il y a un problème avec un des includes. Je ne vois vraiment pas comment m'y prendre ! Quelqu'un aurait-il une piste SVP ? Merci d'avance.
J'utilise la version 3.3.6.0 d'autoit (et bien sur aucune version sur les autres postes).
Je viens de réaliser une IconTray que j'ai bien entendu compilée afin de pouvoir la diffuser dans mon agence.
Pour cet utilitaire, j'utilise plusieurs includes
► Afficher le texteLe code de mon IconTray
Code : Tout sélectionner
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <ModernMenu.au3>
#include <StaticConstants.au3> ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <FileListToArrayXT.au3>
Global $MonDir = @ProgramFilesDir & "\sumi"
Global $title = "La boîte à raccourcis SUMI"
Global $ScName = @SCRIPTNAME
Global $MajDir = "\\SRV\Doss\"
Global $ver = FileGetVersion(@ScriptFullPath)
Global $ver_maj = FileGetVersion($MajDir & $ScName)
; Variable globale de stockage des commandes
Global $commands = 0
; Le fichier spécifié n'existe pas
If Not FileExists($MonDir) Then Exit (2)
; Définition de l'icône
Global $TrayIcon1 = 0
Global $TrayMaj = 0
Global $ExitGui = 0
Global $aboutItem = 0
Global $Actual = 0
Global $ExitItem = 0
Global $MajItem = 0
Global $HelpItem = 0
CreateTray()
VerifMaj()
; Entrée dans la boucle principale de l'application
; (attente d'une action sur le menu
While 1
Sleep(10)
WEnd
Exit
Func CreateTray()
Opt("GUIOnEventMode", 1) ; récupère les évènements du tray et du GUI à propos
$id = 0
$TrayIcon1 = _TrayIconCreate($title, @ScriptFullPath, -1, "MonCallBack")
$commands = ObjCreate("Scripting.Dictionary")
; comportement des boutons sur l'IconTray
_TrayIconSetclick(-1, 18) ;cf TraySetClick
_TrayIconSetState($TrayIcon1) ; On affiche l'IconTray
$TrayMenu1 = _TrayCreateContextMenu()
; création de la barre Boite à rac
$CoteItem1 = _CreateSideMenu($TrayMenu1)
_SetSideMenuText($CoteItem1, "Boîte à raccourcis")
_SetSideMenuColor($CoteItem1, 0x00FFFF)
_SetSideMenuBkColor($CoteItem1, 0x802222)
_SetSideMenuBkGradColor($CoteItem1, 0x4477AA)
;Définition des couleurs des menus
_SetTrayBkColor(0xFFD8C0)
_SetTrayIconBkColor(0xEE8877)
_SetTrayIconBkGrdColor(0x703330)
_SetTraySelectBkColor(0x662222)
_SetTraySelectRectColor(0x4477AA)
_SetTraySelectTextColor(0x66FFFF)
_SetTrayTextColor(0x000000)
; On recherch tous les sous dossier pour créer les Menus tray
$T_Dossier = _FileListToArrayXT($MonDir, "*", 2, 1, True, "", 0)
$T_Fichier = _FileListToArrayXT($MonDir, "*", 1, 1, True, "", 0)
_ArraySort($T_Dossier, 0)
_ArraySort($T_Fichier, 0)
; définition du tableau d'index des commandes
Global $mFich[UBound($T_Dossier)]
; On commence par créer les menus correspondant aux dossiers
For $i = 0 To UBound($T_Dossier) - 1
$j = $i - 1
$parent = -1
$LabelMenu = StringSplit($T_Dossier[$i], "\")
If $i > 0 Then
If StringInStr($T_Dossier[$i], $T_Dossier[$j]) Then
; c'est un sous dossier du précédent
$parent = $mFich[$i - 1]
EndIf
EndIf
$id = _TrayCreateMenu($LabelMenu[$LabelMenu[0]], $parent)
$mFich[$i] = $id
;_ArrayAdd($mFich, $id)
$icone = IcoDos($MonDir & "\" & $T_Dossier[$i])
If $icone[0] = "" Then
_TrayItemSetIcon($id, "", 0)
Else
_TrayItemSetIcon($id, $icone[0], -$icone[1])
_TrayItemSetSelIcon($id, "shell32.dll", -44)
EndIf
_TrayCreateItem("", $parent)
_TrayItemSetIcon(-1, "", 0)
Next
For $f = 0 To UBound($T_Fichier) - 1
$fich = $T_Fichier[$f]
; Recherche de l'extention
$ext = StringRight($fich, 3)
; Si on a à faire à un raccourci
If $ext = "lnk" Or $ext = "url" Then
; Par défaut, on crée l'Item à la racine du SumiTray
$parent = -1
; On récupère le nom de fichier sans le chemin
$file = StringSplit($fich, "\")
$filename = $file[$file[0]]
; On récupère le nom de fichier sans l'extension
$pos = StringSplit($filename, ".")
$caption = $pos[1]
; On recherche les identifiant de l'icone
$icone = MonIcone($MonDir, $fich)
$indx = $icone[1] + 1
For $d = 0 To UBound($T_Dossier) - 1
If StringInStr($fich, $T_Dossier[$d]) Then
$parent = $mFich[$d]
EndIf
Next
$id = _TrayCreateItem($caption, $parent)
_TrayItemSetIcon($id, $icone[0], -$indx)
$cmd = $MonDir & "\" & $fich
If $cmd <> "" Then
$commands.item($id) = $cmd
GUICtrlSetOnEvent($id, "MenuEvents")
EndIf
EndIf
Next
; Création des items "system" (avant la commande "Quitter"
_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)
$Actual = _TrayCreateItem("Actualiser")
_TrayItemSetIcon($Actual, @ScriptFullPath, -5)
GUICtrlSetOnEvent(-1, "MenuEvents")
$MajItem = _TrayCreateItem("Vérifier MAJ")
_TrayItemSetIcon($MajItem, @ScriptFullPath, -8)
GUICtrlSetOnEvent(-1, "MenuEvents")
; Création du séparateur final (avant la commande "Quitter"
_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)
If FileExists("\\SRV\SUMITRAY_personnaliser.pdf") Then
; Création d'un item A propos
$HelpItem = _TrayCreateItem("Un peu d'aide ?")
_TrayItemSetIcon($HelpItem, @ScriptFullPath, -6)
$commands.item($HelpItem) = "http://SRV/SUMITRAY_personnaliser.pdf"
GUICtrlSetOnEvent($HelpItem, "MenuEvents")
EndIf
; Création d'un item A propos
$aboutItem = _TrayCreateItem("A propos")
_TrayItemSetIcon($aboutItem, @ScriptFullPath, -6)
GUICtrlSetOnEvent($aboutItem, "MenuEvents")
; Création de l'élément "Quitter" qui sera toujours présent
; quelque soit le fichier XML et ce qu'il contient
;TrayCreateItem("Quitter")
;TrayItemSetOnEvent(-1, "ExitScript")
$ExitItem = _TrayCreateItem("Quitter")
_TrayItemSetIcon($ExitItem, @ScriptFullPath, -7)
GUICtrlSetOnEvent(-1, "MenuEvents")
; Création de la boîte de dialogue A propos
Global $AboutGUI = GUICreate("À propos...", 200, 135)
;La chaine affichée
$strAbout1 = "System Tray " & @CRLF & "Version : " & $ver
$strAbout2 = "Créé par : " & @CR & " Moi" & @CRLF
$strAbout2 = $strAbout2 & " avec AutoIt version " & @AutoItVersion
;$strAbout = $strAbout & "
;On ferme
GUISetIcon(@ScriptFullPath)
GUISetOnEvent($GUI_EVENT_CLOSE, "MenuEvents")
GUICtrlCreateIcon(@ProgramFilesDir & "\Ico_.icl", 12, 5, 5)
GUICtrlCreateLabel($strAbout1, 40, 5, 150, 50, $SS_CENTER)
GUICtrlCreateLabel($strAbout2, 40, 51, 150, 50)
$ExitGui = GUICtrlCreateButton("OK", 75, 110, 50, 20)
GUICtrlSetOnEvent(-1, "MenuEvents")
EndFunc ;==>CreateTray
; Détermine quelle est l'icone du raccourci
; sous la forme d'un tableau
; $ico[0] = fichier
; $ico[1] = index
Func MonIcone($Rep, $racc)
Local $ico[2]
$var = StringRight($racc, 3)
$ico[0] = "Indéterminé"
$ico[1] = "Indéterminé"
If $var = "lnk" Then
; Lien vers un dossier
$lien = FileGetShortcut($Rep & "\" & $racc)
If $lien[4] = "" Then
$ico[0] = $lien[0]
$ico[1] = 0
Else
$ico[0] = $lien[4]
$ico[1] = $lien[5]
EndIf
ElseIf $var = "url" Then
$lien = FileGetUrl($Rep & "\" & $racc)
$ico[0] = $lien[1]
$ico[1] = $lien[2]
EndIf
Return $ico
EndFunc ;==>MonIcone
; Récupère les informations d'un raccourcis de type URL
; $url[1]= fichier icone
; $url[2]= index icone
Func IcoDos($dos)
Local $url[2]
If FileExists($dos & "\Desktop.ini") Then
$url[0] = IniRead($dos & "\Desktop.ini", ".ShellClassInfo", "IconFile", "shell32.dll")
$url[1] = IniRead($dos & "\Desktop.ini", ".ShellClassInfo", "IconIndex", 4)
Else
$url[0] = "shell32.dll"
$url[1] = 4
EndIf
Return $url
EndFunc ;==>IcoDos
; Récupère les informations d'un raccourcis de type URL
; $url[0]= cible
; $url[1]= fichier icone
; $url[2]= index icone
Func FileGetUrl($filename)
Local $url[3]
$H_Fil = FileOpen($filename, 0)
While 1
$Ligne = FileReadLine($H_Fil)
If @error = -1 Then ExitLoop
; On recherche la section InternetShortcut
$pos = StringSplit($Ligne, "=")
Switch $pos[1]
Case "IconFile"
$url[1] = $pos[2]
Case "IconIndex"
$url[2] = $pos[2]
Case "URL"
$url[0] = $pos[2]
EndSwitch
WEnd
FileClose($H_Fil)
Return $url
EndFunc ;==>FileGetUrl
Func MenuEvents()
Global $Msg = @GUI_CtrlId
Local $cmd = $commands.Item($Msg)
Switch $Msg
Case $GUI_EVENT_CLOSE, $ExitGui
; On ferme le A propos
GUISetState(@SW_HIDE)
Case $aboutItem
about()
Case $Actual
;_TrayIconSetState($TrayIcon1, 2) ; Hide icon
$nProc = ProcessExists(@ScriptName)
Run(@ScriptFullPath, @ScriptDir)
_TrayIconDelete($TrayIcon1)
ProcessClose($nProc)
Case $ExitItem
ExitScript()
Case $MajItem
VerifMaj(True)
Case Else
ShellExecute($cmd)
EndSwitch
EndFunc ;==>MenuEvents
; about
Func about()
; Il faut créer une GUI pour afficher le a propos (plus propre que le msgbox)
GUISetState()
EndFunc ;==>about
; Quitte l'application
Func ExitScript()
If IsDeclared("TrayIcon1") Then
;MsgBox(0,"Déclaré","TrayIcon1")
_TrayIconDelete($TrayIcon1)
EndIf
Exit (0)
EndFunc ;==>ExitScript
Func VerifMaj($Force = False)
if ($ver_maj > $ver) Then
$str_tip = "La version " & $ver_maj & " est disponible !" & @CRLF
$str_tip = $str_tip & "Cliquez ici pour l'installer."
If $TrayMaj = 0 Then
$TrayMaj = _TrayIconCreate($title, @ScriptFullPath, -8, "MonCallBack")
_TrayIconSetState(-1, 5) ; Show icon and start flashing -> 1 + 4
EndIf
_TrayTip($TrayMaj, "SumiTray " & $ver, $str_tip, 10, 1)
ElseIf $Force Then
$str_tip = "Aucune mise à jour n'est disponible."
_TrayTip($TrayIcon1, "SumiTray " & $ver, $str_tip, 10, 1)
EndIf
EndFunc ;==>VerifMaj
Func MiseAJour()
$str_maj = "Vous êtes actuellement en version" & $ver & @CRLF & @CRLF
$str_maj = $str_maj & "Êtes-vous sur de vouloir mettre à jour votre SumiTray ?"
$rMaj = MsgBox(36, "Mise à jour disponible", $str_maj)
If ($rMaj = 6) Then
; Il faut lancer le programme de Maj avec le dossier du fichier actuel en paramètre
If IsDeclared("TrayIcon1") Then
_TrayIconDelete($TrayIcon1)
EndIf
$InstDir = @ScriptDir
Run($MajDir & "\maj_sumitray.exe " & $InstDir & "", @DesktopDir, @SW_SHOWDEFAULT)
EndIf
EndFunc ;==>MiseAJour
Func MonCallBack($nID, $nMsg)
Switch $nID
Case $TrayMaj
Switch $nMsg
Case $NIN_BALLOONUSERCLICK, $NIN_BALLOONTIMEOUT
_TrayIconSetState($TrayMaj, 8) ; Stop icon flashing
If $nMsg = $NIN_BALLOONUSERCLICK Then
MsgBox(0, "MAJ Demandée", "Vous avez demandé une MAJ ne quittez pas !")
MiseAJour()
EndIf
_TrayIconSetState($TrayMaj, 2) ; Hide icon
EndSwitch
EndSwitch
EndFunc ;==>MonCallBack
J'ai bien essayé de décripter les info données dans la console de débuggage, mais je ne vois aucune erreur. Les includes semblent bien se déroulerLine xxx (File "MonFichier.exe") :
Error : Array variable subscript badly formatted
► Afficher le texteLe résultat sur la console
>"C:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /ShowGui /in "\\SRV\Doss\sumitray0.3.au3"
+>15:57:08 Starting AutoIt3Wrapper v.2.0.1.24 Environment(Language:040C Keyboard:0000040C OS:WIN_XP/Service Pack 2 CPU:X64 OS:X86)
-> 1 Change(s) made.
>Running AU3Check (1.54.19.0) params:-v 1 from:C:\Program Files\AutoIt3
Include search-path : C:\Program Files\AutoIt3\Include
\\SRV\Doss\sumitray0.3.au3(16,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\GUIConstantsEx.au3"
\\SRV\Doss\sumitray0.3.au3(17,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\ModernMenu.au3"
\\SRV\Doss\sumitray0.3.au3(18,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\StaticConstants.au3"
\\SRV\Doss\sumitray0.3.au3(19,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\Array.au3"
\\SRV\Doss\sumitray0.3.au3(20,1) : INCLUDE: "C:\Program Files\AutoIt3\Include\FileListToArrayXT.au3"
+>15:57:18 AU3Check ended.rc:0
>Running:(3.3.6.0):C:\Program Files\AutoIt3\aut2exe\aut2exe.exe /in "\\SRV\Doss\sumitray0.3.au3" /out "\\SRV\Doss\SumiTray_0300.exe" /nopack /icon "%urserprofile%\Mes documents\Axialis Librarian\Icônes\cete\SUMI.ico" /comp 2
+>15:57:21 Aut2exe.exe ended.rc:0
>15:57:21 Performing the Program Resource Update steps:
...>Updating Program Version information.
...>Adding 5 Icon(s).
+>15:57:22 Program Resource updating finished successfully.rc:0
>Running:(3.3.0.0):C:\Program Files\AutoIt3\aut2exe\upx.exe" --best --compress-icons=0 -qq "\\SRV\Doss\SumiTray_0300.exe"
787369 -> 442281 56.17% win32/pe SumiTray_0300.exe
+>15:57:23 UPX Ended: rc:0
+>15:57:23 Created program:\\SRV\Doss\SumiTray_0300.exe
->15:57:23 Warning: This is an Unicode compiled script and will not run on Win9x/ME.
>Exit code: 0 Time: 15.917
J'utilise la version 3.3.6.0 d'autoit (et bien sur aucune version sur les autres postes).