2017-09-26 70 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