Les meilleures sources Access
Les meilleures sources AccessConsultez toutes les sources
Nombre d'auteurs : 44, nombre de sources : 147, création le 19 mars 2013
- Connecter et déconnecter un lecteur réseau
- Lancer un Ping
- Ouvrir une page Web à l'aide de FireFox
- Récupérer l'adresse MAC de la machine en cours (solution 1)
- Récupérer l'adresse MAC de la machine en cours (solution 2)
- Récupérer le chemin UNC d'un fichier
- Récupérer le code HTML d'une page Web à l'aide de l'API windows
- Récupérer le code HTML d'une page Web à l'aide de l'API windows (2ème méthode)
- Récuperer le code HTML d'une page Web en utilisant la référence Microsoft XML
- Tester la présence d'un PC sur le réseau
- Récupérer l'adresse IP de la connexion internet
Versions : Toutes
Le module suivant permet de connecter et déconnecter un lecteur réseau. La fonction ConnecterLecteur reçoit comme paramètres :
- strChemin : Chemin réseau du lecteur ("\\monpc\NomPartage")
- strLettre : Lettre à affecter au lecteur ("z:")
- strUtilisateur : Facultatif. Nom de l'utilisateur.
- strMotDePasse : Facultatif. Mot de passe de l'utilisateur.
La fonction DeconnecterLecteur reçoit comme paramètres :
- strLettre : Lettre du lecteur à déconnecter ("z:").
- bolForce : Facultatif (par défaut : False) . Si la valeur de ce paramètre est égale à True, la déconnexion sera forcée même si un fichier est ouvert.
Les fonctions retournent True en cas de succès, False en cas d'échec.
Code du module :
Option
Compare Database
'Déclaration de la constante définissant un lecteur reseau
Private
Const
RESOURCETYPE_DISK As
Long
=
&
H1&
'Déclaration des fonctions de l'api windows
Private
Declare
Function
WNetAddConnection2 Lib
"mpr.dll"
Alias _
"WNetAddConnection2A"
(
lpNetResource As
NETRESOURCE, _
ByVal
lpPassword As
String
, ByVal
lpUserName As
String
, _
ByVal
dwFlags As
Long
) As
Long
Private
Declare
Function
WNetCancelConnection Lib
"mpr.dll"
Alias _
"WNetCancelConnectionA"
(
ByVal
lpszName As
String
, _
ByVal
bForce As
Long
) As
Long
'Déclaration du type NetResource (nécessaire pour la fonction WnetAddConnection)
Private
Type
NETRESOURCE
dwScope As
Long
dwType As
Long
dwDisplayType As
Long
dwUsage As
Long
lpLocalName As
String
lpRemoteName As
String
lpComment As
String
lpProvider As
String
End
Type
Public
Function
ConnecterLecteur
(
strChemin As
String
, strLettre As
String
, _
Optional
strUtilisateur As
String
, Optional
strMotDePasse As
String
) As
Boolean
Dim
RessourceReseau As
NETRESOURCE
'Déclare et paramètre la ressource réseau
With
RessourceReseau
.lpRemoteName
=
strChemin
.lpLocalName
=
strLettre
.dwType
=
RESOURCETYPE_DISK
End
With
'Tente la connexion et retourne vrai en cas de succès
ConnecterLecteur =
WNetAddConnection2
(
RessourceReseau, strMotDePasse, strUtilisateur, 0
) =
0
End
Function
Public
Function
DeconnecterLecteur
(
strLettre As
String
, _
Optional
bolForce As
Boolean
=
False
) As
Boolean
'Deconnecte et retourne la réponse
DeconnecterLecteurReseau =
WNetCancelConnection
(
strLettre, IIf
(
bolForce, 1
, 0
)) =
0
End
Function
Exemple de connexion :
Sub
test
(
)
ConnecterLecteur "\\Secretariat01\DonneesPartagees"
, "z:"
, "secretaire"
, "secè[@po1"
End
Sub
Exemple de déconnexion :
Sub
test
(
)
DeconnecterLecteur "z:"
End
Sub
Version : Access 97 et supérieures
Cet exemple de code permet de pinger une machine du réseau et d'afficher les informations retournées.
Dans un module, placez le code suivant :
Option
Compare Database
Option
Explicit
'definition des constantes
Private
Const
IP_STATUS_BASE As
Long
=
11000
Private
Const
IP_SUCCESS As
Long
=
0
Private
Const
IP_BUF_TOO_SMALL As
Long
=
(
11000
+
1
)
Private
Const
IP_DEST_NET_UNREACHABLE As
Long
=
(
11000
+
2
)
Private
Const
IP_DEST_HOST_UNREACHABLE As
Long
=
(
11000
+
3
)
Private
Const
IP_DEST_PROT_UNREACHABLE As
Long
=
(
11000
+
4
)
Private
Const
IP_DEST_PORT_UNREACHABLE As
Long
=
(
11000
+
5
)
Private
Const
IP_NO_RESOURCES As
Long
=
(
11000
+
6
)
Private
Const
IP_BAD_OPTION As
Long
=
(
11000
+
7
)
Private
Const
IP_HW_ERROR As
Long
=
(
11000
+
8
)
Private
Const
IP_PACKET_TOO_BIG As
Long
=
(
11000
+
9
)
Private
Const
IP_REQ_TIMED_OUT As
Long
=
(
11000
+
10
)
Private
Const
IP_BAD_REQ As
Long
=
(
11000
+
11
)
Private
Const
IP_BAD_ROUTE As
Long
=
(
11000
+
12
)
Private
Const
IP_TTL_EXPIRED_TRANSIT As
Long
=
(
11000
+
13
)
Private
Const
IP_TTL_EXPIRED_REASSEM As
Long
=
(
11000
+
14
)
Private
Const
IP_PARAM_PROBLEM As
Long
=
(
11000
+
15
)
Private
Const
IP_SOURCE_QUENCH As
Long
=
(
11000
+
16
)
Private
Const
IP_OPTION_TOO_BIG As
Long
=
(
11000
+
17
)
Private
Const
IP_BAD_DESTINATION As
Long
=
(
11000
+
18
)
Private
Const
IP_ADDR_DELETED As
Long
=
(
11000
+
19
)
Private
Const
IP_SPEC_MTU_CHANGE As
Long
=
(
11000
+
20
)
Private
Const
IP_MTU_CHANGE As
Long
=
(
11000
+
21
)
Private
Const
IP_UNLOAD As
Long
=
(
11000
+
22
)
Private
Const
IP_ADDR_ADDED As
Long
=
(
11000
+
23
)
Private
Const
IP_GENERAL_FAILURE As
Long
=
(
11000
+
50
)
Private
Const
MAX_IP_STATUS As
Long
=
(
11000
+
50
)
Private
Const
IP_PENDING As
Long
=
(
11000
+
255
)
Private
Const
PING_TIMEOUT As
Long
=
500
Private
Const
WS_VERSION_REQD As
Long
=
&
H101
Private
Const
MIN_SOCKETS_REQD As
Long
=
1
Private
Const
SOCKET_ERROR As
Long
=
-
1
Private
Const
INADDR_NONE As
Long
=
&
HFFFFFFFF
Private
Const
MAX_WSADescription As
Long
=
256
Private
Const
MAX_WSASYSStatus As
Long
=
128
'Type de données Winsock
Private
Type
WSADATA
wVersion As
Integer
wHighVersion As
Integer
szDescription
(
0
To
MAX_WSADescription) As
Byte
szSystemStatus
(
0
To
MAX_WSASYSStatus) As
Byte
wMaxSockets As
Long
wMaxUDPDG As
Long
dwVendorInfo As
Long
End
Type
'type d'options ICMP
Private
Type
ICMP_OPTIONS
Ttl As
Byte 'Time to live
Tos As
Byte
Flags As
Byte 'options
OptionsSize As
Byte
OptionsData As
Long
End
Type
'Packet de reponse ICMP
Public
Type
ICMP_ECHO_REPLY
Address As
Long
status As
Long
RoundTripTime As
Long
DataSize As
Long
'Reserved As Integer --> prévu mais pas encore implementé???
DataPointer As
Long
Options As
ICMP_OPTIONS
Data As
String
*
250
End
Type
'Type adresse
Private
Type
HOSTENT
hName As
Long
'nom
hAliases As
Long
'alias
hAddrType As
Integer
'type adresse
hLen As
Integer
'longueur --> IP6 supporté???
hAddrList As
Long
End
Type
'GetHostByName --> cette fonction va nous permettre de
'résoudre le nom d'hote en adresse IP
Private
Declare
Function
gethostbyname Lib
"wsock32"
_
(
ByVal
hostname As
String
) As
Long
'Fonction de copie memoire de la librairie Kernel
Private
Declare
Sub
CopyMemory Lib
"kernel32"
_
Alias "RtlMoveMemory"
_
(
xDest As
Any, _
xSource As
Any, _
ByVal
nbytes As
Long
)
'fonction longueur String du Kernel
Private
Declare
Function
lstrlenA Lib
"kernel32"
_
(
lpString As
Any) As
Long
'demarrage du Winsock
Private
Declare
Function
WSAStartup Lib
"wsock32"
_
(
ByVal
wVersionRequired As
Long
, _
lpWSADATA As
WSADATA) As
Long
'fonction de nettoyage du protocole Winsock pour eviter les conflits possibles
Private
Declare
Function
WSACleanup Lib
"wsock32"
(
) As
Long
Private
Declare
Function
IcmpCreateFile Lib
"icmp.dll"
(
) As
Long
'fermeture du handle ICMP
Private
Declare
Function
IcmpCloseHandle Lib
"icmp.dll"
_
(
ByVal
IcmpHandle As
Long
) As
Long
'envoi du packet echo
Private
Declare
Function
IcmpSendEcho Lib
"icmp.dll"
_
(
ByVal
IcmpHandle As
Long
, _
ByVal
DestinationAddress As
Long
, _
ByVal
RequestData As
String
, _
ByVal
RequestSize As
Long
, _
ByVal
RequestOptions As
Long
, _
ReplyBuffer As
ICMP_ECHO_REPLY, _
ByVal
ReplySize As
Long
, _
ByVal
Timeout As
Long
) As
Long
'Fonction permettant la conversion en representation longue de l'Adresse IP
Private
Declare
Function
inet_addr Lib
"wsock32"
_
(
ByVal
s As
String
) As
Long
'Fonction de Ping
Public
Function
Ping
(
sAddress As
String
, _
sDataToSend As
String
, _
ECHO As
ICMP_ECHO_REPLY) As
Long
'Si le ping réussit, le resultat va contenir les données suivantes:
'.RoundTripTime = temps d'aller-retour en millisecondes
'.Data = données retournées
'(les memes qu'on a envoyé en principe) terminé par Null
'.Address = adresse IP qui a veritablement repondu (alias possibles)
'.DataSize = sizeOf(.data)
'.Status = 0 si le ping a réussi
'Si le ping echoue le .ping contiendra le code d'erreur
Dim
hPort As
Long
Dim
dwAddress As
Long
'conversion de l'adresse au format quad long
dwAddress =
inet_addr
(
sAddress)
'si dwAdresse est invalide, la constante INADDR_NONE est retournée
If
dwAddress <>
INADDR_NONE Then
'ouverture d'un port ICMP
hPort =
IcmpCreateFile
(
)
'et si ca marche, on lance l'echo.
If
hPort Then
Call
IcmpSendEcho
(
hPort, _
dwAddress, _
sDataToSend, _
Len
(
sDataToSend), _
0
, _
ECHO, _
Len
(
ECHO), _
PING_TIMEOUT)
'on recupere le statut pour voir si on a réussi
Ping =
ECHO.status
'close the port handle
Call
IcmpCloseHandle
(
hPort)
End
If
'se rapportant au "If hPort"
Else
:
'l'adresse a été mal specifiée
Ping =
INADDR_NONE
End
If
'se rapportant au If dwAddress <> INADDR_NONE
End
Function
'cette fonction va nous permettre de determiner la réussite ou non du ping,
'et le cas écheant de trouver l'erreur...
Public
Function
GetStatusCode
(
status As
Long
) As
String
Dim
msg As
String
Select
Case
status
Case
IP_SUCCESS: msg =
"ip success"
Case
INADDR_NONE: msg =
"inet_addr: bad IP format"
Case
IP_BUF_TOO_SMALL: msg =
"ip buf too_small"
Case
IP_DEST_NET_UNREACHABLE: msg =
"ip dest net unreachable"
Case
IP_DEST_HOST_UNREACHABLE: msg =
"ip dest host unreachable"
Case
IP_DEST_PROT_UNREACHABLE: msg =
"ip dest prot unreachable"
Case
IP_DEST_PORT_UNREACHABLE: msg =
"ip dest port unreachable"
Case
IP_NO_RESOURCES: msg =
"ip no resources"
Case
IP_BAD_OPTION: msg =
"ip bad option"
Case
IP_HW_ERROR: msg =
"ip hw_error"
Case
IP_PACKET_TOO_BIG: msg =
"ip packet too_big"
Case
IP_REQ_TIMED_OUT: msg =
"ip req timed out"
Case
IP_BAD_REQ: msg =
"ip bad req"
Case
IP_BAD_ROUTE: msg =
"ip bad route"
Case
IP_TTL_EXPIRED_TRANSIT: msg =
"ip ttl expired transit"
Case
IP_TTL_EXPIRED_REASSEM: msg =
"ip ttl expired reassem"
Case
IP_PARAM_PROBLEM: msg =
"ip param_problem"
Case
IP_SOURCE_QUENCH: msg =
"ip source quench"
Case
IP_OPTION_TOO_BIG: msg =
"ip option too_big"
Case
IP_BAD_DESTINATION: msg =
"ip bad destination"
Case
IP_ADDR_DELETED: msg =
"ip addr deleted"
Case
IP_SPEC_MTU_CHANGE: msg =
"ip spec mtu change"
Case
IP_MTU_CHANGE: msg =
"ip mtu_change"
Case
IP_UNLOAD: msg =
"ip unload"
Case
IP_ADDR_ADDED: msg =
"ip addr added"
Case
IP_GENERAL_FAILURE: msg =
"ip general failure"
Case
IP_PENDING: msg =
"ip pending"
Case
PING_TIMEOUT: msg =
"ping timeout"
Case
Else
: msg =
"unknown msg returned"
End
Select
GetStatusCode =
CStr
(
status) &
" [ "
&
msg &
" ]"
End
Function
'conversion nom d'hote --> adresse IP
Public
Function
GetIPFromHostName
(
ByVal
sHostName As
String
) As
String
Dim
nbytes As
Long
Dim
ptrHosent As
Long
'pointeur vers la structure "adresse hote"
Dim
ptrName As
Long
'pointeur vers le Nom d'hote
Dim
ptrAddress As
Long
'adresse du pointeur
Dim
ptrIPAddress As
Long
'pointeur vers l'adresse IP
Dim
sAddress As
String
sAddress =
Space
$(
4
)
ptrHosent =
gethostbyname
(
sHostName &
vbNullChar
)
If
ptrHosent <>
0
Then
'on assigne l'adresse et l'offset du pointeur
'ptrName est le nom officiel de l'hote
ptrName =
ptrHosent
'liste des adresses de l'hote terminée par un Null
'l'adresse est à 12 octets du demarrage...
ptrAddress =
ptrHosent +
12
'on recupere l'adresse IP
CopyMemory ptrName, ByVal
ptrName, 4
CopyMemory ptrAddress, ByVal
ptrAddress, 4
CopyMemory ptrIPAddress, ByVal
ptrAddress, 4
CopyMemory ByVal
sAddress, ByVal
ptrIPAddress, 4
GetIPFromHostName =
IPToText
(
sAddress)
End
If
End
Function
'fonction permettant de convertir une IP en txt
Public
Function
IPToText
(
ByVal
IPAddress As
String
) As
String
IPToText =
CStr
(
Asc
(
IPAddress)) &
"."
&
_
CStr
(
Asc
(
Mid
$(
IPAddress, 2
, 1
))) &
"."
&
_
CStr
(
Asc
(
Mid
$(
IPAddress, 3
, 1
))) &
"."
&
_
CStr
(
Asc
(
Mid
$(
IPAddress, 4
, 1
)))
End
Function
'Convertit une IP binaire en texte
Public
Function
ConvertIp
(
Ip As
Long
)
Dim
i As
Integer
Dim
strTemp As
String
strTemp =
Format
(
Hex
(
Ip), "00000000"
)
For
i =
7
To
1
Step
-
2
ConvertIp =
ConvertIp &
ConvertHexToDec
(
Mid
(
strTemp, i, 2
)) &
"."
Next
i
ConvertIp =
Left
(
ConvertIp, Len
(
ConvertIp) -
1
)
End
Function
Private
Function
ConvertHexToDec
(
N As
String
) As
String
ConvertHexToDec =
Format
(
CLng
(
"&H"
&
N), "000"
)
End
Function
'routine de nettoyage du socket
Public
Sub
SocketsCleanup
(
)
If
WSACleanup
(
) <>
0
Then
MsgBox
"Erreur lors du nettoyage du socket."
, vbCritical
End
If
End
Sub
'Procedure d'initialisation du socket
Public
Function
SocketsInitialize
(
) As
Boolean
Dim
WSAD As
WSADATA
SocketsInitialize =
WSAStartup
(
WS_VERSION_REQD, WSAD) =
IP_SUCCESS
End
Function
Ensuite, vous pouvez créer une interface ressemblant à ceci :
Il suffit alors de placer le code suivant dans l'évènement Clic du bouton.
Dim
ECHO As
ICMP_ECHO_REPLY
Dim
pos As
Long
Dim
success As
Long
Dim
sIPAddress As
String
If
Nz
(
txtHote, ""
) =
""
And
Nz
(
txtIPSend, ""
) =
""
Then
MsgBox
"Veuillez spécifié une destination"
Else
If
SocketsInitialize
(
) Then
'Si le nom d'hote est spécifié,
If
Nz
(
txtHote, ""
) <>
""
Then
'convertit le nom d'hote en adresse IP
sIPAddress =
GetIPFromHostName
(
txtHote)
Else
sIPAddress =
txtIPSend
End
If
'lance le ping en envoyant la chaine sépcifiée
'dans la zone de texte txtDataSend
success =
Ping
(
sIPAddress, Nz
(
txtDataSend, vbNullString
), ECHO)
'Affiche le résultat
txtResult =
GetStatusCode
(
success)
txtIPReceive =
ConvertIp
(
ECHO.Address
)
txtTime =
ECHO.RoundTripTime
&
" ms"
'Affiche la réponse reçue en retirant le caractère de
'fin de chaine
If
Left
$(
ECHO.Data
, 1
) <>
Chr
$(
0
) Then
pos =
InStr
(
ECHO.Data
, Chr
$(
0
))
txtDataReceive =
Left
$(
ECHO.Data
, pos -
1
)
End
If
txtMemory =
ECHO.DataPointer
'Libère le socket
SocketsCleanup
Else
MsgBox
"Les fonctionnalités de ping sont indisponibles"
End
If
End
If
Afin de vider les zones de texte à l'ouverture, il est possible d'utiliser une boucle à l'ouverture du formulaire.
Dim
ctltxt As
Control
For
Each
ctltxt In
Me.Controls
If
TypeOf ctltxt Is
TextBox And
ctltxt.Name
<>
"txtHote"
Then
_
ctltxt =
""
Next
N'hésitez pas à télecharger le zip de démonstration et à consulter ce site pour de plus amples informations : https://grafikm.developpez.com/vbreseau.
Versions : Toutes
La fonction ShellExecute de l'API Windows permet d'ouvrir le navigateur web défini par défaut. En revanche, si Firefox n'est pas le navigateur par défaut, le seul moyen de le lancer est d'éxecuter le fichier FireFox.exe. Afin de trouver le chemin de cet exécutable, il est nécessaire d'analyser l'entrée de Firefox dans la base des registres.
Code du module :
Private
Function
Lire
(
RegAddress As
String
)
On
Error
Resume
Next
Dim
WshShell As
Object
Set
WshShell =
CreateObject
(
"Wscript.Shell"
)
Lire =
WshShell.RegRead
(
RegAddress)
End
Function
Function
GetFireFoxPath
(
)
Dim
strVersion As
String
' Cherche la version actuelle de FireFox
strVersion =
Lire
(
"HKEY_CURRENT_USER\Software\Mozilla\Mozilla Firefox\CurrentVersion"
)
strVersion =
Left
(
strVersion, InStr
(
strVersion, " "
) -
1
)
' Va lire la clé correspondant à la version actuelle
GetFireFoxPath =
Lire
(
"HKEY_CURRENT_USER\Software\Mozilla\Mozilla Firefox "
&
_
strVersion &
"\bin\PathToExe"
)
End
Function
Exemple d'utilisation :
Sub
ouvrir
(
)
Shell GetFireFoxPath &
" "
&
Chr
(
34
) &
"http://www.developpez.com"
&
Chr
(
34
)
End
Sub
Versions : 97 et supérieures
Dim
objWMIService As
Object
Dim
colAdapters As
Object
Dim
strComputer As
String
strComputer =
"."
Set
objWMIService =
GetObject
(
"winmgmts:\\"
&
strComputer &
"\root\cimv2"
)
Set
colAdapters =
_
objWMIService.ExecQuery
(
"SELECT * FROM Win32_NetworkAdapterConfiguration"
&
_
"WHERE IPEnabled =True"
)
n =
1
For
Each
objAdapter In
colAdapters
debug.print
objAdapter.MACAddress
If
Not
IsNull
(
objAdapter.IPAddress
) Then
For
i =
0
To
UBound
(
objAdapter.IPAddress
)
debug.print
objAdapter.IPAddress
(
i)
Next
End
If
n =
n +
1
Next
Versions : 2000 et supérieures
Dans un module de classe MacAddress
Option
Compare Database
Option
Explicit
Public
IPAdresses As
New
Collection
Public
MacAddress As
String
Dans un module de classe MacAddresses
Option
Compare Database
Option
Explicit
Private
mstrComputerName As
String
'Nom du PC
Private
mcolMacAddresses As
New
Collection 'Liste des MacAdresses
'==============================================================================
'Procédure de recherche
'==============================================================================
Function
Search
(
) As
String
Dim
objWMIService As
Object
Dim
colAdapters As
Object
Dim
objAdapter As
Object
Dim
objMacAddress As
MacAddress
Dim
i As
Long
Dim
s As
String
Set
objWMIService =
GetObject
(
"winmgmts:\\"
&
mstrComputerName &
"\root\cimv2"
)
Set
colAdapters =
_
objWMIService.ExecQuery
(
"SELECT * FROM Win32_NetworkAdapterConfiguration "
&
_
"WHERE IPEnabled =True"
)
For
Each
objAdapter In
colAdapters
Set
objMacAddress =
New
MacAddress
objMacAddress.MacAddress
=
objAdapter.MacAddress
If
Not
IsNull
(
objAdapter.IPAddress
) Then
For
i =
0
To
UBound
(
objAdapter.IPAddress
)
s =
s &
objMacAddress.MacAddress
&
vbTab
&
objAdapter.IPAddress
(
i) &
_
vbCrLf
objMacAddress.IPAdresses.Add
objAdapter.IPAddress
(
i)
Next
End
If
mcolMacAddresses.Add
objMacAddress
Next
Search =
Left
(
s, Len
(
s) -
Len
(
vbCrLf
))
End
Function
'==============================================================================
' Fonctions pour les mac adresses
'==============================================================================
Function
Count
(
) As
Long
Count =
mcolMacAddresses.Count
End
Function
Function
Item
(
index) As
MacAddress
Set
Item =
mcolMacAddresses.Item
(
index)
End
Function
'==============================================================================
'Nom du PC
'==============================================================================
Property
Get
ComputerName
(
) As
String
ComputerName =
mstrComputerName
End
Property
Property
Let
ComputerName
(
NomDuPC As
String
)
mstrComputerName =
NomDuPC
End
Property
'==============================================================================
'Initialisation de la classe
'==============================================================================
Private
Sub
Class_Initialize
(
)
mstrComputerName =
"."
End
Sub
Pour utiliser ces classes (par exemple)
Dim
x As
New
MacAddresses
Dim
nMAC As
Long
Dim
nIP As
Long
Debug.Print
x.Search
For
nMAC =
1
To
x.Count
Debug.Print
x.Item
(
nMAC).MacAddress
For
nIP =
1
To
x.Item
(
nMAC).IPAdresses.Count
Debug.Print
vbTab
&
x.Item
(
nMAC).IPAdresses
(
nIP)
Next
Next
Version : Access 97 et supérieures & Visual Basic
Cet exemple de code permet de retourner le chemin UNC d'un fichier. Microsoft précise en effet :
Si vous souhaitez créer un lien avec un fichier situé sur un réseau local, utilisez un chemin UNC (universal naming convention) (convention d'affectation de noms (UNC) : convention de dénomination de fichiers qui fournit un moyen de situer un fichier quelle que soit la machine où il se trouve. Plutôt que de spécifier une lettre de lecteur et un chemin d'accès, un nom UNC utilise la syntaxe \\serveur\partage\chemin\nom_fichier.), au lieu de la lettre d'identification d'une unité réseau mappée dans l'Explorateur Windows de Microsoft. La lettre de l'unité dépend de la configuration de l'ordinateur, ou elle peut ne pas être définie, alors qu'un chemin UNC, fiable et cohérent, permet à Microsoft Access de localiser la source de données contenant la table liée
Dans un module, placez le code suivant :
Private
Declare
Function
WNetGetConnection Lib
"mpr.dll"
Alias "WNetGetConnectionA"
_
(
ByVal
lpszLocalName As
String
, ByVal
lpszRemoteName As
String
, cbRemoteName As
Long
) As
Long
Public
Function
fnctGetUNCPath
(
ByVal
PathName As
String
) As
String
Const
MAX_UNC_LENGTH As
Integer
=
512
Dim
strUNCPath As
String
Dim
strTempUNCName As
String
Dim
lngReturnErrorCode As
Long
strTempUNCName =
String
(
MAX_UNC_LENGTH, 0
)
lngReturnErrorCode =
WNetGetConnection
(
Left
(
PathName, 2
), strTempUNCName, _
MAX_UNC_LENGTH)
If
lngReturnErrorCode =
0
Then
strTempUNCName =
Trim
(
Left
(
strTempUNCName, InStr
(
strTempUNCName, vbNullChar
) -
1
))
strUNCPath =
strTempUNCName &
Mid
(
PathName, 3
)
End
If
fnctGetUNCPath =
strUNCPath
End
Function
Exemple d'utilisation :
MsgBox
fnctGetUNCPath
(
"U:\Argyronet\OneAnyFile.txt"
)
Il est aussi possible de combiner la fonction GetOpenFileName à celle ci afin d'afficher une boîte de dialogue Windows Ouvrir qui retourne le chemin UNC à la place du chemin courant.
Option
Compare Database
Option
Explicit
Private
Declare
Sub
PathStripPath Lib
"shlwapi.dll"
Alias "PathStripPathA"
_
(
ByVal
pszPath As
String
)
Private
Declare
Function
GetOpenFileName Lib
"comdlg32.dll"
Alias _
"GetOpenFileNameA"
(
pOpenfilename As
OPENFILENAME) As
Long
Private
Declare
Function
WNetGetConnection Lib
"mpr.dll"
Alias "WNetGetConnectionA"
_
(
ByVal
lpszLocalName As
String
, ByVal
lpszRemoteName As
String
, cbRemoteName As
Long
) As
Long
'Structure du fichier
Private
Type
OPENFILENAME
lStructSize As
Long
hwndOwner As
Long
hInstance As
Long
lpstrFilter As
String
lpstrCustomFilter As
String
nMaxCustFilter As
Long
nFilterIndex As
Long
lpstrFile As
String
nMaxFile As
Long
lpstrFileTitle As
String
nMaxFileTitle As
Long
lpstrInitialDir As
String
lpstrTitle As
String
flags As
Long
nFileOffset As
Integer
nFileExtension As
Integer
lpstrDefExt As
String
lCustData As
Long
lpfnHook As
Long
lpTemplateName As
String
End
Type
'Constantes
Private
Const
OFN_READONLY =
&
H1
Private
Const
OFN_OVERWRITEPROMPT =
&
H2
Private
Const
OFN_HIDEREADONLY =
&
H4
Private
Const
OFN_NOCHANGEDIR =
&
H8
Private
Const
OFN_SHOWHELP =
&
H10
Private
Const
OFN_ENABLEHOOK =
&
H20
Private
Const
OFN_ENABLETEMPLATE =
&
H40
Private
Const
OFN_ENABLETEMPLATEHANDLE =
&
H80
Private
Const
OFN_NOVALIDATE =
&
H100
Private
Const
OFN_ALLOWMULTISELECT =
&
H200
Private
Const
OFN_EXTENSIONDIFFERENT =
&
H400
Private
Const
OFN_PATHMUSTEXIST =
&
H800
Private
Const
OFN_FILEMUSTEXIST =
&
H1000
Private
Const
OFN_CREATEPROMPT =
&
H2000
Private
Const
OFN_SHAREAWARE =
&
H4000
Private
Const
OFN_NOREADONLYRETURN =
&
H8000
Private
Const
OFN_NOTESTFILECREATE =
&
H10000
Private
Const
OFN_SHAREFALLTHROUGH =
2
Private
Const
OFN_SHARENOWARN =
1
Private
Const
OFN_SHAREWARN =
0
Public
Function
OuvrirUnFichier
(
Handle As
Long
, _
Titre As
String
, _
TypeRetour As
Byte, _
Optional
TitreFiltre As
String
, _
Optional
TypeFichier As
String
, _
Optional
RepParDefaut As
String
, _
Optional
UNC As
Boolean
=
False
) As
String
'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
'la boîte de dialogue de sélection d'un fichier.
'Explication des paramètres
'Handle = le handle de la fenêtre (Me.Hwnd)
'Titre = Titre de la boîte de dialogue
'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
'1 = Chemin complet + Nom du fichier
'2 = Nom fichier seulement
'TitreFiltre = Titre du filtre
'Exemple: Fichier Access
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'TypeFichier = Extention du fichier (Sans le .)
'Exemple: MDB
'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
'RepParDefaut = Répertoire d'ouverture par defaut
'Exemple: C:\windows\system32
'Si vous laissé l'argument vide, par defaut il se place dans
'le répertoire de votre application
'UNC = Définit le chemin retourné
'Vrai : Chemin UNC \\serveur\partage\dossier\fichier
'Faux : Chemin local Disque\dossier\fichier
Dim
StructFile As
OPENFILENAME
Dim
sFiltre As
String
'Construction du filtre en fonction des arguments spécifiés
If
Len
(
TitreFiltre) >
0
And
Len
(
TypeFichier) >
0
Then
sFiltre =
TitreFiltre &
" ("
&
TypeFichier &
")"
&
Chr
$(
0
) &
_
"*."
&
TypeFichier &
Chr
$(
0
)
End
If
sFiltre =
sFiltre &
"Tous (*.*)"
&
Chr
$(
0
) &
"*.*"
&
Chr
$(
0
)
'Configuration de la boîte de dialogue
With
StructFile
.lStructSize
=
Len
(
StructFile) 'Initialisation de la grosseur de la structure
.hwndOwner
=
Handle 'Identification du handle de la fenêtre
.lpstrFilter
=
sFiltre 'Application du filtre
.lpstrFile
=
String
$(
254
, vbNullChar
) 'Initialisation du fichier '0' x 254
.nMaxFile
=
254
'Taille maximale du fichier
.lpstrFileTitle
=
String
$(
254
, vbNullChar
) 'Initialisation du nom du fichier '0' x 254
.nMaxFileTitle
=
254
'Taille maximale du nom du fichier
.lpstrTitle
=
Titre 'Titre de la boîte de dialogue
.flags
=
OFN_HIDEREADONLY 'Option de la boite de dialogue
If
((
IsNull
(
RepParDefaut)) Or
(
RepParDefaut =
""
)) Then
RepParDefaut =
CurrentDb.Name
PathStripPath (
RepParDefaut)
.lpstrInitialDir
=
Left
(
CurrentDb.Name
, Len
(
CurrentDb.Name
) -
_
Len
(
Mid
$(
RepParDefaut, 1
, InStr
(
1
, RepParDefaut, vbNullChar
) -
1
)))
Else
: .lpstrInitialDir
=
RepParDefaut
End
If
End
With
If
(
GetOpenFileName
(
StructFile)) Then
'Si un fichier est sélectionné
Select
Case
TypeRetour
Case
1
OuvrirUnFichier =
Trim
$(
Left
(
StructFile.lpstrFile
, _
InStr
(
1
, StructFile.lpstrFile
, vbNullChar
) -
1
))
If
UNC Then
OuvrirUnFichier =
fnctGetUNCPath
(
OuvrirUnFichier)
Case
2
: OuvrirUnFichier =
Trim
$(
Left
(
StructFile.lpstrFileTitle
, _
InStr
(
1
, StructFile.lpstrFileTitle
, vbNullChar
) -
1
))
End
Select
End
If
End
Function
Private
Function
fnctGetUNCPath
(
ByVal
PathName As
String
) As
String
Const
MAX_UNC_LENGTH As
Integer
=
512
Dim
strUNCPath As
String
Dim
strTempUNCName As
String
Dim
lngReturnErrorCode As
Long
strTempUNCName =
String
(
MAX_UNC_LENGTH, 0
)
lngReturnErrorCode =
WNetGetConnection
(
Left
(
PathName, 2
), strTempUNCName, MAX_UNC_LENGTH)
If
lngReturnErrorCode =
0
Then
strTempUNCName =
Trim
(
Left
(
strTempUNCName, InStr
(
strTempUNCName, vbNullChar
) -
1
))
strUNCPath =
strTempUNCName &
Mid
(
PathName, 3
)
End
If
fnctGetUNCPath =
strUNCPath
End
Function
Exemple d'utilisation :
MsgBox
OuvrirUnFichier
(
0
, "Choisir un fichier"
, 1
, , , , True
)
Versions : Toutes
Ce code utilise les API wininet pour charger en mémoire une ressource du protocole HTTP.
Le code ainsi récupérer est écrit dans un fichier temporaire par bloc de 4096 octets. L'avantage de cette méthode, comparée à celle utilisant la référence msxml, et de ne pas être limitée par la taille du code HTML reçu. En effet, la méthode utilisant msxml retourne le résultat dans une variable de type string dont la taille est limitée à 64 Ko.
Code du module :
Option
Compare Database
Option
Explicit
'Fonction pour ouvrir une connexion Internet :
Public
Declare
Function
InternetOpen Lib
"wininet.dll"
Alias "InternetOpenA"
_
(
ByVal
lpszAgent As
String
, ByVal
dwAccessType As
Long
, ByVal
lpszProxyName As
String
, _
ByVal
lpszProxyBypass As
String
, ByVal
dwFlags As
Long
) As
Long
'Fonction pour fermer le handle de la connexion :
Public
Declare
Function
InternetCloseHandle Lib
"wininet.dll"
(
ByVal
hInet As
Long
) As
Integer
'Fonction pour ouvrir une adresse URL :
Public
Declare
Function
InternetOpenUrl Lib
"wininet.dll"
Alias "InternetOpenUrlA"
_
(
ByVal
hInternetSession As
Long
, ByVal
lpszUrl As
String
, ByVal
lpszHeaders As
String
, _
ByVal
dwHeadersLength As
Long
, ByVal
dwFlags As
Long
, ByVal
dwContext As
Long
) As
Long
'Fonction pour lire les données d'une URL :
Public
Declare
Function
InternetReadFile Lib
"wininet.dll"
_
(
ByVal
hFile As
Long
, ByVal
lpBuffer As
String
, ByVal
dwNumberOfBytesToRead As
Long
, _
lNumberOfBytesRead As
Long
) As
Integer
Public
Const
INTERNET_OPEN_TYPE_PRECONFIG =
0
' utiliser info de config de la base de registre
Public
Const
INTERNET_FLAG_EXISITING_CONNECT =
&
H20000000
Public
Const
INTERNET_FLAG_RELOAD =
&
H80000000
Private
Declare
Function
GetTickCount Lib
"kernel32"
(
) As
Long
Private
total As
Long
Private
Nb As
Long
Dim
hSession As
Long
Public
Sub
openInter
(
)
hSession =
InternetOpen
(
"MonApp"
, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString
, vbNullString
, 0
)
total =
0
Nb =
0
End
Sub
Public
Sub
closeInter
(
)
InternetCloseHandle (
hSession)
End
Sub
Public
Sub
GetWeblog
(
ByVal
url As
String
, ByVal
strFic As
String
)
' pointeur du lien lien
Dim
hUrlFile As
Long
Dim
bBoucle As
Boolean
' bloc de lecture par buffer 4 096 caractères
Dim
sReadBuf As
String
*
4096
Dim
OctetsLus As
Long
' pointeurs des fichiers
Dim
localFile As
Long
' chronométrage du temps d'exécution
Dim
t0 As
Single
, t1 As
Single
t0 =
GetTickCount
(
)
' ouverture des ressources de navigation internet
openInter
' désignation d'un pointeur de fichier libre
localFile =
FreeFile
' si le fichier existe déjà on l'efface
If
Len
(
Dir
(
strFic)) >
0
Then
Kill strFic
' ouverture du fichier en mode binaire
Open strFic For
Binary As
#localFile
' ouverture de l'url
hUrlFile =
InternetOpenUrl
(
hSession, url, vbNullString
, 0
, INTERNET_FLAG_RELOAD, 0
)
bBoucle =
True
While
bBoucle
sReadBuf =
""
' lecture par bloc de 4096 caractères
bBoucle =
InternetReadFile
(
hUrlFile, sReadBuf, 4096
&
, OctetsLus)
' écriture par bloc dans le fichier local
Put #localFile, , Left
(
sReadBuf, OctetsLus)
If
OctetsLus =
0
Then
bBoucle =
False
DoEvents
Wend
' fermeture du fichier local
Close #localFile
' fermeture des ressources de navigation
closeInter
t1 =
GetTickCount
(
)
Debug.Print
"téléchargement du xml : "
; Format
((
t1 -
t0) /
1000
, "0.000"
) &
" s"
' parsing XML du fichier nous verrons ce point plus tard dans l'article
xmlParser strFic
End
Sub
Exemple d'utilisation :
GetWeblog "http://www.developpez.com"
, "d:\fichierTemp.txt"
La fenêtre d'éxecution affiche alors le temps mis pour télecharger le fichier et vous pouvez ensuite l'analyser à l'aide des fonctions de traitement des fichiers texte.
Liens utiles :
Récuperer le code HTML d'une page Web en utilisant la référence Microsoft XML
Manipuler les fichiers textes
Repousser les limites d'Access - récupérer un fil RSS
Versions : toutes
Voici une autre manière de récupérer le code HTML en utilisant les API windows et en particulier wininet.dll.
Il faut aussi une référence VBA à Microsoft VBScript Regular Expression 5.5.
Copier/Coller le code dans un nouveau module et utiliser la procédure Lecture_fichierHTTP.
La procédure a besoin d'une URL sous la forme http://www.server.fr/xxxxxxxx
ou www.server.fr/xxxxxxxx et d'un nom de fichier local (ex : D:\pageHTML.txt).
Code à placer dans un module :
' ----------------------------------------------------------------------
' 1 Déclaration Functions de l'API Windows Fichiers
' ----------------------------------------------------------------------
' -----------------------
' 1.a Les Constantes
' -----------------------
Const
MAX_PATH =
260
Const
INVALID_HANDLE_VALUE =
-
1
' File Attributes
Const
FILE_ATTRIBUTE_READONLY =
&
H1 ' 1
Const
FILE_ATTRIBUTE_HIDDEN =
&
H2 ' 2
Const
FILE_ATTRIBUTE_SYSTEM =
&
H4 ' 4
Const
FILE_ATTRIBUTE_DIRECTORY =
&
H10 ' 16
Const
FILE_ATTRIBUTE_ARCHIVE =
&
H20 ' 32
Const
FILE_ATTRIBUTE_ENCRYPTED =
&
H40 ' 64
Const
FILE_ATTRIBUTE_NORMAL =
&
H80 ' 128
Const
FILE_ATTRIBUTE_TEMPORARY =
&
H100 ' 256
Const
FILE_ATTRIBUTE_SPARSE_FILE =
&
H200 ' 512
Const
FILE_ATTRIBUTE_REPARSE_POINT =
&
H400 ' 1024
Const
FILE_ATTRIBUTE_COMPRESSED =
&
H800 ' 2048
Const
FILE_ATTRIBUTE_OFFLINE =
&
H1000 ' 4096
' File Creation flags
Const
CREATE_NEW =
1
Const
CREATE_ALWAYS =
2
Const
OPEN_EXISTING =
3
Const
OPEN_ALWAYS =
4
Const
TRUNCATE_EXISTING =
5
' FormatMessage
Const
FORMAT_MESSAGE_FROM_SYSTEM As
Long
=
&
H1000
Private
Declare
Function
GetLastError Lib
"kernel32.dll"
(
) As
Long
Private
Declare
Function
FormatMessage Lib
"kernel32.dll"
Alias "FormatMessageA"
(
_
ByVal
dwFlags As
Long
, ByVal
lpSource As
Long
, _
ByVal
dwMessageId As
Long
, ByVal
dwLanguageId As
Long
, _
ByVal
lpBuffer As
String
, ByVal
nSize As
Long
, _
ByVal
Arguments As
Long
) As
Long
' -----------------------
' 1.b Les Fonctions
' -----------------------
Private
Declare
Function
OpenFile Lib
"kernel32.dll"
Alias "OpenFileA"
_
(
ByVal
lpFileName As
String
, ByVal
lpReOpenBuff As
Long
, _
ByVal
uStyle) As
Long
Private
Declare
Function
CreateFile Lib
"kernel32.dll"
Alias "CreateFileA"
(
_
ByVal
lpFileName As
String
, ByVal
dwAccess As
Long
, _
ByVal
dwShareMode As
Long
, ByVal
lpSecurityAttr As
Long
, _
ByVal
dwCreationDisposition As
Long
, _
ByVal
dwFlagAndAttr As
Long
, ByVal
hTemplateFile As
Long
) As
Long
Private
Declare
Function
CloseHandle Lib
"kernel32.dll"
(
ByVal
hHandle As
Long
) As
Long
Private
Declare
Function
WriteFile Lib
"kernel32.dll"
(
_
ByVal
hFile As
Long
, ByVal
buffer As
String
, _
ByVal
dwBytesToWrite As
Long
, ByRef
lpdwBytesWritten As
Long
, _
ByVal
lpOverlapped As
Long
) As
Long
' ----------------------------------------------------------------------
' 2 Déclaration Functions de l'API Windows Internet/ftp
' ----------------------------------------------------------------------
' -----------------------
' 2.a Les Constantes
' -----------------------
Const
INTERNET_FLAG_TRANSFER_ASCII =
&
H1 ' 0x00000001
Const
FTP_TRANSFER_TYPE_ASCII =
&
H1 ' 0x00000001
Const
INTERNET_FLAG_TRANSFER_BINARY =
&
H2 ' 0x00000002
Const
FTP_TRANSFER_TYPE_BINARY =
&
H2 ' 0x00000002
Const
GENERIC_READ =
&
H80000000 ' (0x80000000L)
Const
GENERIC_WRITE =
&
H40000000 ' (0x40000000L)
Const
INTERNET_FLAG_RAW_DATA =
&
H40000000 ' FTP/gopher find: receive the item _
'as raw (structured) data
Const
INTERNET_DEFAULT_FTP_PORT =
21
' default for FTP servers
Const
INTERNET_DEFAULT_GOPHER_PORT =
70
' " " gopher "
Const
INTERNET_DEFAULT_HTTP_PORT =
80
' " " HTTP "
Const
INTERNET_DEFAULT_HTTPS_PORT =
443
' " " HTTPS "
Const
INTERNET_DEFAULT_SOCKS_PORT =
1080
' default for SOCKS firewall servers.
' access types for InternetOpen()
Const
INTERNET_OPEN_TYPE_PRECONFIG =
0
' use registry configuration
Const
INTERNET_OPEN_TYPE_DIRECT =
1
' direct to net
Const
INTERNET_OPEN_TYPE_PROXY =
3
' via named proxy
Const
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY =
4
' prevent using java/script/INS
' service types for InternetConnect()
Const
INTERNET_SERVICE_URL =
0
Const
INTERNET_SERVICE_FTP =
1
Const
INTERNET_SERVICE_GOPHER =
2
Const
INTERNET_SERVICE_HTTP =
3
'Query Info
Const
HTTP_QUERY_STATUS_CODE =
19
' Status Code returned by Server
Const
HTTP_QUERY_STATUS_TEXT =
20
'
' -----------------------
' 2.b Les Fonctions
' -----------------------
Private
Declare
Function
InternetCloseHandle Lib
"wininet.dll"
_
(
ByVal
hInet As
Long
) As
Integer
Private
Declare
Function
InternetOpen Lib
"wininet.dll"
Alias "InternetOpenA"
_
(
ByVal
sAgent As
String
, ByVal
lAccessType As
Long
, _
ByVal
sProxyName As
String
, ByVal
sProxyBypass As
String
, _
ByVal
lFlags As
Long
) As
Long
Private
Declare
Function
InternetConnect Lib
"wininet.dll"
Alias "InternetConnectA"
_
(
ByVal
hInternetSession As
Long
, ByVal
sServerName As
String
, _
ByVal
nServerPort As
Integer
, ByVal
sUserName As
String
, _
ByVal
sPassword As
String
, ByVal
lService As
Long
, _
ByVal
lFlags As
Long
, ByVal
lContext As
Long
) As
Long
Private
Declare
Function
HttpOpenRequest Lib
"wininet.dll"
Alias "HttpOpenRequestA"
_
(
ByVal
hconnect As
Long
, ByVal
lpszVerb As
String
, ByVal
lpszObjectName As
String
, _
ByVal
lpszVersion As
String
, ByVal
lpszReferer As
Long
, _
ByVal
lpszAcceptTypes As
Long
, ByVal
dwFlags As
Long
, _
ByVal
dwContext As
Long
) As
Long
Private
Declare
Function
HttpSendRequest Lib
"wininet.dll"
Alias "HttpSendRequestA"
_
(
ByVal
hRequest As
Long
, ByVal
lpszHeaders As
String
, ByVal
dwHdrLength As
Long
, _
ByVal
lpOptional As
String
, ByVal
dwOptionalLength As
Long
) As
Long
' HttpSendRequest sans lpOptional As String.
' à la place on met lpOptional As Long, pour pouvoir passer un pointeur NULL
Private
Declare
Function
HttpSendRequest2 Lib
"wininet.dll"
Alias "HttpSendRequestA"
_
(
ByVal
hRequest As
Long
, ByVal
lpszHeaders As
Long
, ByVal
dwHdrLength As
Long
, _
ByVal
lpOptional As
Long
, ByVal
dwOptionalLength As
Long
) As
Long
Private
Declare
Function
HttpQueryInfo Lib
"wininet.dll"
Alias "HttpQueryInfoA"
_
(
ByVal
hRequest As
Long
, ByVal
dwInfoLevel As
Long
, _
ByVal
lpvBuffer As
String
, ByRef
lpdwBufferLength As
Long
, _
ByRef
lpdwIndex As
Long
) As
Long
Private
Declare
Function
InternetOpenUrl Lib
"wininet.dll"
Alias "InternetOpenUrlA"
_
(
ByVal
hconnect As
Long
, ByVal
lpszUrl As
String
, ByVal
lpszHeaders As
String
, _
ByVal
dwHdrLength As
Long
, ByVal
dwFlags As
Long
, ByVal
dwContext As
Long
) As
Long
Private
Declare
Function
InternetOpenUrl2 Lib
"wininet.dll"
Alias "InternetOpenUrlA"
_
(
ByVal
hconnect As
Long
, ByVal
lpszUrl As
String
, ByVal
lpszHeaders As
Long
, _
ByVal
dwHdrLength As
Long
, ByVal
dwFlags As
Long
, ByVal
dwContext As
Long
) As
Long
Private
Declare
Function
InternetReadFileVBA Lib
"wininet.dll"
Alias "InternetReadFile"
_
(
ByVal
hFile As
Long
, ByVal
lpBuffer As
String
, _
ByVal
dwNbBytesToRead As
Long
, ByRef
lpdwNbBytesRead As
Long
) As
Long
Private
Declare
Function
InternetQueryDataAvailable Lib
"wininet.dll"
_
(
ByVal
hFile As
Long
, ByRef
lpdwNumberOfBytesAvailable As
Long
, _
ByVal
dwFlags As
Long
, dwContext As
Long
) As
Long
' hFile : retourné par InternetOpenUrl ou FtpOpenFile ou HttpOpenRequest ou GopherOpenFile
' ---------------------------------------------------------------------------------
' Lecture fichier http par blocs et HTTPrequest
' - InternetOpen
' - InternetConnect
' - HttpOpenRequest
' - HttpSendRequest
'
' Paramètre 1 : URL http
' Paramètre 2 : Cible (chemin complet + Nom)
' ---------------------------------------------------------------------------------
Sub
Lecture_fichierHTTP
(
httpURL As
String
, strCible As
String
)
' Internet Handles for Internet Session, Internet Connection, HTTP Request
Dim
hInternetSess As
Long
, hIConnect As
Long
, httpReq As
Long
' File Handle (Windows)
Dim
hFile As
Long
' Read/Writte buffer
Const
BUFSIZE =
1024
Dim
buffer As
String
, ErrBuffer As
String
, ErrNum As
Long
Dim
qryBuffer As
String
, qryBufLength As
Long
, qryIndex As
Long
'
Dim
BytesAvailable As
Long
, strSvrResponseCode As
String
Dim
BytesToRead As
Long
, BytesRead As
Long
Dim
BytesToWrite As
Long
, BytesWritten As
Long
Dim
strServer As
String
, strObjPathName As
String
Dim
RemoteFileSize As
Long
, localFileSize As
Long
Dim
oRegEx As
RegExp, oMatches As
MatchCollection, oMatch As
Match
'
Dim
RetVal As
Long
, p As
Long
, strErrMsg As
String
, strHttpErrDesc As
String
' HTTP/1.1 http URL Syntax
' http_URL = "http:" "//" host [ ":" port ] [ abs_path ]
' scheme = "http"
' abs_path = "/" + .....
' Coupe l'URL en deux parties : Serveur et chemin absolu
Set
oRegEx =
New
VBScript_RegExp_55.RegExp
oRegEx.Pattern
=
"^(?:http://){0,1}([^/]*)(/.*)$"
Set
oMatches =
oRegEx.Execute
(
httpURL)
If
oMatches.Count
=
1
Then
Set
oMatch =
oMatches.item
(
0
)
strServer =
oMatch.SubMatches
(
0
) &
vbNullChar
strObjPathName =
oMatch.SubMatches
(
1
) &
vbNullChar
Else
MsgBox
"L'URL http n'est pas correcte"
Exit
Sub
End
If
On
Error
GoTo
ERRH
'Ouvre session internet - OK si valeur renvoyé<>0
hInternetSess =
InternetOpen
(
"MonAppli"
, 0
, vbNullString
, vbNullString
, 0
)
If
hInternetSess =
0
Then
err
.Raise
1001
'Connection au serveur HTTP - OK si valeur renvoyé<>0
hIConnect =
InternetConnect
(
hInternetSess, strServer, _
INTERNET_DEFAULT_HTTP_PORT, vbNullChar
, vbNullChar
, INTERNET_SERVICE_HTTP, 0
, 0
)
If
hIConnect =
0
Then
err
.Raise
1002
' Prépare requête HTTP - OK si valeur renvoyé <>0
httpReq =
HttpOpenRequest
(
hIConnect, "GET"
&
vbNullChar
, strObjPathName, _
"HTTP/1.1"
&
vbNullChar
, 0
, _
0
, 0
, 0
)
If
httpReq =
0
Then
err
.Raise
1003
' Envoie Requête HTTP - OK valeur renvoyée 1
RetVal =
HttpSendRequest2
(
httpReq, 0
, 0
, 0
, 0
)
If
RetVal <>
1
Then
err
.Raise
1004
' Examine Code envoyé par serveur
' "2xx"=succedd ("200"=OK), "3xx" = Redirection, 4xx Client Error ("404" = Non trouvé)
qryBuffer =
String
(
512
, vbNullChar
): qryBufLength =
512
' fonction HttpQueryInfo - OK si valeur renvoyé 1
RetVal =
HttpQueryInfo
(
httpReq, HTTP_QUERY_STATUS_CODE, qryBuffer, qryBufLength, qryIndex)
If
RetVal =
1
Then
strSvrResponseCode =
left
(
qryBuffer, 3
)
Else
err
.Raise
1005
End
If
' Erreur si serveur répond avec 4xx ou 5xx
If
strSvrResponseCode Like "[4,5]??"
Then
err
.Raise
1006
' Nbre d'octets à prêts à lire. (<>Total à lire)
'RetVal = InternetQueryDataAvailable(httpReq, BytesAvailable, 0, 0)
' Ouvre fichier local
hFile =
CreateFile
(
strCible &
vbNullChar
, GENERIC_WRITE, 0
, 0
, _
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
)
If
hFile =
0
Then
err
.Raise
1007
localFileSize =
0
BytesToRead =
BUFSIZE
' Boucle sur fichier distant
buffer =
String
(
BUFSIZE +
1
, vbNullChar
)
Do
RetVal =
InternetReadFileVBA
(
httpReq, buffer, BytesToRead, BytesRead) 'VarPtr(BytesRead)
If
RetVal =
1
Then
BytesToWrite =
BytesRead
Else
err
.Raise
1031
End
If
If
BytesToWrite >
0
Then
RetVal =
WriteFile
(
hFile, buffer, BytesToWrite, BytesWritten, 0
)
localFileSize =
localFileSize +
BytesWritten
End
If
Loop
While
BytesRead >
0
END_SUB1
:
CloseHandle (
hFile) 'Ferme Fichier Local
END_SUB2
:
InternetCloseHandle httpReq 'Ferme handle requête HTTP _
'(fichier distant dans cette fonction)
InternetCloseHandle hIConnect 'Ferme Connection Internet
InternetCloseHandle hInternetSess 'Ferme Session internet
Exit
Sub
ERRH
:
ErrNum =
err
.LastDllError
' Liste des codes erreurs wininet.dll:
' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/wininet_errors.asp
Select
Case
err
.Number
Case
1001
MsgBox
"Echec ouverture session internet. Code erreur "
&
CStr
(
ErrNum)
Case
1002
MsgBox
"Echec création connexion au serveur "
&
strServer &
". Code erreur "
&
CStr
(
ErrNum)
Case
1003
MsgBox
"Echec préparation requête HTTP. Code erreur "
&
CStr
(
ErrNum)
Case
1004
MsgBox
"Echec requête HTTP. Code erreur "
&
CStr
(
ErrNum) &
". Vérifiez l'URL"
Case
1005
MsgBox
"Echec requête HTTP QUERY_STATUS_CODE. Code erreur "
&
CStr
(
ErrNum) &
". Vérifiez l'URL"
Case
1006
' Le serveur a renvoyé un code 4xx ou 5xx
Select
Case
CInt
(
strSvrResponseCode)
Case
400
: strHttpErrDesc =
"Bad Request"
Case
401
: strHttpErrDesc =
"Unauthorized"
Case
402
: strHttpErrDesc =
"Payment Required"
Case
403
: strHttpErrDesc =
"Forbidden"
Case
404
: strHttpErrDesc =
"Not Found"
Case
405
: strHttpErrDesc =
"Method Not Allowed"
Case
406
: strHttpErrDesc =
"Not Acceptable"
Case
407
: strHttpErrDesc =
"Proxy Authentication Required"
Case
408
: strHttpErrDesc =
"Request Time-out"
Case
409
: strHttpErrDesc =
"Conflict"
Case
410
: strHttpErrDesc =
"Gone"
Case
411
: strHttpErrDesc =
"Length Required"
Case
412
: strHttpErrDesc =
"Precondition Failed"
Case
413
: strHttpErrDesc =
"Request Entity Too Large"
Case
414
: strHttpErrDesc =
"Request-URI Too Large"
Case
415
: strHttpErrDesc =
"Unsupported Media Type"
Case
500
: strHttpErrDesc =
"Internal Server Error"
Case
501
: strHttpErrDesc =
"Not Implemented"
Case
502
: strHttpErrDesc =
"Bad Gateway"
Case
503
: strHttpErrDesc =
"Service Unavailable"
Case
504
: strHttpErrDesc =
"Gateway Time-out"
Case
505
: strHttpErrDesc =
"HTTP Version not supported"
End
Select
strErrMsg =
"Le serveur HTTP a répondu ave le code suivant : "
&
strSvrResponseCode
If
strHttpErrDesc <>
""
Then
strErrMsg =
strErrMsg &
" - "
&
strHttpErrDesc &
vbCrLf
Else
strErrMsg =
strErrMsg &
" (code non répertorié)"
&
vbCrLf
End
If
strErrMsg =
strErrMsg &
"URL : "
&
httpURL
MsgBox
strErrMsg, , "Erreur HTTP"
Case
1007
MsgBox
"Echec création fichier "
&
strCible
Case
1031
MsgBox
"Erreur N° "
&
CStr
(
ErrNum) &
" , pendant lecture HTTP"
&
strCible
Case
Else
strErrMsg =
"Erreur N° "
&
CStr
(
err
.Number
) &
" - "
&
err
.Description
MsgBox
strErrMsg
End
Select
Resume
END_SUB1
End
Sub
Liens utiles :
Récuperer le code HTML d'une page Web en utilisant la référence Microsoft XML
Récupérer le code HTML d'une page Web à l'aide de l'API windows
Manipuler les fichiers textes
Repousser les limites d'Access - récupérer un fil RSS
Versions : Access 2000 et supérieures
Cette fonction permet de récuperer le code HTML d'une page Web. Elle reçoit comme paramètre l'url de la page à analyser.
Function
GetHTML
(
ByVal
LinkHTTP As
String
) As
String
'---------------------------------------------------------------------------------------
' Procedure : GetHTML
' Créée le : vendredi 27 mai 2005 15:15
' Auteur : Maxence
' Objet : Récupère le texte HTML d'une page Web
' Bibliothèque : Cette procédure nécessite la déclaration de la bibliothèque
' 'Microsoft XML v x.xx' - prenez la version la plus récente
'---------------------------------------------------------------------------------------
'
'Définition des variables
Dim
oHttp As
MSXML2.ServerXMLHTTP50
Dim
sTemp As
String
Dim
nLimite As
Long
'Définition des constantes
Const
conStatutOK As
Long
=
200
' Instancier l'objet
Set
oHttp =
New
MSXML2.ServerXMLHTTP50
With
oHttp
' Se Connecter à la page web et récupérer l'information.
.Open
"GET"
, LinkHTTP, False
.Send
' v = .getAllResponseHeaders
sTemp =
.responseText
'Vérifier que tout s'est bien passé
If
Not
.Status
=
conStatutOK Then
Err
.Raise
65000
, "Procédure"
, "pas trouvé !"
End
With
GetHTML =
sTemp
On
Error
Resume
Next
oHttp.abort
Set
oHttp =
Nothing
End
Function
N'hésitez pas à télécharger le fichier exemple afin de visualiser le traitement associé à cette fonction.
Liens utiles :
Récupérer le code HTML d'une page Web à l'aide de l'API windows
Repousser les limites d'Access - récupérer un fil RSS
Ce code utilise l'API Windows ISDestinationReachable pour déterminer si un PC est accessible via le réseau.
Const
NETWORK_ALIVE_AOL =
&
H4
Const
NETWORK_ALIVE_LAN =
&
H1
Const
NETWORK_ALIVE_WAN =
&
H2
Private
Type
QOCINFO
dwSize As
Long
dwFlags As
Long
dwInSpeed As
Long
'in bytes/second
dwOutSpeed As
Long
'in bytes/second
End
Type
Private
Declare
Function
IsDestinationReachable Lib
_
"SENSAPI.DLL"
Alias "IsDestinationReachableA"
_
(
ByVal
lpszDestination As
String
, ByRef
lpQOCInfo As
QOCINFO) As
Long
Public
Function
testReseau
(
Nom As
String
) As
Boolean
Dim
Ret As
QOCINFO
Ret.dwSize
=
Len
(
Ret)
testReseau=
(
IsDestinationReachable
(
Nom, Ret) <>
0
)
End
Function
Utilisation :
If
TestReseau
(
"www.developpez.com"
) then
msgbox
"Le meilleur site de developpement est accessible"
else
msgbox
"Veuillez réessayer plus tard"
end
if
La page http://www.anonymat.org/vostraces/index.php affiche les différentes informations de votre connexion internet dont votre adresse IP. En analysant le contenu de cette page, il sera alors possible de récupérer cette adresse même en étant derrière un routeur. C'est le but de la fonction GetIPFromHTML. Vous devez au préalable cochez la référence "Microsoft XML, vX.X". Veillez à prendre la dernière disponible.
http://msdn.microsoft.com/XML/XMLDownloads/default.aspx
Collez le code suivant dans un module :
Function
GetCleanHTML
(
ByVal
sLink As
String
) As
String
'Déclarer les variables
Dim
oHttp As
MSXML2.XMLHTTP
Dim
sHTML As
String
Dim
i As
Long
'Déclarer les constantes
Const
XMLHTTP_STATUSOK As
Long
=
200
'Créer l'instance de l'objet
Set
oHttp =
New
MSXML2.XMLHTTP
'Se connecter au site, et récupérer le code HTML
With
oHttp
.Open
"GET"
, sLink, False
.send
sHTML =
.responseText
'Vérifier que tout s'est bien passé
If
.Status
=
XMLHTTP_STATUSOK Then
'Si oui, nettoyer le code HTML pour retirer tous les caractères bidons
For
i =
0
To
31
sHTML =
Replace
(
sHTML, Chr
(
i), ""
)
Next
sHTML =
Replace
(
sHTML, " "
, " "
)
sHTML =
Replace
(
sHTML, " "
, " "
)
sHTML =
Replace
(
sHTML, " "
, " "
)
sHTML =
Replace
(
sHTML, " "
, " "
)
sHTML =
Replace
(
sHTML, "> <"
, "><"
)
'Si non, vider shtml et générer une erreur
Else
sHTML =
""
Err
.Raise
65000
, "GetHTML"
, "Erreur lors de la récupération du HTML : "
&
oHttp.statusText
End
If
GetCleanHTML =
sHTML
On
Error
Resume
Next
.abort
End
With
Set
oHttp =
Nothing
End
Function
Function
GetIPFromHTML
(
)
'Cette procédure a été construite après un examen du code de la page passée en paramètre.
'Elle n'est donc valide que pour cette page...
'Déclaration des variables
Dim
sHTML_Base As
String
Dim
i1 As
Long
Dim
i2 As
Long
'Déclaration des constantes
Const
HTMLDEBUT As
String
=
"l'adresse IP :</font><br><br><b>"
'Récupérer le HTML propre de la page
sHTML_Base =
GetCleanHTML
(
"http://www.anonymat.org/vostraces/index.php"
)
'Trouver le début de l'adresse IP
i1 =
InStr
(
1
, sHTML_Base, HTMLDEBUT, vbTextCompare) +
Len
(
HTMLDEBUT)
'Trouver la fin de l'adresse IP
i2 =
InStr
(
i1 +
1
, sHTML_Base, "<"
)
'Renvoyer l'adresse IP ainsi définie :
GetIPFromHTML =
Trim
(
Mid
(
sHTML_Base, i1, i2 -
i1))
End
Function
Il ne reste en suite qu'à appeler la fonction GetIPFromHTML()