FAQ Visual Basic
FAQ Visual Basic Consultez toutes les FAQ
Nombre d'auteurs : 50, nombre de questions : 300, dernière mise à jour : 15 juin 2021
- Comment ouvrir mon fichier d'aide .hlp depuis mon application ?
- Comment ouvrir mon fichier d'aide .chm par du code ?
- Comment faire un programme d'installation ?
- Quels sont les fichiers nécessaires pour que mon logiciel fonctionne ?
- Comment enregistrer un ActiveX ?
- Pourquoi le setup de VB m'indique que des fichiers systèmes sont périmés pendant l'installation de mon application ?
- Comment inclure MDAC à mon programme d'installation ?
- Comment associer une extension à un programme ?
Lorsque l'utilisateur de votre programme appuie sur la touche F1, VB ouvre le fichier d'aide dont le chemin est spécifié dans App.HelpFile.
Si le fichier d'aide se trouve dans le répertoire de l'exécutable, et s'appelle Aide.hlp, il faudra donc placer cette ligne au début du programme :
App.HelpFile
=
App.Path
&
"\Aide.hlp"
Si le fichier d'aide doit aussi s'ouvrir sur le clic d'un bouton ou d'un menu, il suffira de simuler un clic sur la touche F1 avec l'instruction SendKeys :
Private
Sub
btnAide_Click
(
)
'ouvre le fichier d'aide quand on clique sur le bouton btnAide
SendKeys "{F1}"
End
Sub
Si votre fichier d'aide est un fichier d'extension .chm, vous pouvez déclencher son ouverture lors de l'appui sur
la touche F1 de la même façon que celle décrite pour un fichier d'extension .hlp.
Si vous avez besoin de passer par le code, voici le source d'un module de classe à copier dans votre projet.
Créez donc un module de classe et nommez-le CHelp.
Private
Enum HH_COMMAND
HH_DISPLAY_TOPIC =
&
H0
HH_HELP_FINDER =
&
H0
HH_DISPLAY_TOC =
&
H1
HH_DISPLAY_INDEX =
&
H2
HH_DISPLAY_SEARCH =
&
H3
HH_SET_WIN_TYPE =
&
H4
HH_GET_WIN_TYPE =
&
H5
HH_GET_WIN_HANDLE =
&
H6
HH_GET_INFO_TYPES =
&
H7
HH_SET_INFO_TYPES =
&
H8
HH_SYNC =
&
H9
HH_ADD_NAV_UI =
&
HA
HH_ADD_BUTTON =
&
HB
HH_GETBROWSER_APP =
&
HC
HH_KEYWORD_LOOKUP =
&
HD
HH_DISPLAY_TEXT_POPUP =
&
HE
HH_HELP_CONTEXT =
&
HF
HH_TP_HELP_CONTEXTMENU =
&
H10
HH_TP_HELP_WM_HELP =
&
H11
HH_CLOSE_ALL =
&
H12
HH_ALINK_LOOKUP =
&
H13
End
Enum
Private
Type
structHH_FTS_QUERY
cbStruct As
Long
fUniCodeStrings As
Long
pszSearchQuery As
String
iProximity As
Long
fStemmedSearch As
Long
fTitleOnly As
Long
fExecute As
Long
pszWindow As
String
End
Type
Private
Declare
Function
HtmlHelp Lib
"hhctrl.ocx"
Alias "HtmlHelpA"
_
(
ByVal
hwndCaller As
Long
, _
ByVal
pszFile As
String
, _
ByVal
uCommand As
HH_COMMAND, _
dwData As
Any) As
Long
Public
Sub
Show
(
NewFile As
String
, Optional
WindowPane As
String
, Optional
ContextID)
Dim
Fichier As
String
Fichier =
NewFile
If
Len
(
WindowPane) Then
Fichier =
Trim
(
Fichier) &
">"
&
Trim
(
WindowPane)
End
If
If
IsMissing
(
ContextID) Then
Call
HtmlHelp
(
0
, Fichier, HH_DISPLAY_TOC, ByVal
0
&
)
Else
Call
HtmlHelp
(
0
, Fichier, HH_HELP_CONTEXT, ByVal
Clng
(
ContextID))
End
If
End
Sub
Public
Sub
ShowIndex
(
NewFile As
String
, Optional
WindowPane As
String
)
Dim
Fichier As
String
Fichier =
NewFile
If
Len
(
WindowPane) Then
Fichier =
Trim
(
Fichier) &
">"
&
Trim
(
WindowPane)
End
If
Call
HtmlHelp
(
0
, Fichier, HH_DISPLAY_INDEX, ByVal
0
&
)
End
Sub
Public
Sub
ShowSearch
(
NewFile As
String
, Optional
WindowPane As
String
)
Dim
Fichier As
String
Dim
HH_FTS_QUERY As
structHH_FTS_QUERY
With
HH_FTS_QUERY
.cbStruct
=
Len
(
HH_FTS_QUERY)
.fUniCodeStrings
=
0
&
.pszSearchQuery
=
"TEST"
.iProximity
=
0
&
.fStemmedSearch
=
0
&
.fTitleOnly
=
0
&
.fExecute
=
1
&
.pszWindow
=
""
End
With
Fichier =
NewFile
If
Len
(
WindowPane) Then
Fichier =
Trim
(
Fichier) &
">"
&
Trim
(
WindowPane)
End
If
Call
HtmlHelp
(
0
, Fichier, HH_DISPLAY_SEARCH, HH_FTS_QUERY)
End
Sub
App.HelpFile vous renvoie le nom du fichier d'aide que vous avez indiqué dans les propriétés du projet. Vous pouvez aussi modifier cette propriété à l'exécution. App.HelpFile doit bien sûr être ici un fichier .chm compilé.
Voyons comment afficher l'index de l'aide dans la fenêtre W1, celle-ci ayant été auparavant définie dans le projet d'aide. Le paramétrage de la fenêtre d'affichage est optionnel.
Dim
objHelp As
Chelp
Set
objHelp =
New
Chelp
Call
objHelp.ShowIndex
(
App.HelpFile
, "W1"
)
Set
objHelp =
Nothing
Nous pouvons aussi afficher le sommaire :
Dim
objHelp As
Chelp
Set
objHelp =
New
Chelp
Call
objHelp.Show
(
App.HelpFile
, "W1"
)
Set
objHelp =
Nothing
Ainsi que la page de recherche :
Dim
objHelp As
Chelp
Set
objHelp =
New
Chelp
Call
objHelp.ShowSearch
(
App.HelpFile
, "W1"
)
Set
objHelp =
Nothing
Il n'est pas possible de transmettre la chaine à rechercher directement à l'onglet de recherche, comme l'indique cet article de Microsoft
Enfin voici comment afficher une page à partir de son ContextID :
Dim
objHelp As
Chelp
Set
objHelp =
New
Chelp
Call
objHelp.Show
(
App.HelpFile
, "W1"
, 320
)
Set
objHelp =
Nothing
Vous pouvez utiliser l'assistant d'empaquetage et déploiement. Vous le trouverez dans le gestionnaire des suppléments de Visual Basic, ou dans les programmes du menu Démarrer, dans les outils Microsoft Visual Studio 6.0.
Il existe aussi des logiciels commerciaux complets et de bonne qualité, tels ceux édités par les sociétés Installshield et Wise.
Et enfin quelques outils gratuits :
- Inno Setup : vous permet de créer un programme d'installation personnalisé
- IsTool : interface graphique pour Inno Setup, permet aussi de convertir un fichier setup.lst créé par l'Assistant d'Empaquetage en fichier iss pour Inno Setup
- Visual Studio Installer 1.1 : créateur de programme d'installation, n'existe pas en français
Visual Basic 3.0
VBRUN300.DLL
Visual Basic 4.0
VB40032.DLL, OLEPRO32.DLL
Visual Basic 5.0
MSVBVM50.DLL, OLEAUT32.DLL, OLEPRO32.DLL, STDOLE2.TLB, ASYCFILT.DLL, COMCAT.DLL
Visual Basic 6.0
MSVBVM60.DLL, OLEAUT32.DLL, OLEPRO32.DLL, STDOLE2.TLB, ASYCFILT.DLL, COMCAT.DLL
Les versions des fichiers distribués dans les différents Service Packs de chaque produit sont souvent différentes de celles livrées dans la version d'origine.
Ces fichiers constituent le runtime Visual Basic de chaque version. Mais dans votre programme d'installation il faut ajouter les éventuels ActiveX et références que vous avez inclus dans votre projet. Si vous utilisez ADO, il faut inclure MDAC.
Un ActiveX doit figurer dans la base de registre afin qu'il soit pris en compte par le système et qu'il puisse fonctionner. Ceci est pris en charge par le programme regsvr32.exe qui se trouve dans le répertoire système.
Pour enregistrer un ActiveX :
regsvr32.exe
<
fichier>
Pour l'opération inverse :
regsvr32.exe
/
u <
fichier>
Ce message a lieu si un ou plusieurs fichiers systèmes à mettre à jour sont chargés en mémoire par Windows au démarrage du système. Le fichier étant chargé en mémoire, Windows doit avoir redémarré pour que la version incluse dans votre setup soit chargée à la place de la version actuelle. Pour éviter ce désagrément, regardez quels sont les fichiers présents dans la section [bootstrap files] du fichier setup.lst. Vous pouvez fournir dans votre setup les versions de ces fichiers qui sont livrées avec VB6, plutôt que les mises à jour qui ont été installées sur votre système. En effet, plus les versions que vous fournirez seront récentes, plus les postes clients devant redémarrer lors de l'installation de votre programme seront nombreux. Les versions incluses dans votre setup sont celles qui sont présentes dans votre répertoire système.
Vérifiez aussi dans le fichier setup.lst que le fichier msvcrt.dll n'est pas dans la section [setup1 files] mais [bootstrap files], et déplacez-le dans cette section le cas échéant.
Si vous utilisez l'assistant d'empaquetage et déploiement, ajoutez le fichier Mdac_typ.exe à votre paquetage, et choisissez $(AppPath) pour son répertoire de destination. Lors de l'installation, le setup exécutera Mdac_typ.exe avant d'installer vos fichiers.
Pour pouvoir installer MDAC sous Windows 95 et Windows 98, vous devez d'abord avoir installé respectivement DCOM95 et DCOM98.
Le principe repose sur la création de plusieurs clés dans la base de registres. Il existe deux méthodes : l'utilisation du Windows Script Host Object Model et celle des API Windows.
Avec Wshom.ocx :
Dim
MaCle As
WshShell 'ou As object
Set
MaCle =
New
WshShell 'ou Set MaCle = CreateObject("WScript.Shell")
'nom de votre type de fichier
MaCle.RegWrite
"HKEY_CLASSES_ROOT\Test Ext\"
, "Test Ext"
, "REG_SZ"
'commande a exécuter pour ouvrir les fichiers de ce type
MaCle.RegWrite
"HKEY_CLASSES_ROOT\Test Ext\shell\open\command\"
, "C:\jmarc\FAQ\TestExt.exe %1"
, "REG_SZ"
'icone à utiliser pour représenter les fichiers de ce type, ici la troisième icone contenue dans TestExt.exe
'(la première icone a l'index 0)
MaCle.RegWrite
"HKEY_CLASSES_ROOT\Test Ext\DefaultIcon\"
, "C:\jmarc\FAQ\TestExt.exe,2"
, "REG_SZ"
""
'extension correspondant à ce type de fichier
MaCle.RegWrite
"HKEY_CLASSES_ROOT\.jmr\"
, "Test Ext"
, "REG_SZ"
Avec les anciennes versions de Wshom.ocx, la classe WshShell s'appelle IWshShell_Class.
Avec les API :
Private
Declare
Function
RegCreateKey Lib
"advapi32.dll"
Alias "RegCreateKeyA"
_
(
ByVal
hKey As
Long
, ByVal
lpSubKey As
String
, _
phkResult As
Long
) As
Long
Private
Declare
Function
RegSetValue Lib
"advapi32.dll"
Alias "RegSetValueA"
_
(
ByVal
hKey As
Long
, ByVal
lpSubKey As
String
, _
ByVal
dwType As
Long
, ByVal
lpData As
String
, _
ByVal
cbData As
Long
) As
Long
Private
Const
HKEY_CLASSES_ROOT =
&
H80000000
Private
Const
MAX_PATH =
255
Private
Const
REG_SZ =
1
Private
Sub
cmdAssocExt_Click
(
)
Dim
MaCle As
Long
Call
RegCreateKey
(
HKEY_CLASSES_ROOT, "Test Ext"
, MaCle)
Call
RegSetValue&(
MaCle, ""
, REG_SZ, "Test Ext"
, 0
&
)
Call
RegSetValue&(
MaCle, "shell\open\command"
, REG_SZ, "C:\jmarc\FAQ\TestExt.exe %1"
, MAX_PATH)
Call
RegSetValue&(
MaCle, "DefaultIcon"
, REG_SZ, "C:\jmarc\FAQ\TestExt.exe,2"
, MAX_PATH)
Call
RegCreateKey&(
HKEY_CLASSES_ROOT, ".jmr"
, MaCle)
Call
RegSetValue&(
MaCle, ""
, REG_SZ, "Test Ext"
, 0
&
)
End
Sub
Dans les deux cas, tout fichier ayant une extension ".jmr" sera ouvert avec le programme TestExt.exe.
Un autre exemple de programmer ces actions :
Private
Declare
Sub
SHChangeNotify Lib
"shell32.dll"
(
_
ByVal
wEventId As
Long
, _
ByVal
uFlags As
Long
, _
dwItem1 As
Any, _
dwItem2 As
Any)
Private
Const
SHCNE_ASSOCCHANGED =
&
H8000000
Private
Const
SHCNF_IDLIST =
&
H0&
Private
Function
Associer
(
AdApp As
String
, AdIcon As
String
, Extention As
Variant
, NomDuFichier As
String
) As
Boolean
On
Error
GoTo
F
Set
WshShell =
CreateObject
(
"Wscript.Shell"
)
For
v =
LBound
(
Extention, 1
) To
UBound
(
Extention, 1
)
WshShell.RegWrite
"HKEY_CLASSES_ROOT\."
&
Extention
(
v) &
"\"
, NomDuFichier, "REG_SZ"
Next
v
AdSp =
"HKEY_CLASSES_ROOT\"
&
NomDuFichier &
"\"
WshShell.RegWrite
AdSp, "Khorne File Crypted"
, "REG_SZ"
WshShell.RegWrite
AdSp &
"DefaultIcon\"
, AdIcon, "REG_SZ"
WshShell.RegWrite
AdSp &
"Shell\open\command\"
, Chr
(
34
) &
AdApp &
Chr
(
34
) &
" %1"
, "REG_SZ"
SHChangeNotify SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0
, 0
Associer =
True
F
:
End
Function
Private
Sub
Form_Load
(
)
Insérer
End
Sub
Sub
Insérer
(
)
ExtentionAMettreEnRelation =
Array
(
"kh1"
, "kh2"
, "kh4"
)
CheminDeLAppli$ =
"d:\sp\Khorne.exe"
CheminDeLicone$ =
"d:\sp\Khorne.ico"
NomDuGenreDeFichier$ =
"Image Cryptée Spécifique"
If
Associer
(
CheminDeLAppli$, CheminDeLicone$, ExtentionAMettreEnRelation, NomDuGenreDeFichier$) Then
MsgBox
"Changement réussi."
, vbInformation
, "Super ça a marché!!!"
Else
If
(
MsgBox
(
"Ca n'a pas marché car l'un des paramétres insérés est mauvais."
, vbCritical
+
vbYesNo
, "Erreur"
) =
vbYes
) Then
Insérer
End
If
End
Sub