Habe schon alle Declare fuctions auf PtrSafe geaendert und mit LongPtr rumgedoktert
Da liegt auch schon das Problem... "herumdoktern" ist gar nicht notwendig, weil es ein Schema gibt. Man muss sich nur damit auseinander setzen. ;)
Beispiel:
Private Declare Function GetSystemMetrics Lib "user32.dll" ( _
ByVal nIndex As Long) As Long
Im Zweifel liefert einem Tante Google die Seite von Microsoft, auf welcher diese Funktion dokumentiert ist.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetrics
Dann schaut man sich dort alle Datentypen genauer an (auch den von der Funktionsrückgabe).
Dann stellt man fest, dass sowohl nIndex als auch der Funktionsrückgabetyp den Datentyp int haben (in VBA entspricht das Long).
Und dann wird daraus:
Private Declare PtrSafe Function GetSystemMetrics Lib "user32.dll" ( _
ByVal nIndex As Long) As Long
uuuuund fertsch!
Es geht aber oft noch einfacher...
- Dokumentation sorgfältig studieren und darauf achten ob irgendwo Zeiger vorkommen.
Es geht aber oft noch einfacher...
- LongPtr ist nur dort relevant, wo es um Zeiger und Handles geht. Solche Parameter beginnen der Regel nach mit lp (=long pointer) oder h (=handle) - ganz klassisch z.B. ist der Parameter hwnd ... ein Fenster-Handle.
- Eine Besonderheit gibt es bei Zeichenketten (String) - z.B. bei der API Funktion GetWindowTextA(). Dort gibt es einen Parameter lpString der, wie man am lp sieht, ein Zeiger ist. In VBA kann man hier allerdings getrost lpString As String schreiben (lpString As LongPtr wäre auch ok, aber dann wäre es etwas umständlicher an den Text zu gelangen).
|