Exporter (0) Imprimer
Développer tout
Développer Réduire

Compatibilité entre les versions 32 bits et 64 bits d’Office 2010

Office 2010

Synthèse : Pour les clients qui travaillent avec de grosses quantités de données, Microsoft Office 2010 est maintenant disponible dans une version 64 bits. Cet article traite des problèmes liés à la compatibilité de la version 32 bits avec la nouvelle version 64 bits et les applications Office 32 bits héritées, ainsi que des solutions disponibles.

Le système Microsoft Office 2010 est disponible dans des versions 32 bits et 64 bits. La version 64 bits vous permet de travailler avec des jeux de données beaucoup plus volumineux, ce qui est utile en particulier lors de l’utilisation de très grands nombres dans Microsoft Excel 2010.

Avec l’introduction de la nouvelle version 64 bits de Microsoft Office 2010, une nouvelle version de Microsoft Visual Basic pour Applications (VBA), nommée Microsoft Visual Basic pour Applications 7.0 (VBA 7), a été publiée pour être utilisée avec les applications 32 bits et 64 bits. Il est important de noter que les modifications abordées dans cet article s’appliquent uniquement à la version 64 bits de Microsoft Office 2010. L’utilisation de la version 32 bits d’Office 2010 vous permet d’utiliser des solutions créées dans des versions précédentes de Microsoft Office sans modification.

Remarque Remarque

Dans une installation par défaut d’Office 2010, la version 32 bits est installée, même sur les systèmes 64 bits. Vous devez explicitement sélectionner l’option d’installation de la version 64 bits d’Office 2010.

Dans VBA 7, vous devez mettre à jour les instructions d’API (Application Programming Interface) Windows existantes (instructions Declare) pour qu’elles fonctionnent avec la version 64 bits. En outre, vous devez mettre à jour les pointeurs d’adresses et les handles de fenêtres d’affichage dans les types définis par l’utilisateur qui sont utilisés par ces instructions. Cet aspect est abordé plus en détail dans cet article, de même que les problèmes de compatibilité entre les versions 32 bits et 64 bits d’Office 2010 et les solutions suggérées.

Les applications créées avec la version 64 bits d’Office 2010 peuvent faire référence à des espaces d’adresses plus grands, et offrent donc l’opportunité d’utiliser davantage de mémoire physique qu’auparavant, ce qui permet de réduire la charge liée au déplacement de données dans et en dehors de la mémoire physique.

Vous pouvez non seulement faire référence à des emplacements spécifiques (également appelés pointeurs) dans la mémoire physique utilisés par une application pour stocker des données ou des instructions de programmation, mais également utiliser des adresses pour faire référence à des identificateurs de fenêtres d’affichage (appelés handles). La taille (en octets) du pointeur ou du handle varie selon que vous utilisez un système 32 bits ou 64 bits.

Il existe deux problèmes fondamentaux lors de l’exécution de solutions existantes avec la version 64 bits d’Office 2010 :

  • Les processus 64 bits natifs dans Office 2010 ne peuvent pas charger de binaires 32 bits. Il s’agit d’un problème courant en cas de présence de compléments et de contrôles Microsoft ActiveX existants.

  • VBA n’offrait auparavant aucun type de données de pointeur ; c’est pourquoi les développeurs utilisaient des variables 32 bits pour stocker des pointeurs et des handles. Ces variables tronquent désormais les valeurs 64 bits retournées par les appels d’API lors de l’utilisation d’instructions Declare.

VBA 7 est une nouvelle base de code qui remplace la version antérieure de VBA. VBA 7 existe pour les version 32 bits et 64 bits d’Office 2010. Il procure deux constantes de compilation conditionnelle : VBA7 et Win64. La constante VBA7 aide à garantir la compatibilité descendante de votre code en vérifiant si votre application utilise VBA 7 ou la version précédente de VBA. La constante Win64 permet de vérifier si le code s’exécute comme 32 bits ou 64 bits. Ces deux constantes de compilation sont illustrées plus loin dans cet article.

Les contrôles ActiveX 32 bits existants, qu’ils soient fournis par des tierces parties ou par Microsoft, ne sont pas compatibles avec la version 64 bits de Office 2010. Pour les contrôles ActiveX et les objets COM, il existe trois solutions possibles :

  • Si vous avez le code source, vous pouvez générer une version 64 bits vous-même.

  • Vous pouvez contacter le fournisseur afin d’obtenir une version mise à jour.

  • Vous pouvez tenter de trouver une solution alternative.

La combinaison de VBA et de bibliothèques de types met à votre disposition de nombreuses fonctionnalités pour la création d’applications Microsoft Office. Néanmoins, il est parfois nécessaire de communiquer directement avec le système d’exploitation de l’ordinateur et avec d’autres composants, par exemple lorsque vous gérez de la mémoire ou des processus, lors de l’utilisation d’éléments d’interface utilisateur telles que fenêtre et contrôles, ou lors de la modification du Registre de Windows. Dans ces scénarios, la meilleure option consiste à utiliser l’une des fonctions externes incorporées dans les fichiers DLL (Dynamic Linked Library). Pour cela, vous devez dans VBA effectuer des appels d’API à l’aide d’instructions Declare.

Remarque Remarque

Microsoft fournit un fichier Win32API.txt qui contient 1 500 instructions Declare et un outil pour couper et coller l’instruction Declare dont vous avez besoin dans votre code. Cependant, ces instructions sont destinées aux systèmes 32 bits et doivent être converties en 64 bits à l’aide des informations fournies plus loin dans cet article. Vous trouverez des exemples de ce type de conversion sur le site Web de Jan Karel Pieterse, MVP Excel, à l’adresse suivante : http://www.jkp-ads.com/articles/apideclarations.asp (éventuellement en anglais).

Les instructions Declare ressemblent à ce qui suit, selon que vous appelez une sous-routine (qui n’a aucune valeur de retour) ou une fonction (qui a une valeur de retour).

Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type

La fonction SubName ou FunctionName est remplacée par le nom de la procédure dans le fichier DLL et représente le nom utilisé lorsque la procédure est appelée à partir de code VBA. Vous pouvez également spécifier un argument AliasName pour le nom de la procédure, si vous le souhaitez. Le nom du fichier DLL qui contient la procédure appelée suit le mot clé Lib. Pour finir, la liste d’arguments contient les paramètres et types de données qui doivent être passés à la procédure.

L’instruction Declare suivante ouvre un subkey dans le Registre de Windows et remplace sa valeur.

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

L’entrée Windows.h (handle de fenêtre) pour la fonction RegOpenKeyA est la suivante :

LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );

En Microsoft Visual C et Microsoft Visual C++, l’exemple précédent est compilé correctement en 32 bits et 64 bits. Cela est dû au fait que HKEY est défini comme un pointeur, dont la taille reflète la taille mémoire de la plateforme sur laquelle le code est compilé.

Dans les versions précédentes de VBA, il n’existait aucun type de données de pointeur spécifique ; le type de données Long était par conséquent toujours utilisé. Le type de données Long étant toujours 32 bits, cela provoque un échec en cas d’utilisation sur un système avec une mémoire 64 bits car les 32 bits supérieurs peuvent être tronqués ou peuvent remplacer d’autres adresses mémoire. L’une ou l’autre de ces situations peut provoquer un comportement inattendu ou un blocage système.

Pour résoudre ce problème, VBA contient désormais un type de données pointeur réel : LongPtr. Ce nouveau type de données vous permet d’écrire l’instruction Declare d’origine correctement comme suit :

Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long

Ce type de données et le nouvel attribut PtrSafe vous permettent d’utiliser cette instruction Declare sur des systèmes 32 bits ou 64 bits. L’attribut PtrSafe indique au compilateur VBA que l’instruction Declare cible la version 64 bits d’Office 2010. Sans cet attribut, l’utilisation de l’instruction Declare sur un système 64 bits provoque une erreur au moment de la compilation. Notez que l’attribut PtrSafe est facultatif sur la version 32 bits d’Office 2010 . Cela permet aux instructions Declare existantes de fonctionner comme elles l’ont toujours fait.

Le tableau suivant fournit des informations supplémentaires sur les nouveaux qualificateur et type de données dont nous venons de discuter et sur un autre type de données, deux opérateurs de conversion et trois fonctions.

Type

Élément

Description

Qualificateur

PtrSafe

Indique que l’instruction Declare est compatible 64 bits. Cet attribut est obligatoire sur les systèmes 64 bits.

Type de données

LongPtr

Type de données de variable qui est un type de données sur 4 octets sur les versions 32 bits et un type de données sur 8 octets sur les versions 64 bits d’Office 2010. Il s’agit de la méthode recommandée pour déclarer un pointeur ou un handle pour du nouveau code, mais également pour du code hérité s’il doit s’exécuter dans la version 64 bits d’Office 2010. Il est pris en charge uniquement dans le runtime VBA 7 sur les systèmes 32 bits et 64 bits. Notez que vous pouvez lui assigner des valeurs numériques mais pas des types numériques.

Type de données

LongLong

Il s’agit d’un type de données sur 8 octets disponible uniquement dans les versions 64 bits d’Office 2010. Vous pouvez lui assigner des valeurs numériques, mais pas des types numériques (afin d’éviter la troncation).

Opérateur de conversion

CLngPtr

Convertit une expression simple en un type de données LongPtr.

Opérateur de conversion

CLngLng

Convertit une expression simple en un type de données LongLong.

Fonction

VarPtr

Convertisseur de variant. Retourne un LongPtr sur les versions 64 bits et un Long sur les versions 32 bits (4 octets).

Fonction

ObjPtr

Convertisseur d’objet. Retourne un LongPtr sur les versions 64 bits et un Long sur les versions 32 bits (4 octets).

Fonction

StrPtr

Convertisseur de chaîne. Retourne un LongPtr sur les versions 64 bits et un Long sur les versions 32 bits (4 octets).

L’exemple suivant montre comment utiliser certains de ces éléments dans une instruction Declare.

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

Notez que les instructions Declare sans attribut PtrSafe sont considérées comme non compatibles avec la version 64 bits d’Office 2010.

Comme nous l’avons vu plus haut, il existe deux constantes de compilation conditionnelle : VBA7 et Win64. Pour garantir la compatibilité descendante avec les versions précédentes d’Office, on utilise la constante VBA7 (il s’agit du cas le plus courant) afin d’empêcher le code 64 bits de s’exécuter dans la version antérieure d’Office. Pour le code qui diffère entre la version 32 bits et la version 64 bits, tel que l’appel d’une API mathématique qui utilise LongLong pour sa version 64 bits et Long pour sa version 32 bits, on utilise la constante Win64. Le code suivant illustre l’utilisation de ces deux constantes.

#if Win64 then
   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else
   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
#end if
#if VBA7 then
   Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N AS Long)
#else
   Declare Sub MessageBeep Lib "User32" (ByVal N AS Long)
#end if

Pour résumer, si vous écrivez du code 64 bits et que prévoyez de l’utiliser dans des versions précédentes de Microsoft Office, il faut utiliser la constante de compilation conditionnelle VBA7. En revanche, si vous écrivez du code 32 bits dans Office 2010, ce code fonctionne tel que dans les versions précédentes d’Microsoft Office sans la constante de compilation. Si vous souhaitez être sûr d’utiliser des instructions 32 bits pour les versions 32 bits et des instructions 64 bits pour les versions 64 bits, la meilleure solution consiste à utiliser la constante de compilation conditionnelle Win64.

Le code suivant est un exemple de code VBA hérité qui doit être mis à jour. Notez les types de données dans le code hérité qui doivent être mis à jour de façon à utiliser LongPtr car ils font référence à des handles ou des pointeurs.

Code VBA hérité

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
  
Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type

Nouveau code VBA

#if VBA7 then    ' VBA7 
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
  hOwner As LongPtr
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As LongPtr
  lParam As LongPtr
  iImage As Long
End Type
 
#else    ' Downlevel when using previous version of VBA7

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
 
#end if
Sub TestSHBrowseForFolder ()
    Dim bInfo As BROWSEINFO
    Dim pidList As Long

    bInfo.pidlRoot = 0&
    bInfo.ulFlags = &H1
    pidList = SHBrowseForFolder(bInfo)
End Sub

L’ajout d’une version 64 bits d’Office 2010 vous permet de manipuler davantage de données afin d’accroître les fonctionnalités. Lors de l’écriture de code 32 bits, vous pouvez utiliser la version 64 bits d’Microsoft Office sans modification. En revanche, lors de l’écriture de code 64 bits, vous devez faire en sorte que votre code contienne des mots clés et des constantes de compilation conditionnelle spécifiques afin de garantir sa compatibilité descendante avec les versions antérieures d’Microsoft Office et d’être certain que le code correct est exécuté si vous mélangez du code 32 bits et 64 bits.

Pour plus d’informations sur les instructions Declare, voir les ressources suivantes :

Afficher:
© 2014 Microsoft