Ouvrir ou imprimer un fichier quelconque à partir de son nom – Access 64 bits
Cet article est une mise à jour de l’article Ouvrir ou imprimer un fichier quelconque à partir de son nom. L’article initial portait sur les versions 32 bits d’Access (et d’Office en général). Cet article concerne uniquement les versions 64 bits d’Access et d’Office.
Ce qui change en 64 bits
Sur un processeur 64 bits, la taille des pointeurs mémoire est par définition 2 fois plus grande que sur un processeur 32 bits. Ceci ne change pas le code VBA classique, mais a bien sûr un impact sur tous les appels de fonctions système (fonctions API fournies par des DLL externes).
En gros, si vous disposez d’une version 64 bits d’Access, vous allez devoir revoir tous les appels API, en faisant globalement 2 changements :
- Ajouter la mention
PtrSafe
à chaque instructionDeclare Function
, qui devient doncDeclare PtrSafe Function
. - Remplacer la plupart des types
Long
, dans ces déclarations, par des typesLongPtr
. Mais pas tous ! Seuls les pointeurs mémoire sont concernés, les valeurs de typeLong
qui servent simplement à transférer des valeurs ne sont pas impactées.
D’autres aménagements peuvent être nécessaires, au cas par cas. Notamment si un appel API utilise une structure mémoire qui a été modifiée sur Windows 64 bits.
ShellExecute version 64 bits
Si vous avez lu l’article original, vous avez vu qu’il démarrait justement par des déclarations de fonctions API, en 32 bits. Remplacez le code donné par ce qui suit, et vous obtenez l’équivalent 64 bits :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
' --- DECLARATION API WINDOWS Private Declare PtrSafe Function ShellExecute _ Lib "shell32.dll" _ Alias "ShellExecuteA" ( _ ByVal hwnd As LongPtr, ByVal lpOperation As String, _ ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) _ As LongPtr ' --- ' OUVRIR/IMPRIMER UN DOCUMENT A PARTIR DE SON CHEMIN ' --- ' Entrée : strFichier <- Nom du fichier à ouvrir/imprimer. ' strOperation <- Opération sur le fichier. ' explore, find, open, print ' strParametres <- Paramètres à transmettre au programme, ' lorsque strFichier est un .exe. ' strDossier <- Dossier d'exécution par défaut (pour un .exe). ' awsAffichage <- Mode d'affichage de la fenêtre. ' Public Function ShellExec( _ ByVal strFichier As String, _ Optional ByVal strOperation As String = "Open", _ Optional ByVal awsAffichage As VbAppWinStyle = VbAppWinStyle.vbNormalFocus, _ Optional ByVal strParametres As String = "", _ Optional ByVal strDossier As String = "") _ As Boolean Dim lngRes As LongPtr lngRes = ShellExecute(Access.hWndAccessApp, strOperation, _ strFichier, strParametres, strDossier, awsAffichage) ShellExec = (lngRes < 0) Or (lngRes > 32) End Function |
Le mode d’emploi de ces fonctions ne change pas en 64 bits. Si vous souhaitez des exemples, consultez l’article original.
Pour aller plus loin
Dans un prochain article, on verra comment faire en sorte que les codes 32 bits et 64 bits puissent cohabiter, de façon à faire tourner votre code VBA sur un Windows 32 ou 64 bits, indifféremment. Et sans modifier votre base de données à chaque changement de Windows.