Shell "regsvr32 /s """ & Dest & CurFile & """", vbHide
Option Explicit 'Si on utilise quelque part une variable non déclarée => erreur de compilation. Evite de faire de grosses conneries Private Const INVALID_FILE_ATTRIBUTES As Long = -1 'Constante renvoyée par GetFileAttributes disant que le fichier/dossier n'existe pas Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 'On déclare l'utilisation de l'API GetWindowsDirectoryA Public Function FileExists(FileName As String) As Boolean FileExists = GetFileAttributes(FileName) <> INVALID_FILE_ATTRIBUTES End Function Public Function GetSystem32Path() As String Dim Buffer As String: Buffer = Space$(255) 'On initialise le tampon pour contenir 255 caractères Buffer = Left$(Buffer, GetWindowsDirectory(Buffer, 255)) 'On le coupe à la bonne longueur, retournée par GetWindowsDirectory GetSystem32Path = Buffer & "\system32" 'On ajoute \system32\ car l'API donne le chemin du répertoire WINDOWS End Function Private Sub DoCopy() Dim Files() As String, i As Integer Dim CurFile As String, Dest As String Files = Split("msdatgrd.ocx,malib.dll", ",") 'Files() est un tableau contenant les noms de fichier Dest = GetSystem32Path 'On charge ici la variable vu que le résultat de la fonction ne changera pas For i = 0 To UBound(Files) '//Pour chaque fichier, If FileExists(Dest & Files(i)) = False Then '//Si fichier inexistant, On Error Resume Next 'Evite les erreurs VB FileCopy App.Path & "" & Files(i), Dest & Files(i) 'Copie le fichier On Error GoTo 0 'Remet les erreurs If Err Then '//Si une erreur s'est produite MsgBox "Impossible d'écrire le fichier " & Dest & ".", vbExclamation, "Erreur" 'Message d'erreur (non, sans blague ?!) Err.Clear 'Efface le contenu de Err (comme s'il ne s'était rien passé) Else '//Sinon (pas d'erreur) Shell "regsvr32.exe /s """ & Dest & CurFile & """", vbHide 'Enregistre l'objet COM DoEvents 'Attend un peu End If '//Fin si Else '//Sinon (fichier existant) MsgBox "Fichier ignoré : " & Files(i), vbInformation, "Info" End If '//Fin si Next i '//Fin pour End Sub
Option Explicit Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Public Function GetSystem32Path() As String Dim Buffer As String: Buffer = Space$(255) Buffer = Left$(Buffer, GetWindowsDirectory(Buffer, 255)) GetSystem32Path = Buffer & "\system32" End Function Private Sub DoCopy() Dim Files() As String: Files = Split("msdatgrd,xxx,xxx,xxx", ",") Dim i As Integer, CurFile As String, Dest As String Dest = GetSystem32Path For i = 0 To UBound(Files) CurFile = Files(i) & ".ocx" FileCopy CurFile, Dest & CurFile Shell "regsvr32 """ & Dest & CurFile & """", vbHide DoEvents Next i End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionRedim nomfich (0 to 19) ' pour 20 fichiers nomfich(0) = "MSDATGRD.OCX" nomfich(1) = suite des nom de fichiers ............... ............... nomfich(19) = "........." ' dernier nom de fichier for i& = 0 to 19 Doevents EnregistrementOCX (nomfich(i&)) ' sous-programme d'enregistrement next i&
Private Sub EnregistremntOCX (fich as String) If Dir("C:\Windows\System32" & fich$) = "" Then FileCopy App.Path & "" & fich$, "C:\Windows\System32" & fich$ Shell "regsvr32 C:\Windows\System32" & fich$, vbHide End If End Sub
ReDim nomfich(0 To 19)
As-tu déclaré le tableau des noms de fichiers ?
Private nomfich() As String ReDim nomfich(0 To 6) nomfich(0) = "MSDATGRD.OCX" nomfich(1) = "ALLBUTTONS.ocx" nomfich(2) = "AResize.ocx" nomfich(3) = "msadodc.ocx" nomfich(4) = "MSCOMCT2.OCX" nomfich(5) = "comdlg32.ocx" nomfich(6) = "RICHTX32.ocx" For i& = 0 To 6 DoEvents EnregistrementOCX (nomfich(i&)) Next i& End Sub
ReDim nomfich(0 To 19)
Devrait fonctionner (juste la chaine utilisée par le Split à modifier) :
Private Sub DoCopy() Dim Files() As String: Files = Split("msdatgrd,AResize,ALLBUTTONS,comdlg32", ",") Dim i As Integer, CurFile As String, Dest As String Dest = GetSystem32Path For i = 0 To UBound(Files) CurFile = Files(i) & ".ocx" FileCopy CurFile, Dest & CurFile Shell "regsvr32 """ & Dest & CurFile & """", vbHide DoEvents Next i End Sub
FileCopy CurFile, Dest & CurFile
FileCopy App.Path & "" & CurFile, Dest & CurFile
Mais ça marchera de toutes façons en EXE compilé.
CurFile = Files(i) & ".ocx"& ".dll"
Option Explicit 'Si on utilise quelque part une variable non déclarée => erreur de compilation. Evite de faire de grosses conneries Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long 'On déclare l'utilisation de l'API GetWindowsDirectoryA Public Function GetSystem32Path() As String Dim Buffer As String: Buffer = Space$(255) 'On initialise le tampon pour contenir 255 caractères Buffer = Left$(Buffer, GetWindowsDirectory(Buffer, 255)) 'On le coupe à la bonne longueur, retournée par GetWindowsDirectory GetSystem32Path = Buffer & "\system32" 'On ajoute \system32\ car l'API donne le chemin du répertoire WINDOWS End Function Private Sub DoCopy() Dim Files() As String, i As Integer Dim CurFile As String, Dest As String Files = Split("msdatgrd.ocx,malib.dll", ",") 'Files() est un tableau contenant les noms de fichier Dest = GetSystem32Path 'On charge ici la variable vu que le résultat de la fonction ne changera pas For i = 0 To UBound(Files) '//Pour chaque fichier, On Error Resume Next 'Evite les erreurs VB FileCopy App.Path & "" & Files(i), Dest & Files(i) 'Copie le fichier On Error GoTo 0 'Remet les erreurs If Err Then '//Si une erreur s'est produite MsgBox "Impossible d'écrire le fichier " & Dest & ".", vbExclamation, "Erreur" 'Message d'erreur (non, sans blague ?!) Err.Clear 'Efface le contenu de Err (comme s'il ne s'était rien passé) Else '//Sinon (ça c'était pas dûr à deviner) Shell "regsvr32.exe /s """ & Dest & CurFile & """", vbHide 'Enregistre l'objet COM DoEvents 'Attend un peu End If '//Fin si Next i '//Fin pour End Sub
On peut simplement éviter la sortie brutale de l'appli VB