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

How can I declare function without ptrsafe in 64bit environmnet?

我的 vb6 程序是 运行 在 32 位上。 现在我必须将它移动到 64 位。

我在代码下面声明的库,系统似乎无法获取它。 声明:

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

几乎有人说需要在Declare后加上"ptrsafe",但是vb6中没有ptrsafe。

如何在 64 位和 vb6 中声明没有 "ptrsafe" 的函数库?

Almost people say need to add "ptrsafe" after Declare but there is no ptrsafe in vb6. How can I declare function lib without "ptrsafe" in the 64bit and vb6 ?

VBA 需要能够处理 64 位 Windows 当它在 64 位应用程序中 运行 例如之一来自 64 位 Office 套件的程序。

VB6 运行s 永远独立并且始终作为 32 位进程,它不需要像 64 位一样识别 64 位 Windows 无需额外步骤即可愉快地模拟 32 位代码。

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

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

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

既然您在谈论 API 声明,以下内容可能会有所帮助。 VB6 无法识别 LongLong 数据类型(64 位整数),但可以使用 VB6 Currency 数据类型伪造。货币数字实际上存储为 64 位整数。四位小数仅通过将实际数字除以 10,000 来显示。根据您使用的特定 API 调用,您可能需要双重 API 声明,并在 运行 时 select 正确的声明。所以你还需要能够检测到系统的"bitness" 运行ning.

查看以下链接:

Detect Bitness

Faking 64-bit Integers