Geben Sie PtrSafe an, um beim Importieren der Windows-API sowohl 32-Bit- als auch 64-Bit-Excel zu verwenden

Erfahren Sie mehr über die PtrSafe-Deklaration der Windows-API. Beim Codieren mit Excel VBA können Sie die Ursachen und Lösungen von PtrSafe-bezogenen Fehlern überprüfen, die gelegentlich beim Importieren und Verwenden von Windows-APIs auftreten.

1. Beispielcode für das Auftreten von PtrSafe-Fehlern in der Windows-API

Dieser Code importiert und deklariert Windows API Sleep, OutputDebugString.

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)

(Hinweis: Der obige Code ist Protokollierungsmuster: Verwendung von OutputDebugString und DebugView – Produktivitäts-Skill (prodskill.com) Dies ist der Code, der in eingeführt wurde.)

2. PtrSafe-Fehlermeldung der Windows-API

Beim Bearbeiten oder Kompilieren von VBA-Code tritt der folgende Fehler auf.

VBA 컴파일 오류: Declare 문 PtrSafe 특성 표시 필요
VBA-Kompilierungsfehler: Declare-Anweisung PtrSafe-Attribut muss markiert werden

——————————————-
Microsoft Visual Basic für Applikationen
——————————————-

Dies ist ein Kompilierungsfehler:

Sie müssen den Code in diesem Projekt aktualisieren, um ihn auf 64-Bit-Systemen verwenden zu können. Überprüfen und aktualisieren Sie die Declare-Anweisung und markieren Sie sie mit dem PtrSafe-Attribut.

3. Was verursacht PtrSafe-Fehler in der Windows-API

64-Bit wird seit MS-Office 2010 unterstützt, und dies tritt auf, weil das PtrSafe-Schlüsselwort angegeben werden muss, wenn danach die Windows-API in 64-Bit-Excel importiert wird.

Bezug: Der Code in diesem Projekt muss für die Verwendung auf 64-Bit-Systemen aktualisiert werden – Office | Microsoft-Docs

Compile error when you edit a VBA macro in the 64-bit version of an Office 2010 program
Kompilierungsfehler beim Bearbeiten eines VBA-Makros in der 64-Bit-Version eines Office 2010-Programms

Einige Auszüge aus der obigen URL sind unten eingefügt.


Symptome

Betrachten Sie das folgende Szenario:

  • Sie schreiben einen Makrocode für Microsoft Visual Basic für Applikationen (VBA), der Declare-Anweisungen verwendet.
  • Ihr VBA-Makrocode verwendet Kompilierungskonstanten. Ihr Makrocode verwendet beispielsweise eine der folgenden Kompilierungskonstanten:
    • #If VBA7
    • #Wenn Win64
  • Einen #Else-Baustein verwenden Sie in einem Bedingungsbaustein. Im #Else-Block verwenden Sie Syntax für eine Declare-Anweisung, die für die Ausführung in Microsoft Visual Basic für Applikationen 6.0 entwickelt wurde.
  • Sie bearbeiten den Code in einer 64-Bit-Version eines Microsoft Office 2010-Programms.
  • Sie versuchen, die Declare-Anweisung im #Else-Block zu ändern.

In diesem Szenario wird die folgende Fehlermeldung angezeigt:

Microsoft Visual Basic for Applications

Compile error:

The code in this project must be updated for use on 64-bit
systems. Please review and update Declare statements and then
mark them with the PtrSafe attribute.

4. So beheben Sie den Windows-API-PtrSafe-Fehler

Die VBA-Version von MS-Office 2010 ist 7.0 und die vorherige ist 6.x. Da das PtrSafe-Schlüsselwort ab VBA 7.0 erforderlich ist, kann der Windows-API-Importcode unterteilt und deklariert werden, je nachdem, ob die VBA-Version höher als 7.0 ist oder nicht.

Bezug: PtrSafe-Schlüsselwort (VBA) | Microsoft-Docs

PtrSafe keyword
PtrSafe-Schlüsselwort

Einige Auszüge aus der obigen URL sind unten eingefügt.


PtrSafe-Schlüsselwort

  • Artikel
  • 09/14/2021
  • 2 Minuten zu lesen
  • 5 Mitwirkende

Die PtrSafe Schlüsselwort wird in diesem Zusammenhang verwendet: Aussage erklären.

Erklären Aussagen mit PtrSafe Schlüsselwort ist die empfohlene Syntax. Deklarieren Sie Anweisungen, die enthalten PtrSafe funktionieren in der VBA7-Entwicklungsumgebung sowohl auf 32-Bit- als auch auf 64-Bit-Plattformen nur dann korrekt, wenn alle Datentypen in der Erklären -Anweisung (Parameter und Rückgabewerte), die 64-Bit-Mengen speichern müssen, werden für die Verwendung aktualisiert Lang Lang für 64-Bit-Integrale bzw LangPtr für Zeiger und Griffe.

Um die Abwärtskompatibilität mit VBA-Version 6 und früher sicherzustellen, verwenden Sie das folgende Konstrukt:

#If VBA7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf

Bei Ausführung in 64-Bit-Versionen von Office Erklären Aussagen müssen die enthalten PtrSafe Stichwort. Der PtrSafe Schlüsselwort behauptet, dass a Erklären -Anweisung kann in 64-Bit-Entwicklungsumgebungen sicher ausgeführt werden.

Hinzufügen der PtrSafe Schlüsselwort zu a Erklären Aussage bedeutet nur, dass die Erklären Die Anweisung zielt explizit auf 64-Bit ab. Alle Datentypen innerhalb der Anweisung, die 64-Bit speichern müssen (einschließlich Rückgabewerte und Parameter), müssen weiterhin so geändert werden, dass sie 64-Bit-Mengen enthalten, indem sie beide verwenden Lang Lang für 64-Bit-Integrale bzw LangPtr für Zeiger und Griffe.


Sie müssen lediglich festlegen, ob eine „VBA7“-Konstante oder eine „Win64“-Konstante definiert ist.Verwenden Sie in diesem Fall die Compiler-Direktive #If-Syntax.

Der Code ist wie folgt aufgebaut:

'방법1
#If VBA7 Then
    '64bit Windows API import
#Else
    '32bit Windows API import
#End If

'방법2
#If Win64 Then
    '64bit Windows API import
#Else
    '32bit Windows API import
#End If

'방법1, 방법2는 동일한 효과가 있으므로 한 방법을 선택하면 됨

5. Beispielcode zum Beheben des Windows-API-PtrSafe-Fehlers

5.1. Falls es gemischt und in 32-Bit- und 64-Bit-Excel verwendet wird

#If VBA7 Then 'For 64 Bit Systems
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
    Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)
#Else 'For 32 Bit Systems
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)
#End If

5.2. Wenn es nur in 64-Bit-Excel verwendet wird

Wenn Sie sicher sind, dass es nur in 64-Bit-Excel verwendet wird, verwenden Sie nur eine Anweisung, die das PtrSafe-Schlüsselwort angibt.

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEDeutsch