Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Access 2016 64 bit LongPtr

7 views
Skip to first unread message

Jürgen Meyer

unread,
Jun 19, 2019, 6:37:23 AM6/19/19
to
Ich habe nach wie vor Probleme, Code von 32 auf 64 bit umzuwandeln.

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

Warum heißt es am Ende "As Long" und nicht "As LongPtr"?
Welche Long muss man in LongPtr umwandeln, welche nicht?

Gibt es irgendwo eine Auflistung der Aufrufe für 64 bit?

Gruß
Jürgen

Jürgen Meyer

unread,
Jun 19, 2019, 6:48:26 AM6/19/19
to
On Wed, 19 Jun 2019 12:37:19 +0200, "Jürgen Meyer" posted:
Nachtrag:

Type PROCESS_INFORMATION
hProcess As LongPtr
hThread As LongPtr
dwProcessId As Long
dwThreadId As Long
End Type

Einmal LongPtr, einmal Long

Woher weiß ich, was ich nehmen muss?

Gruß
Jürgen

HR Ernst

unread,
Jun 19, 2019, 6:51:17 AM6/19/19
to

Ulrich Möller

unread,
Jun 19, 2019, 2:01:06 PM6/19/19
to
Hallo Jürgen,

Am 19.06.2019 um 12:37 schrieb Jürgen Meyer:
...
> Gibt es irgendwo eine Auflistung der Aufrufe für 64 bit?
...

gibt es tatsächlich von MS:
https://support.microsoft.com/de-de/help/2030490/office-2010-help-files-win32api-ptrsafe-with-64-bit-support

Ulrich

Jürgen Meyer

unread,
Jun 20, 2019, 8:02:48 AM6/20/19
to
On Wed, 19 Jun 2019 20:01:04 +0200, "Ulrich Möller" posted:
Hallo Ulrich,

Danke für den Link.

Der grundsätzliche Unterschied zwischen Long und LongPTR war mir bekannt.
Die Tücke liegt offenbar im Detail.

Ich weiß, dass ich langsam nerve :-)
Ich knabbere immer noch an einer Sache rum.

Eine Prozedur läuft unter A 2016 32 bit problemlos.
Unter A 2016 64 bit stürzt sie gnadenlos ohne Fehlermeldung ab.
Ich sehe da im Ereignisprotokoll

MSACCESS.EXE
16.0.4813.1000
5c476102
ntdll.dll
10.0.18362.145
d3b10352
c0000005
00000000000a2e00
2d18
01d5274f83d1ec9b
C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE
C:\WINDOWS\SYSTEM32\ntdll.dll
8651568e-d3a8-4b98-8613-fc3c3e2082d9

Ausgelöst wird der Absturz durch
CopyMemory AddrList, ByVal hHostent.h_addr_list, 4
bzw.
CopyMemory Address, ByVal AddrList, 16

Wenn ich es richtig verstanden habe, dann gibt die Ziffer am Ende der Zeile
die Anzahl der Daten an, die kopiert werden sollen.
Ich habe das mal so aus anderem Code, den ich im Internet gefunden habe,
übernommen.
Und wie bereits gesagt: Unter Access 32 bit funktioniert das ja auch.

Sage ich stattdessen
CopyMemory AddrList, ByVal hHostent.h_addr_list, 0
Läuft die Zeile ohne Absturz durch.
Der Wert von hHostent.h_addr_list wird dann aber nicht in AddrList kopiert.

Die Deklarationen sehen wie folgt aus:
Private Declare PtrSafe Function CopyMemory Lib "kernel32.dll" Alias
"RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
As LongPtr

Private Type HOSTENT
h_name As LongPtr
h_aliases As LongPtr
h_addrtype As Integer
h_length As Integer
h_addr_list As LongPtr
End Type

Dim hHostent As HOSTENT
Dim AddrList As LongPtr
Dim Address As LongPtr

Vielleicht sehe ich ja wieder mal den Wald vor lauter Bäumen nicht.

Gruß
Jürgen

HR Ernst

unread,
Jun 20, 2019, 8:43:50 AM6/20/19
to
Hast du meine 2 Links gelesen oder bin ich bei dir auch im Fiklter?

--
Gruß

HR Ernst

Ulrich Möller

unread,
Jun 20, 2019, 12:28:51 PM6/20/19
to
Hallo Jürgen,
ohne jetzt weiter auf deine konkrete Problemstellung einzugehen, vermute
ich mal, daß dort mit dem CopyMemory falsche Speicherbereiche
überschrieben werden. Entweder du findest noch ein korrektes und
funktionierendes Beispiel für den Umgang mit der Hostent-Struktur in
64Bit VBA oder du mußt dich selber in das Thema einarbeiten. Als
Einstieg vielleicht ein paar Artikel von Joshua Honig auf bytecomb.com?

Gruß Ulrich

Jürgen Meyer

unread,
Jun 20, 2019, 12:55:12 PM6/20/19
to
On Thu, 20 Jun 2019 14:43:49 +0200, "HR Ernst" posted:

>Hast du meine 2 Links gelesen oder bin ich bei dir auch im Fiklter?

Nö, warum im Filter? Ich freue mich über jede zielführende Antwort.
Aber der eine Link war identisch mit dem, den auch Ulrich gepostet hat.

Ich versuche nur, einen Thread möglichst kurz zu halten.
Ich habe da nur so meine Probleme mit Threads wo jemand eine konkrete Frage
stellt und es dann unzählige Beiträge gibt, die mit dem ursprünglichen Thread
absolut nichts mehr zu tun haben.
Das Ergebnis ist, das wirklich wichtige Informationen überlesen werden.

Ich vermisse die alten Zeiten, als in der englischen Accessgroup noch Leute
wie Dave Ashish, Terry Craft und andere Gurus aktiv waren. Einige von denen
haben ja sogar eine Zeitlang selbst bei MS in der Access-Entwicklung
gearbeitet. Da kamen die Tipps und Codeschnipsel also sozusagen aus erster
Hand.

Gruß
Jürgen

Peter Doering

unread,
Jun 23, 2019, 9:41:46 AM6/23/19
to
Hallo,
Philipp Stiefel hat das wichtigste auf einer Seite zusammengefasst, auch
zum Thema Long vs. LongLong vs. LongPtr, siehe
https://codekabinett.com/rdumps.php?Lang=2&targetDoc=windows-api-declaration-vba-64-bit

Die Deklarationen der jeweiligen APIs findest du in der Textdatei namens
Win32API_PtrSafe.TXT. Dazu musst du die Dateien unter folgendem Link
installieren:
https://www.microsoft.com/en-us/download/details.aspx?id=9970

Übrigens, Dev (nicht Dave) Ashish und Terry Kreft (nicht Craft) haben beide
nie bei Microsoft gearbeitet, der vor ein paar Jahren (leider und viel zu
früh) verstorbene Michael Kaplan aka MichKa dagegen schon. ;-)

Gruss - Peter

Jürgen Meyer

unread,
Jun 23, 2019, 12:09:24 PM6/23/19
to
On Sun, 23 Jun 2019 15:41:46 +0200, "Peter Doering" posted:

>>Übrigens, Dev (nicht Dave) Ashish und Terry Kreft (nicht Craft) haben beide
>nie bei Microsoft gearbeitet, der vor ein paar Jahren (leider und viel zu
>früh) verstorbene Michael Kaplan aka MichKa dagegen schon. ;-)
>
>Gruss - Peter

Hallo Peter,
Danke für die Korrektur.
Ja, deswegen schrieb ich auch:
Einige von denen …
Das bezog sich auf Gurus

Schöne Sonntagsgrüße
Jürgen
0 new messages