Mon programme vb6 fonctionnait sur 32 bits. Maintenant, je dois le déplacer en 64 bits.

La lib que je déclare sous le code, le système ne semble pas pouvoir l'obtenir. Déclarer:

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

Code d'exécution:

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

J'ai le message d'erreur

Error 91:Object variable or With block variable not set

Presque les gens disent qu'il faut ajouter "ptrsafe" après Declare mais il n'y a pas de ptrsafe dans vb6.

Comment puis-je déclarer la fonction lib sans "ptrsafe" dans le 64bit et vb6?

2
鄭有維 15 août 2017 à 06:12

2 réponses

Vos déclarations de fonctions sont fausses. Il n'est pas nécessaire d'ajouter le chemin complet de Lib , seul le nom de la bibliothèque est nécessaire. En ajoutant le chemin, votre code échoue sur un environnement de système d'exploitation 32 bits, car le dossier "C:\Windows\SysWOW64 n'existe pas sur les systèmes 32 bits.

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

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

1
Giorgio Brausi 15 août 2017 à 16:28

Puisque vous parlez de déclarations API, ce qui suit peut être utile. VB6 ne reconnaît pas le type de données LongLong (entier 64 bits), mais il peut être falsifié à l'aide du type de données VB6 Currency. Les numéros de devise sont en fait stockés sous forme d'entiers 64 bits. Les quatre décimales ne sont affichées à l'écran qu'en divisant le nombre réel par 10 000. Selon les appels d'API spécifiques que vous utilisez, vous devrez peut-être disposer de deux déclarations d'API et sélectionner la bonne au moment de l'exécution. Vous devez donc également être en mesure de détecter le "bitness" du système en cours d'exécution.

Voir les liens suivants:

Détecter Bitness

Faux entiers 64 bits

0
thx1138v2 17 août 2017 à 00:36