Patcher le compilateur vb6 pour qu'il compile des exes autonomes(sans vb6fr.dll)

Soyez le premier à donner votre avis sur cette source.

Vue 8 887 fois - Téléchargée 1 623 fois

Description

LinkMsvbvm60 2009 Deleplace
Modifie le compilateur VB6
pour supprimer la dépendance à VB6FR.DLL
il la remplace par la dépendance à MSVBVM60.DLL dont il déja dépendant
comme MSVBVM60.DLL est présents
sur tous les PC depuis XP(98 non 2000 sais pas)
vos EXEs deviennent autonomes
LinkMsvbvm60.exe est en même temps
un programme d'installation
un patch pour LINK.EXE
un programme de désinstallation
l'installation renomme ce fichier en _LINK.EXE
et le remplace par une copie de LinkMsdmo.exe (sous le nom LINK.EXE)
Si Vous désirez rendre autonomes des EXEs déja compilés
utilisez UnVb6fr.exe (dans le Zip)
Principe de fonctionnement
LinkMsdmo.exe (renommé LINK.EXE)
recoit les infos de compilations, les transmet à _LINK.EXE (le LINK original)
puis patche l'EXE fabriqué par _LINK.EXE
c'est à dire remplace la référence à VB6FR.DLL par MSVBVM60.DLL

Source / Exemple :


Option Explicit
Private Declare Function GetModuleFileNameA& Lib "kernel32.dll" (ByVal hModule&, ByVal lpFileName$, ByVal nSize&)
Private Declare Function GetLongPathNameA& Lib "kernel32" (ByVal lpszShortPath$, ByVal lpszLongPath$, ByVal cchBuffer&)
Private Type STARTUPINFO
cb As Long
lpReserved As Long
lpDesktop As Long
lpTitle As Long
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Const STARTF_USESHOWWINDOW As Long = &H1
Const SW_HIDE As Long = 0

Private Const NORMAL_PRIORITY_CLASS As Long = &H20&
Private Const INFINITE As Long = -1&
Private Const STATUS_WAIT_0 As Long = &H0
Private Const WAIT_OBJECT_0 As Long = STATUS_WAIT_0
Private Declare Function CloseHandle& Lib "kernel32" (ByVal hObject As Long)
Private Declare Function WaitForSingleObject& Lib "kernel32" (ByVal hProcess&, ByVal dwMilliseconds&)
Private Declare Function InputIdle& Lib "user32" Alias "WaitForInputIdle" (ByVal hProcess&, ByVal dwMilliseconds&)
Private Declare Function CreateProcessA& Lib "kernel32" (ByVal lpApplicationName&, _
 ByVal lpCommandLine$, ByVal lpProcessAttributes&, ByVal lpThreadAttributes&, _
 ByVal bInheritHandles&, ByVal dwCreationFlags&, ByVal lpEnvironment&, _
 ByVal lpCurrentDirectory$, lpStartupInfo As STARTUPINFO, _
 lpProcessInformation As PROCESS_INFORMATION)

Dim MyEXEName$, OrgLINK$, HelpFile$

Private Sub Form_Load()
Dim Cmd$, EXEFile$, EndOfExe&, StartOfExe&, StringEXE$, VB5&, VB6FR&, I&
Cmd = Command
MyEXEName = Space(300)
MyEXEName = Left(MyEXEName, GetModuleFileNameA(0, MyEXEName, 300))
MyEXEName = LongPathName(MyEXEName)
If UCase(Right(MyEXEName, 8)) = "\VB6.EXE" Then 'Exécution non compilié (Sous VB6)
 MyEXEName = App.Path & "\" & App.EXEName & ".exe"
End If
I = InStrRev(MyEXEName, "\")
'Si le programme se nomme LINK.EXE c'est le patch compilateur
'Sinon c'est l'installateur désinstallateur
If UCase(Mid(MyEXEName, I)) <> "\LINK.EXE" Then PreVerif: Install_Uninstall: Exit Sub
OrgLINK = Left(MyEXEName, I) & "_LINK.EXE"
ShellWait """" & OrgLINK & """ " & Cmd, , True
EndOfExe = InStr(UCase(Cmd), ".EXE""")
If EndOfExe = 0 Then End
StartOfExe = InStrRev(Cmd, """", EndOfExe) + 1
EXEFile = Mid(Cmd, StartOfExe, EndOfExe + 4 - StartOfExe)
If Dir(EXEFile) = "" Then End
Open EXEFile For Binary As 1
StringEXE = Space(LOF(1))
Get 1, , StringEXE
Boucle:
 VB5 = InStr(VB5 + 1, StringEXE, "VB5!")
 If VB5 Then
  VB6FR = VB5 + 6
  If Mid(StringEXE, VB6FR, 10) = "VB6FR.DLL" & Chr(0) Then
   Put 1, VB6FR, "MSVBVM60.DLL" 'Patch remplace VB6FR.DLL par MSVBVM60.DLL
   End
  Else
   GoTo Boucle
  End If
 Else
  End
 End If
End Sub

Private Sub PreVerif() ' destinée aux utilisateurs de Vista
If Dir(LinkFile) = "" Then
 LinkFile = "D" & Mid(LinkFile, 2)
 If Dir(LinkFile) = "" Then LinkFile = "C:" & Mid(LinkFile, 17)
End If
End Sub

Private Function Verif() As Boolean
If UCase(Right(LinkFile, 9)) = "\LINK.EXE" Then
 OrgLINK = Left(LinkFile, Len(LinkFile) - 8) & "_LINK.EXE"
 Verif = True
Else
 MsgBox "Doit se terminer par ""\LINK.EXE"""
End If
End Function

Private Sub Install_Uninstall()
HelpFile = Left(MyEXEName, Len(MyEXEName) - 3) & "hlp"
If Dir(HelpFile) = "" Then Help.Caption = App.EXEName & ".hlp non trouvé": Help.Enabled = False
If Not Verif Then Exit Sub
If Len(Dir(LinkFile)) Then
 Label1.Visible = False
 Install.Enabled = (Dir(OrgLINK) = "")
 UnInstall.Enabled = Not Install.Enabled
Else
 Label1.Visible = True
 Install.Enabled = False
 UnInstall.Enabled = False
End If
End Sub

'Comme SHELL mais attend la fin de l'execution
Private Function ShellWait&(CommandLine$, Optional Path$ = vbNullString, Optional Hide As Boolean = False)
Dim proc As PROCESS_INFORMATION
Dim Start As STARTUPINFO
With Start
 .cb = Len(Start)
 If Hide Then
  .dwFlags = STARTF_USESHOWWINDOW
  .wShowWindow = SW_HIDE
 End If
End With
CreateProcessA 0&, CommandLine, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, Path, Start, proc
ShellWait = WaitForSingleObject(proc.hProcess, INFINITE)
CloseHandle proc.hProcess
End Function

Private Function LongPathName$(ByVal ShortPath$)
LongPathName$ = Space(1024)
LongPathName$ = Left(LongPathName$, GetLongPathNameA(ShortPath, LongPathName$, 1024))
End Function

Private Sub Help_Click()
Shell "Notepad """ & HelpFile & """", vbNormalFocus
End Sub

Private Sub LinkFile_Keypress(K%)
If K = 13 Then Install_Uninstall ' si <Enter>
End Sub

Private Sub ChLINK_Click()
Install_Uninstall
End Sub

Private Sub Install_Click()
If Not Verif Then Exit Sub
If Dir(MyEXEName) = "" Then MsgBox "Il faut compiler " & App.EXEName: Exit Sub
On Error Resume Next
FileCopy LinkFile, OrgLINK
If Err = 0 Then FileCopy MyEXEName, LinkFile
If Err Then MsgBox "l'Installation a échoué" Else MsgBox "Installé avec scccés"
Install_Uninstall
End Sub

Private Sub UnInstall_Click()
If Not Verif Then Exit Sub
On Error Resume Next
FileCopy OrgLINK, LinkFile
If Err Then
 MsgBox "La désinstallation a échouée !"
Else
 Kill OrgLINK: Install_Uninstall
End If
End Sub

Conclusion :


Avec le projet précedent(UnVb6fr inclus)
Je pense avoir fait le tour du sujet
je retire les Avertissements que j'avais fait suite à une modif

Codes Sources

A voir également

Ajouter un commentaire Commentaires
ccgousset Messages postés 150 Date d'inscription samedi 1 août 2009 Statut Membre Dernière intervention 4 mars 2023
29 avril 2016 à 11:57
Ouais ça marche, w8.1N nCrké , lancer l exe en mode admin et il change l exe dans le disque C:\ ..... pas mal . l exe generé meme taille mais debug instrucs en anglais.... la belle affaire. Bravo t es fort. Bon pour utiliser un exe en mode monoolith comment on fait ( sans les autres dll ) j ai deja vu un tuto mais je le retrouve pas . Merci si tu sais . C est moi aui est fait le compilo pour ti 82/83 et le sudoku 16x16 , mais la je seche .... Christophe
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 75
2 mars 2009 à 10:23
VB6FR.dll => messages d'erreurs.

après, reste a voir la version des dll installées avec le runtime.

Les boites sont localisées directement, me semble-il (a tester )
les chaines &Ok, &Annuler, etc. sont extraites de User32.dll
(a confirmer)
agapoff Messages postés 15 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 16 avril 2011
2 mars 2009 à 10:19
Merci Renfield,
Mais je dois être bouché ce matin.
Je ne suis pas sur de bien comprendre pas ta réponse.
VB6SP6FR -> Messages d'erreur en français
COMDLG32 déjà présente sur le PC du client -> Boîtes de dialogue (MsgBox, FileOpen, etc.) dans sa langue
C'est ça ?
Parce que sinon, il faut construire ses propres boîtes de dialogue en y paramétrant les messages dans la langue cible ?
Parce que refaire une BdDlg FileOpen, y'a du taf...
Et désolé de polluer les commentaires de cette source.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 75
2 mars 2009 à 09:49
ça, ca viens de la version du runtime installé... VB6SP6FR
et de la dll comdlg32
agapoff Messages postés 15 Date d'inscription lundi 9 juin 2003 Statut Membre Dernière intervention 16 avril 2011
2 mars 2009 à 09:44
Ah Okay, ça ne change que les messages d'erreur ?

J'ai bien l'intention de livrer un fichier de messages applicatifs pour chaque langue supportée (avec la limitation de l'ANSI, malheureusement), bien sûr, mais en ce qui concerne les boîtes de dialogue ouvrir/enregistrer, seront elles locales même si je fournis et depend de VB6FR ?

Merci pour ton soutien, c'est sympa !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.