如何在64位环境中声明没有ptrsafe的函数?

时间:2017-08-15 03:12:05

标签: vba vb6 64-bit 32bit-64bit

我的vb6程序运行在32位。 现在我必须把它移到64位。

我在代码下面声明的lib,系统似乎无法得到它。 声明:

Public Declare Function LogonUser Lib "advapi32.dll" _
Alias "LogonUserA" (ByVal lpszUsername As String, _
ByVal lpszDomain As String, ByVal lpszPassword As String, _
ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, _
phToken As Long) As Long

Public Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
Public Declare Function RevertToSelf Lib "advapi32.dll" () As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

运行代码:

Public Sub Logon(ByVal strAdminUser As String, ByVal _
    strAdminPassword As String, ByVal strAdminDomain As String)
    Dim lngTokenHandle As Long
    Dim lngLogonType As Long
    Dim lngLogonProvider As Long
    Dim blnResult As Boolean

    lngLogonType = 2
    lngLogonProvider = 0

    blnResult = RevertToSelf()

    blnResult = LogonUser(strAdminUser, strAdminDomain, strAdminPassword, _
    lngLogonType, lngLogonProvider, _
    lngTokenHandle)

    blnResult = ImpersonateLoggedOnUser(lngTokenHandle)
    CloseHandle (lngTokenHandle)

End Sub

我收到了错误消息

Error 91:Object variable or With block variable not set

几乎所有人都说需要添加" ptrsafe"在声明之后但在vb6中没有ptrsafe。

如何在没有" ptrsafe"的情况下声明函数库。在64位和vb6?

3 个答案:

答案 0 :(得分:7)

  

几乎所有人都说需要添加" ptrsafe"在声明之后但在vb6中没有ptrsafe。   如何在没有" ptrsafe"的情况下声明函数库。在64位和vb6?

VBA 需要能够在64位应用程序(例如64位Office套件中的一个程序)中运行时处理64位Windows。

VB6 永远自行运行&始终作为32位进程,它不需要64位识别,因为64位Windows很乐意模拟32位代码,无需额外的步骤。

由于不需要这种指针安全类型,所以在VB6中使用32位约定(Long)。

答案 1 :(得分:1)

你的函数声明是错误的。 您不必为 Lib 添加完整路径,只需要库名称。 通过添加路径,您的代码在32位操作系统环境中失败,因为32位系统上不存在"C:\Windows\SysWOW64文件夹。

Public Declare Function LogonUser Lib "advapi32.dll" _
Alias "LogonUserA" (ByVal lpszUsername As String, _
ByVal lpszDomain As String, ByVal lpszPassword As String, _
ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, _
phToken As Long) As Long

   Public Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long

   Public Declare Function RevertToSelf Lib "advapi32.dll" () As Long

   Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

请参阅: https://support.microsoft.com/en-us/help/248187/how-to-impersonate-a-user-from-active-server-pages

答案 2 :(得分:0)

由于您正在讨论API声明,以下内容可能会有所帮助。 VB6无法识别LongLong数据类型(64位整数),但可以使用VB6 Currency数据类型伪造它。货币号实际上存储为64位整数。只有四位小数才会显示在显示屏上,将实际数字除以10,000。根据您使用的特定API调用,您可能需要具有双API声明并在运行时选择正确的API声明。所以你还需要能够检测到" bitness"系统正在运行。

请参阅以下链接:

Detect Bitness

Faking 64-bit Integers