I have used vba code in Windows 32 bit. Now that I've migrated to Windows 10 64 bit I got the message "The code in this project should be updated for use on 64-bit systems. Please review and update Declare statements and then mark them with PtrSafe attribute." The Declare commands I have are the following:
Public Declare Function GetUserNameEx Lib "Secur32.dll" Alias "GetUserNameExA" ( _
ByVal NameFormat As EXTENDED_NAME_FORMAT, _
ByVal lpNameBuffer As String, _
ByRef lpnSize As Long) As Long
Public Enum EXTENDED_NAME_FORMAT
NameUnknown = 0
NameFullyQualifiedDN = 1
NameSamCompatible = 2
NameDisplay = 3
NameUniqueId = 6
NameCanonical = 7
NameUserPrincipal = 8
NameCanonicalEx = 9
NameServicePrincipal = 10
NameDnsDomain = 12
End Enum
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Public Declare Function ShellExecute _
Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) _
As Long
I've looked at some documentation but I can not really understand when using the LongLong and LongPtr statements. Or if it's only declare PtrSafe in the Declare statement.
Link to MicroSoft documentation https://msdn.microsoft.com/en-us/library/office/ee691831(v=office.14).aspx
Can someone help me?
LongPtr
when the data type needs to represent a pointer or a pointer-sized data type (e.g. a handle). You useLongLong
when you need a 64-bit integer that will always be 64 bits regardless of the pointer size. Look up in the MSDN the original C++ signatures of the functions and structures you are using, refer to msdn.microsoft.com/en-us/library/windows/desktop/… to learn which ones boil down toPVOID
or have an#if
that gives them different size depending on the platform, and those will beLongPtr
s. – Yap