2017-09-26 69 views
0

我在Windows 32位中使用了vba代碼。現在我已經遷移到Windows 10 64位,我收到了消息:「此項目中的代碼應該更新以用於64位系統,請檢查並更新Declare語句,然後使用PtrSafe屬性標記它們。」我有申報的命令如下:在Win64 VBA Office中聲明語句

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 

我看了一些文檔,但使用龍龍和LongPtr語句時,我真的不能明白。或者,如果它只是在Declare語句中聲明PtrSafe。

鏈接到微軟的文檔 https://msdn.microsoft.com/en-us/library/office/ee691831(v=office.14).aspx

有人能幫助我嗎?

+0

您使用'LongPtr'當數據類型需要代表指針或大小的數據類型(例如手柄)。無論指針大小如何,當您需要一個總是64位的64位整數時,您可以使用「LongLong」。在MSDN中查找您正在使用的函數和結構的原始C++簽名,請參閱https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx要學習哪些歸結爲'PVOID'或具有'#if',這取決於平臺給予它們不同的大小,而那些將是'LongPtr's。 – GSerg

回答

0

嘗試用這些(未測試的)替換它們


GetUserNameEx 64位/ 64位

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 

#If VBA7 Then 
    Public Declare PtrSafe Function GetUserNameEx Lib "Secur32.dll" Alias "GetUserNameExA" (ByVal NameFormat As EXTENDED_NAME_FORMAT, ByVal lpNameBuffer As String, ByRef lpnSize As Long) As Long 
#Else 
    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 
#End If 

GetOpenFileName 64位/ 64位

Type OPENFILENAME 
     lStructSize As Long 
     hwndOwner As LongPtr 
     hInstance As LongPtr 
     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 LongPtr 
     lpfnHook As LongPtr 
     lpTemplateName As String 
'#if (_WIN32_WINNT >= 0x0500) 
     pvReserved As LongPtr 
     dwReserved As Long 
     FlagsEx As Long 
'#endif // (_WIN32_WINNT >= 0x0500) 
End Type 

#If VBA7 Then 
    Private Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 
#Else 
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long 
#End If 

的ShellExecute 64位/ 64位

#If VBA7 Then 
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr 
#Else 
    Private 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 
#End If 
+0

我相信你的'Long'應該是'VBA 7的'LongPtr'',我懷疑這可以可靠地工作。不過,我並不熟悉所有這些功能。 –

+0

感謝Paul Bica的貢獻。我不知道它是否有效。我只是意識到處理Recordcount的所有Long變量都必須更改爲LongLong。所以我不能真正測試你的解決方案是否工作。首先我需要轉換所有我的長變量,並且有很多。 –

+1

'Function ShellExecute ...(ByVal hwnd As LongPtr,...)as LongPtr',否則我相信你說得對。 – GSerg

0

您使用LongPtr當它涉及一個內存地址和長時,它僅僅是一個數字。只要您在聲明中使用LongPtr,請包括PtrSafe。 所以你的ShellExecute聲明將被(測試):

#If VBA7 Then 
Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (_ 
     ByVal hWnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _ 
     ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr 
#Else 
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 
#End If 
+0

當它涉及內存地址時 - 不,它涉及一個指針大小的任何東西。這包括操作系統句柄(不是內存地址)。 – GSerg

+0

如果有什麼東西是指針大小的,那是因爲內存地址需要適合那裏。就像一個經常是一個的手柄一樣。 – itsLex