Kompatibilität zwischen der 32-Bit-Version und der 64-Bit-Version von Office 2010
Zusammenfassung: Für Kunden, die mit großen Datenmengen arbeiten, ist Microsoft Office 2010 jetzt als 64-Bit-Version verfügbar. In diesem Artikel werden Probleme rund um die Kompatibilität der 32-Bit-Version mit der neuen 64-Bit-Version sowie mit älteren 32-Bit-Office-Anwendungen beschrieben und Lösungen vorgestellt. (7 gedruckte Seiten)
Letzte Änderung: Freitag, 24. April 2015
Gilt für: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications 7.0 (VBA 7.0) | Word 2010
Inhalt dieses Artikels
Einführung in die 32-Bit- und 64-Bit-Version von Microsoft Office 2010
32-Bit-Systeme und 64-Bit-Systeme im Vergleich
Einführung in die VBA 7-Codebasis
Kompatibilität mit ActiveX-Steuerelementen und COM-Add-Ins
API-Kompatibilität
Verwenden von bedingten Kompilierungsattributen
Häufig gestellte Fragen
Fazit
Zusätzliche Ressourcen
Applies to: Microsoft Office 2010
Veröffentlicht: März 2010
Bereitgestellt von: Microsoft Corporation
Inhalt
Einführung in die 32-Bit- und 64-Bit-Version von Microsoft Office 2010
32-Bit-Systeme und 64-Bit-Systeme im Vergleich
Einführung in die VBA 7-Codebasis
Kompatibilität mit ActiveX-Steuerelementen und COM-Add-Ins
API-Kompatibilität
Verwenden von bedingten Kompilierungsattributen
Häufig gestellte Fragen
Fazit
Zusätzliche Ressourcen
Einführung in die 32-Bit- und 64-Bit-Version von Microsoft Office 2010
Microsoft Office 2010 ist sowohl als 32-Bit- als auch als 64-Bit-Version verfügbar. Mit der 64-Bit-Version können deutlich größere Datensätze bearbeitet werden. Dies ist insbesondere bei der Arbeit mit hohen Zahlen in Microsoft Excel 2010 erforderlich.
Mit der Einführung der neuen 64-Bit-Version von Microsoft Office 2010 wird auch eine neue Version von Microsoft Visual Basic für Applikationen (VBA) veröffentlicht: Microsoft Visual Basic für Applikationen 7.0 (VBA 7). Diese Version unterstützt sowohl 32-Bit- als auch 64-Bit-Anwendungen. Die Änderungen, auf die in diesem Artikel eingegangen wird, gelten nur für die 64-Bit-Version von Microsoft Office 2010. Mit der 32-Bit-Version von Office 2010 können Lösungen, die in früheren Versionen von Microsoft Office erstellt wurden, unverändert verwendet werden.
Hinweis
Bei der Standardinstallation von Office 2010 wird stets die 32-Bit-Version installiert, selbst auf 64-Bit-Systemen. Sie müssen die 64-Bit-Installationsoption für Office 2010explizit auswählen.
In VBA 7 müssen Sie die vorhandenen Windows-API-Anweisungen (Declare-Anweisungen) aktualisieren, damit die 64-Bit-Version unterstützt wird. Außerdem müssen Sie Adresszeiger und Anzeigefensterhandles in benutzerdefinierten Typen aktualisieren, die von diesen Anweisungen verwendet werden. Hierauf wird in diesem Artikel noch ausführlicher eingegangen, Außerdem werden Kompatibilitätsprobleme zwischen der 32-Bit-Version und der 64-Bit-Version von Office 2010 besprochen und Lösungen vorgeschlagen.
32-Bit-Systeme und 64-Bit-Systeme im Vergleich
Anwendungen, die mit der 64-Bit-Version von Office 2010 erstellt wurden, können auf größere Adressräume verweisen und bieten damit die Möglichkeit, mehr physikalischen Arbeitsspeicher als je zuvor zu nutzen. Dadurch lässt sich der Mehraufwand für das Verschieben von Daten in den und aus dem physikalischen Arbeitsspeicher potenziell reduzieren.
Sie können mithilfe von Adressen nicht nur auf bestimmte Positionen im physikalischen Arbeitsspeicher (so genannte Zeiger) verweisen, an denen eine Anwendung Daten oder Programmieranweisungen speichert, sondern auch auf Anzeigefensterbezeichner (so genannte Handles). Die Größe des Zeigers oder Handles in Bytes hängt davon ab, ob Sie ein 32-Bit-System oder ein 64-Bit-System verwenden.
Beim Ausführen vorhandener Lösungen mit der 64-Bit-Version von Office 2010 gibt es im Wesentlichen zwei Schwierigkeiten:
Von systemeigenen 64-Bit-Prozessen in Office 2010 können keine 32-Bit-Binärdateien geladen werden. Dieses Problem tritt häufig auf, wenn bereits Microsoft ActiveX-Steuerelemente und Add-Ins vorhanden sind.
In früheren Versionen von VBA gab es keinen Zeigerdatentyp. Infolgedessen verwendeten Entwickler 32-Bit-Variablen, um Zeiger und Handles zu speichern. Durch diese Variablen werden 64-Bit-Werte, die von API-Aufrufen zurückgegeben werden, bei Verwendung von Declare-Anweisungen jetzt abgeschnitten.
Einführung in die VBA 7-Codebasis
VBA 7 ist eine neue Codebasis, die die frühere Version von VBA ersetzt. VBA 7 gibt es sowohl für die 32-Bit-Version als auch für die 64-Bit-Version von Office 2010. Die Codebasis bietet zwei bedingte Kompilierungskonstanten: VBA7 und Win64. Die VBA7-Konstante stellt die Abwärtskompatibilität des Codes sicher. Hierzu wird überprüft, ob die Anwendung VBA 7 oder die frühere Version von VBA verwendet. Die Win64-Konstante dient zum Testen, ob Code als 32-Bit- oder 64-Bit-Code ausgeführt wird. Beide Kompilierungskonstanten werden weiter hinten in diesem Artikel vorgestellt.
Abgesehen von bestimmten Ausnahmen an anderer Stelle in diesem Artikel funktionieren die Makros in einem Dokument (dazu gehören auch Arbeitsmappen und Präsentationen), die bei der 32-Bit-Version dieser Anwendung funktioniert haben, auch, wenn das Dokument in der 64-Bit-Version der gleichen Anwendung geladen wird.
Kompatibilität mit ActiveX-Steuerelementen und COM-Add-Ins
Vorhandene 32-Bit-ActiveX-Steuerelemente sind, unabhängig davon, ob sie von Drittanbietern oder von Microsoft stammen, nicht mit der 64-Bit-Version von Office 2010 kompatibel. Für ActiveX-Steuerelemente und COM-Objekte gibt es drei mögliche Lösungen:
Wenn der Quellcode verfügbar ist, können Sie selbst eine 64-Bit-Version generieren.
Sie können sich an den Hersteller wenden und eine aktualisierte Version anfordern.
Sie können eine alternative Lösung suchen.
Systemeigene 64-Bit-Prozesse in Office 2010 32-Bit-Binärdateien kann nicht geladen werden. Dies umfasst die allgemeinen Steuerelemente von MSComCtl (TabStrip, Symbolleiste, Statusleiste, Statusanzeige, TreeView, ListViews, Abbildungsliste, Schieberegler, ImageCombo) und die Steuerelemente des MSComCt2 (Animation, UpDown, Monatsansicht, DateTimePicker, FlatScrollBar). Diese Steuerelemente installiert wurden, in früheren Versionen von Microsoft Office und von 32-Bit- Office 2010. Eine Alternative für vorhandene gefunden werden muss, Microsoft Office VBA-Lösungen, die diese Steuerelemente verwenden, wenn der Code auf 64-Bit-migriert wird Office 2010. 64-Bit-Office 2010 bietet keine 64-Bit-Versionen der allgemeinen Steuerelemente.
API-Kompatibilität
Durch die Kombination von VBA und Typbibliotheken verfügen Sie über umfangreiche Funktionalitäten zum Erstellen von Microsoft Office-Anwendungen. Manchmal ist jedoch eine direkte Kommunikation mit dem Betriebssystem und anderen Komponenten des Computers erforderlich, beispielsweise zur Verwaltung von Arbeitsspeicher oder Prozessen, bei der Arbeit mit der Benutzeroberfläche, beispielsweise mit Fenstern und Steuerelementen, oder beim Ändern der Windows-Registrierung. In diesen Szenarien verwenden Sie am besten eine der externen Funktionen, die in DLL-Dateien (Dynamic Link Library) eingebettet sind. In VBA erstellen Sie dazu API-Aufrufe unter Verwendung von Declare-Anweisungen.
Hinweis
Microsoft stellt die Datei "Win32API.txt" zur Verfügung, die 1.500 Declare-Anweisungen und ein Tool zum Ausschneiden der gewünschten Declare-Anweisung und Einfügen in den Code enthält. Diese Anweisungen sind jedoch für 32-Bit-Systeme vorgesehen und müssen gemäß den Anweisungen weiter hinten in diesem Artikel in das 64-Bit-System konvertiert werden. Vorhandene Declare-Anweisungen werden erst in 64-Bit-VBA kompiliert, nachdem sie mithilfe des PtrSafe-Attributs als sicher für 64-Bit markiert wurden. Beispiele für derartige Konvertierungen finden Sie auf der Website von Jan Karel Pieterse (Excel-MVP) unter: http://www.jkp-ads.com/articles/apideclarations.asp.
Das Benutzerhandbuch für Microsoft Office Code Compatibility Inspector ist ein hilfreiches Tool, um bei Bedarf die Syntax von API-Declare-Anweisungen für das PtrSafe-Attribut und den geeigneten Rückgabetyp zu überprüfen.
Declare-Anweisungen ähneln folgendem Code, je nachdem, ob Sie eine Unterroutine (kein Rückgabewert) oder eine Funktion (mit Rückgabewert) aufrufen.
Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type
Die SubName-Funktion oder die FunctionName-Funktion wird in der DLL-Datei durch den tatsächlichen Namen der Prozedur ersetzt und steht für den Namen, der beim Aufruf der Prozedur aus dem VBA-Code verwendet wird. Sie können auch ein AliasName-Argument für den Prozedurnamen angeben, wenn Sie dies möchten. Der Name der DLL-Datei mit der aufgerufenen Prozedur folgt auf das Lib-Schlüsselwort. Und schließlich enthält die Argumentliste die Parameter und Datentypen, die an die Prozedur übergeben werden müssen.
Mit der folgenden Declare-Anweisung wird ein Unterschlüssel in der Windows-Registrierung geöffnet und der Wert ersetzt.
Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long
Der Eintrag Windows.h (Fensterhandle) für die RegOpenKeyA-Funktion lautet wie folgt:
LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );
In Microsoft Visual C und Microsoft Visual C++ wird das vorherige Beispiel sowohl in der 32-Bit-Version als auch in der 64-Bit-Version richtig kompiliert. Der Grund ist, dass HKEY als Zeiger definiert ist, dessen Größe der Größe des Arbeitsspeichers auf der Plattform entspricht, auf der der Code kompiliert wird.
In früheren Versionen von VBA gab es keinen bestimmten Zeigerdatentyp. Deshalb wurde der Long-Datentyp verwendet. Und da der Long-Datentyp immer 32 Bits lang ist, wird die Funktion auf einem System mit 64-Bit-Arbeitsspeicher beschädigt, weil die oberen 32 Bits u. U. abgeschnitten werden oder andere Arbeitsspeicheradressen überschreiben. Beide Situationen können unvorhersehbares Verhalten oder Systemabstürze zur Folge haben.
Zur Behebung dieses Problems enthält VBA jetzt einen echten Zeigerdatentyp: LongPtr. Mit diesem neuen Datentyp können Sie die ursprüngliche Declare-Anweisung korrekt wie folgt schreiben:
Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long
Dieser Datentyp und das neue PtrSafe-Attribut ermöglichen die Verwendung dieser Declare-Anweisung sowohl auf 32-Bit-Systemen als auch auf 64-Bit-Systemen. Das PtrSafe-Attribut gibt an, dass die Declare-Anweisung für die 64-Bit-Version von Office 2010 geschrieben wurde. Ohne dieses Attribut tritt bei Verwendung der Declare-Anweisung auf einem 64-Bit-System ein Kompilierungsfehler auf. Bei der 32-Bit-Version von Office 2010 ist das PtrSafe-Attribut optional. Auf diese Weise wird die Funktion vorhandener Declare-Anweisungen nicht beeinträchtigt.
Die folgende Tabelle enthält weitere Informationen zum bereits angesprochenen neuen Qualifizierer und Datentyp sowie zu einem weiteren Datentyp, zwei Konvertierungsoperatoren und drei Funktionen.
Typ |
Element |
Beschreibung |
---|---|---|
Qualifizierer |
PtrSafe |
Gibt an, dass die Declare-Anweisung mit 64-Bit-Systemen kompatibel ist. Dieses Attribut ist auf 64-Bit-Systemen obligatorisch. |
Datentyp |
LongPtr |
Ein variabler Datentyp, der auf 32-Bit-Versionen von Office 2010 als 4-Byte-Datentyp und auf 64-Bit-Versionen als 8-Byte-Datentyp ausgelegt ist. Seine Verwendung wird zum Deklarieren eines Zeigers oder Handles für neuen Code, aber auch für älteren Code empfohlen, wenn dieser in der 64-Bit-Version von Office 2010 ausgeführt werden soll. Der Datentyp wird auf 32-Bit- und 64-Bit-Systemen nur in der VBA 7-Laufzeit unterstützt. Sie können dem Datentyp numerische Werte, aber keine numerischen Typen zuweisen. |
Datentyp |
LongLong |
Ein 8-Byte-Datentyp, der nur in 64-Bit-Versionen von Office 2010 zur Verfügung steht. Sie können ihm numerische Werte, aber keine numerischen Typen zuweisen (um Abschneiden zu vermeiden). |
Konvertierungsoperator |
CLngPtr |
Konvertiert einen einfachen Ausdruck in einen LongPtr-Datentyp. |
Konvertierungsoperator |
CLngLng |
Konvertiert einen einfachen Ausdruck in einen LongLong-Datentyp. |
Funktion |
VarPtr |
Variantenkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück. |
Funktion |
ObjPtr |
Objektkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück. |
Funktion |
StrPtr |
Zeichenfolgenkonverter. Gibt auf 64-Bit-Versionen LongPtr und auf 32-Bit-Versionen Long (4 Bytes) zurück. |
Im folgenden Beispiel ist die Verwendung einiger dieser Elemente in einer Declare-Anweisung dargestellt.
Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long
Beachten Sie, dass Declare-Anweisungen ohne das PtrSafe-Attribut im Allgemeinen nicht mit der 64-Bit-Version von Office 2010 kompatibel sind.
Wie bereits erwähnt gibt es zwei neue bedingte Kompilierungskonstanten: VBA7 und Win64. Zur Sicherstellung der Abwärtskompatibilität mit früheren Versionen von Microsoft Office verwenden Sie typischerweise die VBA7-Konstante, um zu vermeiden, dass 64-Bit-Code in der früheren Version von Microsoft Office ausgeführt wird. Für Code, der sich in der 32-Bit-Version und der 64-Bit-Version unterscheidet, beispielsweise der Aufruf einer Mathematik-API, die in der 64-Bit-Version LongLong und in der 32-Bit-Version Long nutzt, verwenden Sie die Win64-Konstante. Im folgenden Code ist die Verwendung der beiden Konstanten dargestellt.
#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
Wenn Sie also 64-Bit-Code schreiben, der auch in früheren Versionen von Microsoft Office verwendet werden soll, sollten Sie die bedingte Kompilierungskonstante VBA7 verwenden. Wenn Sie jedoch 32-Bit-Code in Office 2010 erstellen, funktioniert dieser in früheren Versionen von Microsoft Office ohne Anpassung und ohne die Kompilierungskonstante. Wenn Sie sicherstellen möchten, dass Sie 32-Bit-Anweisungen für 32-Bit-Versionen und 64-Bit-Anweisungen für 64-Bit-Versionen verwenden, empfiehlt sich die Verwendung der bedingten Kompilierungskonstante Win64.
Verwenden von bedingten Kompilierungsattributen
Der folgende Code ist ein Beispiel für VBA-Code der Vorversion , der aktualisiert werden muss. Die Datentypen im Code werden aktualisiert, damit sie LongPtr verwenden, weil sie auf Handles oder Zeiger verweisen.
VBA-Code der Vorversion
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
Neuer VBA-Code
#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
Häufig gestellte Fragen
Nachfolgend finden Sie die häufig gestellten Fragen im Zusammenhang mit der 32-Bit-Version und der 64-Bit-Version von Microsoft Office.
Wann sollte ich die 64-Bit-Version von Microsoft Office verwenden?
Die ist eine Frage der Hostanwendung (Excel, Word usw.), die Sie verwenden. Excel kann mit der 64-Bit-Version von Microsoft Office beispielsweise viel größere Arbeitsblätter verarbeiten.Kann ich die 64-Bit- und die 32-Bit-Version von Microsoft Office parallel installieren?
Nein.Wann sollte ich Long-Parameter in LongPtr konvertieren?
Sie müssen in der Windows-API-Dokumentation im Microsoft Developers Network nach der Funktion suchen, die Sie aufrufen möchten. Handles und Zeiger müssen in LongPtr konvertiert werden. Als Beispiel stellt die Dokumentation für RegOpenKeyA die folgende Signatur bereit:LONG WINAPI RegOpenKeyEx( __in HKEY hKey, __in_opt LPCTSTR lpSubKey, __reserved DWORD ulOptions, __in REGSAM samDesired, __out PHKEY phkResult );
Die Parameter sind wie folgt definiert:
Parameter
Beschreibung
hKey [in]
Ein Handle für einen geöffneten Registrierungsschlüssel.
lpSubKey [in, optional]
Der Name des Registrierungsunterschlüssels, der geöffnet werden soll.
ulOptions
Dieser Parameter ist reserviert und muss NULL sein.
samDesired [in]
Eine Maske, die die gewünschten Zugriffsrechte für den Schlüssel angibt.
phkResult [out]
Ein Zeiger auf eine Variable, die einen Handle für den n Schlüssel empfängt.
In Win32API_PtrSafe.txt ist die Declare-Anweisung definiert als:
Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongPtr, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As LongPtr) As Long
Muss ich Zeiger und Handles in Strukturen konvertieren?
Ja. Siehe MSG-Typ in "Win32API_PtrSafe.txt":Type MSG hwnd As LongPtr message As Long wParam As LongPtr lParam As LongPtr time As Long pt As POINTAPI End TypeF
Wann muss ich strptr, varpt und objptr verwenden?
Sie sollten diese Funktionen verwenden, um Verweise auf Zeichenfolgen, Variablen bzw. Objekte abzurufen. In der 64-Bit-Version von Microsoft Office geben diese Funktionen einen 64-Bit-LongPtr zurück, der an Declare-Anweisungen weitergegeben werden kann. Die Verwendung dieser Funktionen hat sich seit den früheren Versionen von VBA nicht geändert. Der einzige Unterschied besteht darin, dass diese jetzt einen LongPtr zurückgeben.
Fazit
Dank der neuen 64-Bit-Version von Office 2010 können Sie mehr Daten verarbeiten, wodurch der Funktionsspielraum wächst. Wenn Sie 32-Bit-Code schreiben, können Sie die 64-Bit-Version von Microsoft Office ohne Änderungen verwenden. Beim Schreiben von 64-Bit-Code sollten Sie allerdings sicherstellen, dass der Code bestimmte Schlüsselwörter und bedingte Kompilierungskonstanten enthält, damit der Code mit der früheren Version von Microsoft Office abwärtskompatibel ist, und dass bei einer Kombination von 32-Bit- und 64-Bit-Code der richtige Code ausgeführt wird.
Zusätzliche Ressourcen
Weitere Informationen zu Declare-Anweisungen finden Sie in den folgenden Ressourcen: