Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Probleme mit Datentypen bei Umstellung von 32Bit auf 64Bit

Begonnen von Hias90, Juni 30, 2023, 09:35:23

⏪ vorheriges - nächstes ⏩

Hias90

Hallo zusammen,

ich hoffe ihr könnt mir einen Tipp geben bei meinem Problem.

Hier schonmal der Code:

Function GetHash(baData() As Byte, ByVal eType As UcsHashAlgorithmType) _
         As String
  Dim hBaseProvider As LongPtr
  Dim hHash    As LongPtr
  Dim lSize    As LongPtr
  Dim baBuffer() As Byte
  Dim lIdx     As Integer

  If CryptAcquireContext(hBaseProvider, 0, StrPtr(MS_DEFAULT_PROVIDER), _
                         PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
    If CryptCreateHash(hBaseProvider, eType, 0, 0, hHash) <> 0 Then
      If CryptHashData(hHash, baData(0), UBound(baData) + 1, 0) <> 0 Then
        If CryptGetHashParam(hHash, HP_HASHSIZE, lSize, 4, 0) <> 0 Then
          ReDim baBuffer(0 To lSize - 1) As Byte
          If CryptGetHashParam(hHash, HP_HASHVAL, baBuffer(0), lSize, 0) _
             <> 0 Then
            For lIdx = 0 To UBound(baBuffer)
              GetHash = GetHash & Right$("0" & Hex(baBuffer(lIdx)), 2)
            Next lIdx
          End If
        End If
      End If
      Call CryptDestroyHash(hHash)
    End If
    Call CryptReleaseContext(hBaseProvider, 0)
  End If
End Function


Ich muss dazu sagen, das ich iwann diesen Code bekommen hatte und der Teil einer Benutzersteuerung ist.

Speziell der Teil, soll die Eingaben Decodieren der Name des Modules lauter "EncodDecodePW".

Ich habe versucht nach gefunden Vorgaben, folgende Änderungen durch zu führen:

- alle Datentypen von Long auf LongPtr geändert
- Declare Function über eine #If VBA7 Abfrage ggf. zu Declare PtrSafe Function zu ändern.

Mit dem Kompilieren bin ich dann meinen Code durch gegangen und habe alles bereinigt bis auf die eine Stelle:

ReDim baBuffer(0 To lSize - 1) As Byte     

Hier hat er ein Problem mit dem "-" es kommt der Fehler: Typen unverträglich

Wenn meine mittelmäßigen Kenntnisse nicht falsch sind, kann er von LongPtr nichts abziehen?

Ich habe auch gesehen, das eben baBuffer vom Type Byte ist und wenn ich lSize als Integer setze, mosert der Kompilierer nicht mehr, aber steigt dann eine Zeile Später aus bei:

If CryptGetHashParam(hHash, HP_HASHVAL, baBuffer(0), lSize, 0) _

Das seltsame war, zuvor ging alles bei 32Bit super wo es als Long deklariert war jetzt mit LongPtr stört es auf einmal.

Ich hoffe, ich konnte mein Problem schildern und brauche dringend eure Hilfe.

Bei Fragen werde ich versuchen bestmöglichst zu Antworten.

Vielen Dank



PhilS

Zitat von: Hias90 am Juni 30, 2023, 09:35:23Ich habe versucht nach gefunden Vorgaben, folgende Änderungen durch zu führen:

- alle Datentypen von Long auf LongPtr geändert
Das ist so pauschal aber nicht richtig. Du musst nur die Deklarationen ändern, die tatsächlich LongPtr sind.
Das Argument pdwDataLen für CryptGetHashParam ist ein DWORD und somit auch auf der 64bit-Plattform ein Long.

Zitat von: Hias90 am Juni 30, 2023, 09:35:23ReDim baBuffer(0 To lSize - 1) As Byte     

Hier hat er ein Problem mit dem "-" es kommt der Fehler: Typen unverträglich
Es ist kein Problem von einem LongPtr (Long oder LongLong) eine Ganzzahl abzuziehen. Es könnte aber sein, dass die Deklaration des Array mit einem LongLong als Obergrenze nicht zulässig ist. - Ich habe gerade keine 64bit Installation im direkten Zugriff um das zu testen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

Zitat von: PhilS am Juni 30, 2023, 12:01:37Es könnte aber sein, dass die Deklaration des Array mit einem LongLong als Obergrenze nicht zulässig ist.

Genau so ist es.

Hias90

#3
Hallo,

konnte leider jetzt erst die Vorschläge testen.

Hab nochmal alles zurück gesetzt auf Long und nur die Funktionen mit einer Abfrage nach VBA7 und Win64 mit PtrSafe ergänzt.

Jetzt bekomme ich ein Problem mit der Funktion StrPtr (Typen unverträglich).

Ich komme einfach nicht dahinter, wie ich das abstellen kann =(.


Hier nochmal der Code, so wie er jetzt ist:

Option Compare Database
Option Explicit

Public GlobalUsername As String
Public Zwischenspeicher As String
'Public pubEQnummerID_f As Long
'Public pubEQnummer As String
'Public pubKstID_f As Long
'Public pubBnummer As String
'Public pubArtikelID As Long
'Public pubArtikelID_f As Long
'Public pubAnlageID As Long
Public GlobalerStatus As Long

'von Nouba - www.office-loesung.de
'-- für CryptAcquireContext
Public Const MS_DEFAULT_PROVIDER As String = _
        "Microsoft Base Cryptographic Provider v1.0"
Public Const PROV_RSA_FULL           As Long = 1
Public Const CRYPT_VERIFYCONTEXT     As Long = &HF0000000
'-- für CryptGetHashParam
Public Const HP_HASHVAL              As Long = 2
Public Const HP_HASHSIZE             As Long = 4

#If VBA7 Or Win64 Then
  Public Declare PtrSafe Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As Long, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal AlgId As Long, _
          ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long
  Public Declare PtrSafe Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare PtrSafe Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As Long) As Long
#Else
  Public Declare Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As Long, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal AlgId As Long, _
          ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long
  Public Declare Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As Long) As Long
#End If

Public Enum UcsHashAlgorithmType
  CALG_MD5 = &H8003&
  CALG_SHA1 = &H8004&
End Enum

Function GetHash(baData() As Byte, ByVal eType As UcsHashAlgorithmType) _
         As String
  Dim hBaseProvider As Long
  Dim hHash    As Long
  Dim lSize    As Long
  Dim baBuffer() As Byte
  Dim lIdx     As Long

  If CryptAcquireContext(hBaseProvider, 0, StrPtr(MS_DEFAULT_PROVIDER), _
                         PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
    If CryptCreateHash(hBaseProvider, eType, 0, 0, hHash) <> 0 Then
      If CryptHashData(hHash, baData(0), UBound(baData) + 1, 0) <> 0 Then
        If CryptGetHashParam(hHash, HP_HASHSIZE, lSize, 4, 0) <> 0 Then
          ReDim baBuffer(0 To lSize - 1) As Byte
          If CryptGetHashParam(hHash, HP_HASHVAL, baBuffer(0), lSize, 0) _
             <> 0 Then
            For lIdx = 0 To UBound(baBuffer)
              GetHash = GetHash & Right$("0" & Hex(baBuffer(lIdx)), 2)
            Next lIdx
          End If
        End If
      End If
      Call CryptDestroyHash(hHash)
    End If
    Call CryptReleaseContext(hBaseProvider, 0)
  End If
End Function

'Sub TestHash()
'  Dim s() As Byte
'
'  s = StrConv("derArb", vbFromUnicode) '-- ==>
'  Debug.Print "MDA5:  " & GetHash(s, CALG_MD5)  '-- ==> MD5-Digest
'  Debug.Print "SHA-1: " & GetHash(s, CALG_SHA1) '-- ==> SHA1-Digest
'
'  s = "derArb"
'  Debug.Print "MDA5:  " & GetHash(s, CALG_MD5)  '-- ==> MD5-Digest
'  Debug.Print "SHA-1: " & GetHash(s, CALG_SHA1) '-- ==> SHA1-Digest
'End Sub

''TempVar-Variable "TestVariable" erstellen
'TempVars.Add "globalerBearbeiter", 0
'
''Der TempVar-Variable "TestVariable" den Wert "Test" übergeben
''TempVars("globalerBearbeiter").Value = "Test"
'
''Den Wert der TempVar-Variable "TestVariable" in einem ungebundenen Textfeld "TempVarAnzeigen" anzeigen.
''Me!TempVarAnzeigen = TempVars("TestVariable").Value


Selbst wenn ich die Zeile:

  If CryptAcquireContext(hBaseProvider, 0, StrPtr(MS_DEFAULT_PROVIDER), _
                         PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then

ausblende (+ 1x End If) läuft zwar der Code durch, aber er bringt mir keinen Treffer beim eingeben meiner Anmeldedaten.

Unter Win 32 Office 2016 läuft es super, nur eben jetzt unter Win 64 und Office 365 nicht mehr.

PhilS

Zitat von: Hias90 am Juli 06, 2023, 13:42:21Hab nochmal alles zurück gesetzt auf Long und nur die Funktionen mit einer Abfrage nach VBA7 und Win64 mit PtrSafe ergänzt.

Jetzt bekomme ich ein Problem mit der Funktion StrPtr (Typen unverträglich).

Ich komme einfach nicht dahinter, wie ich das abstellen kann =(.
Das war aber nicht mein Vorschlag!
Ich schrieb:
ZitatDu musst nur die Deklarationen ändern, die tatsächlich LongPtr sind.

Wenn du die StrPtr-Funktion verwendest, bekommst du einen LongPtr zurück, der unter 64bit ein LongLong ist und somit als Datentyp "nicht verträglich" mit dem vom dir deklarierten pszProvider As Long ist.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Hias90

Hallo zusammen,

ich habe mich jetzt nochmal dran gemacht und hab immer nur das zu LongPtr, wo es ein Problem gab.

Ich fürchte meine Kenntnisse reichen nicht aus um hier wirklich weiter zu kommen.

Oder ich verstehe eure Tipps einfach nicht wirklich =(.

Jetzt bin ich wieder soweit wie oben, das er ein Problem mit dem - hat.

Wenn ich es richtig verstanden hatte, war es ja das Problem von lSize wo ich als LongPtr gesetzt habe und somit -1 nicht mehr geht.

Wenn ich aber lSize nicht als LongPtr setze, dann bekomme ich für lSize ein Problem, da dies in der Funktion zuvor auch verwendet wird und ein LongPtr dann sein muss.

Das ist ein Teufelskreis, wieso muss es nur so kompliziert sein das mit 64Bit und Office 365 zu nutzen =(.

Kann mir bitte bitte jemand helfen das in Griff zu bekommen? Brauche das echt dringend wieder =(

Hier mal der aktuelle Stand des Codes:

Option Compare Database
Option Explicit

Public GlobalUsername As String
Public Zwischenspeicher As String
'Public pubEQnummerID_f As Long
'Public pubEQnummer As String
'Public pubKstID_f As Long
'Public pubBnummer As String
'Public pubArtikelID As Long
'Public pubArtikelID_f As Long
'Public pubAnlageID As Long
Public GlobalerStatus As Long

'von Nouba - www.office-loesung.de
'-- für CryptAcquireContext
Public Const MS_DEFAULT_PROVIDER As String = _
        "Microsoft Base Cryptographic Provider v1.0"
Public Const PROV_RSA_FULL          As Long = 1
Public Const CRYPT_VERIFYCONTEXT    As Long = &HF0000000
'-- für CryptGetHashParam
Public Const HP_HASHVAL              As Long = 2
Public Const HP_HASHSIZE            As Long = 4

#If VBA7 Or Win64 Then
  Public Declare PtrSafe Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As Long, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As LongPtr, ByVal AlgId As LongPtr, _
          ByVal hKey As LongPtr, ByVal dwFlags As LongPtr, phHash As LongPtr) As LongPtr
  Public Declare PtrSafe Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As LongPtr, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As LongPtr
  Public Declare PtrSafe Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare PtrSafe Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As LongPtr, ByVal dwParam As LongPtr, pbData As Any, _
          pdwDataLen As LongPtr, ByVal dwFlags As LongPtr) As LongPtr
#Else
  Public Declare Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As Long, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal AlgId As Long, _
          ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long
  Public Declare Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As Long) As Long
#End If

Public Enum UcsHashAlgorithmType
  CALG_MD5 = &H8003&
  CALG_SHA1 = &H8004&
End Enum

Function GetHash(baData() As Byte, ByVal eType As UcsHashAlgorithmType) _
        As String
  Dim hBaseProvider As LongPtr
  Dim hHash    As LongPtr
  Dim lSize    As LongPtr
  Dim baBuffer() As Byte
  Dim lIdx    As Long

'  If CryptAcquireContext(hBaseProvider, 0, StrPtr(MS_DEFAULT_PROVIDER), _
'                        PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
    If CryptCreateHash(hBaseProvider, eType, 0, 0, hHash) <> 0 Then
      If CryptHashData(hHash, baData(0), UBound(baData) + 1, 0) <> 0 Then
        If CryptGetHashParam(hHash, HP_HASHSIZE, lSize, 4, 0) <> 0 Then
          ReDim baBuffer(0 To lSize - 1) As Byte
          If CryptGetHashParam(hHash, HP_HASHVAL, baBuffer(0), lSize, 0) _
            <> 0 Then
            For lIdx = 0 To UBound(baBuffer)
              GetHash = GetHash & Right$("0" & Hex(baBuffer(lIdx)), 2)
            Next lIdx
          End If
        End If
      End If
      Call CryptDestroyHash(hHash)
    End If
    Call CryptReleaseContext(hBaseProvider, 0)
'  End If
End Function
 

PhilS

#6
Zitat von: Hias90 am Juli 11, 2023, 14:43:45Oder ich verstehe eure Tipps einfach nicht wirklich =(.
Es scheint so. Ich verstehe nur nicht warum, weil die meisten doch klar formuliert waren.
Hier nochmal eine Zusammenfassung:
  • Es gibt kein Problem mit dem -, sondern es ist nicht möglich ein Array mit einen LongPtr (LongLong) als Größenangabe zu deklarieren. Das ist aber kein Problem weil ....
  • Das Argument pdwDataLen für CryptGetHashParam ist ein DWORD und somit auch auf der 64bit-Plattform ein Long.
  • Das Argument pszProvider für die Funktion CryptAcquireContext muss ein LongPtr sein, weil du dort einen Zeiger (Pointer, Ptr) auf den String mit dem Namen des Providers übergibst.

Versuch das doch mal Schritt für Schritt umzusetzen.

Es gibt evtl. noch weitere Probleme mit den Funktionen. - Die werden aber erst zutage treten, wenn du die bisherigen Probleme behoben hast.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Hias90

#7
Hallo PhilS,

Mein Problem war, das ich das versucht hatte und dann weiter versucht habe wo Fehler kamen einfach mit LongPtr zu umgehen ect. Bis ich wieder an einem Punkt ankam.

Werde jetzt Stück für Stück machen was du meintest.

Habe meinen zuletzt geposteten Code mit deinen Hinweise angepasst.

Leider kommt wieder der Fehler bei lSize - 1.

Option Compare Database
Option Explicit

Public GlobalUsername As String
Public Zwischenspeicher As String
'Public pubEQnummerID_f As Long
'Public pubEQnummer As String
'Public pubKstID_f As Long
'Public pubBnummer As String
'Public pubArtikelID As Long
'Public pubArtikelID_f As Long
'Public pubAnlageID As Long
Public GlobalerStatus As Long

'von Nouba - www.office-loesung.de
'-- für CryptAcquireContext
Public Const MS_DEFAULT_PROVIDER As String = _
        "Microsoft Base Cryptographic Provider v1.0"
Public Const PROV_RSA_FULL           As Long = 1
Public Const CRYPT_VERIFYCONTEXT     As Long = &HF0000000
'-- für CryptGetHashParam
Public Const HP_HASHVAL              As Long = 2
Public Const HP_HASHSIZE             As Long = 4

#If VBA7 Or Win64 Then
  Public Declare PtrSafe Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As LongPtr, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As LongPtr, ByVal AlgId As LongPtr, _
          ByVal hKey As LongPtr, ByVal dwFlags As LongPtr, phHash As LongPtr) As LongPtr
  Public Declare PtrSafe Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As LongPtr, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As LongPtr
  Public Declare PtrSafe Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare PtrSafe Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As LongPtr, ByVal dwParam As LongPtr, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As LongPtr) As LongPtr
#Else
  Public Declare Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As Long, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal AlgId As Long, _
          ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long
  Public Declare Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As Long) As Long
#End If

Public Enum UcsHashAlgorithmType
  CALG_MD5 = &H8003&
  CALG_SHA1 = &H8004&
End Enum

Function GetHash(baData() As Byte, ByVal eType As UcsHashAlgorithmType) _
         As String
  Dim hBaseProvider As LongPtr
  Dim hHash    As LongPtr
  Dim lSize    As LongPtr
  Dim baBuffer() As Byte
  Dim lIdx     As Long

  If CryptAcquireContext(hBaseProvider, 0, StrPtr(MS_DEFAULT_PROVIDER), _
                         PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
    If CryptCreateHash(hBaseProvider, eType, 0, 0, hHash) <> 0 Then
      If CryptHashData(hHash, baData(0), UBound(baData) + 1, 0) <> 0 Then
        If CryptGetHashParam(hHash, HP_HASHSIZE, lSize, 4, 0) <> 0 Then
          ReDim baBuffer(0 To lSize - 1) As Byte
          If CryptGetHashParam(hHash, HP_HASHVAL, baBuffer(0), lSize, 0) _
             <> 0 Then
            For lIdx = 0 To UBound(baBuffer)
              GetHash = GetHash & Right$("0" & Hex(baBuffer(lIdx)), 2)
            Next lIdx
          End If
        End If
      End If
      Call CryptDestroyHash(hHash)
    End If
    Call CryptReleaseContext(hBaseProvider, 0)
  End If
End Function


Oder meintest du den Ursprünglichen Code (alles Long außer pszProvider):

Option Compare Database
Option Explicit

Public GlobalUsername As String
Public Zwischenspeicher As String
'Public pubEQnummerID_f As Long
'Public pubEQnummer As String
'Public pubKstID_f As Long
'Public pubBnummer As String
'Public pubArtikelID As Long
'Public pubArtikelID_f As Long
'Public pubAnlageID As Long
Public GlobalerStatus As Long

'von Nouba - www.office-loesung.de
'-- für CryptAcquireContext
Public Const MS_DEFAULT_PROVIDER As String = _
        "Microsoft Base Cryptographic Provider v1.0"
Public Const PROV_RSA_FULL           As Long = 1
Public Const CRYPT_VERIFYCONTEXT     As Long = &HF0000000
'-- für CryptGetHashParam
Public Const HP_HASHVAL              As Long = 2
Public Const HP_HASHSIZE             As Long = 4

#If VBA7 Or Win64 Then
  Public Declare PtrSafe Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As LongPtr, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal AlgId As Long, _
          ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long
  Public Declare PtrSafe Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare PtrSafe Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare PtrSafe Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As Long) As Long
#Else
  Public Declare Function CryptAcquireContext Lib "Advapi32" _
          Alias "CryptAcquireContextW" ( _
          phProv As Long, ByVal pszContainer As Long, _
          ByVal pszProvider As Long, ByVal dwProvType As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptReleaseContext Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal dwFlags As Long) As Long
  Public Declare Function CryptCreateHash Lib "Advapi32" ( _
          ByVal hProv As Long, ByVal AlgId As Long, _
          ByVal hKey As Long, ByVal dwFlags As Long, phHash As Long) As Long
  Public Declare Function CryptHashData Lib "Advapi32" ( _
          ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, _
          ByVal dwFlags As Long) As Long
  Public Declare Function CryptDestroyHash Lib "Advapi32" ( _
          ByVal hHash As Long) As Long
  Public Declare Function CryptGetHashParam Lib "Advapi32" ( _
          ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, _
          pdwDataLen As Long, ByVal dwFlags As Long) As Long
#End If

Public Enum UcsHashAlgorithmType
  CALG_MD5 = &H8003&
  CALG_SHA1 = &H8004&
End Enum

Function GetHash(baData() As Byte, ByVal eType As UcsHashAlgorithmType) _
         As String
  Dim hBaseProvider As Long
  Dim hHash    As Long
  Dim lSize    As Long
  Dim baBuffer() As Byte
  Dim lIdx     As Long

  If CryptAcquireContext(hBaseProvider, 0, StrPtr(MS_DEFAULT_PROVIDER), _
                         PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
    If CryptCreateHash(hBaseProvider, eType, 0, 0, hHash) <> 0 Then
      If CryptHashData(hHash, baData(0), UBound(baData) + 1, 0) <> 0 Then
        If CryptGetHashParam(hHash, HP_HASHSIZE, lSize, 4, 0) <> 0 Then
          ReDim baBuffer(0 To lSize - 1) As Byte
          If CryptGetHashParam(hHash, HP_HASHVAL, baBuffer(0), lSize, 0) _
             <> 0 Then
            For lIdx = 0 To UBound(baBuffer)
              GetHash = GetHash & Right$("0" & Hex(baBuffer(lIdx)), 2)
            Next lIdx
          End If
        End If
      End If
      Call CryptDestroyHash(hHash)
    End If
    Call CryptReleaseContext(hBaseProvider, 0)
  End If
End Function

Hier kommt erstmal keine Fehlermeldung, aber beim Eingabe des Usernamens, findet er keinen Treffer.

Der Username ist aber vorhanden und geht unter 32 Bit Office 2016 tadellos.

Hast du hier eine Idee?

Habe noch die 32Bit / 2016 Version mit der 64Bit/ 365 Version parallel im Code verglichen und bei der Zeile:

    If CryptCreateHash(hBaseProvider, eType, 0, 0, hHash) <> 0 Then

Gibt es schon den ersten Unterschied:

                                           32Bit/2016:                64Bit/365:

hBaseProvider =              241496232                -1082755856
hHash =                             286921960                0                                               
 

PhilS

Zitat von: Hias90 am Juli 12, 2023, 15:07:26Leider kommt wieder der Fehler bei lSize - 1.
Wie bereits erwähnt, entsteht dieser Fehler deshalb, weil du weiterhin eine LongPtr-Variable für die Dimensionierung des Arrays verwendest.

Zitat von: Hias90 am Juli 12, 2023, 15:07:26Oder meintest du den Ursprünglichen Code (alles Long außer pszProvider):
Ich habe für die konkret genannten Funktionen/Argumente mehrfach geschrieben, was ich meine.
Alles darüber hinaus muss man einzeln anschauen und dann für jeden einzelnen Fall entweder entsprechend ändern oder nicht.

Du hast aber Glück. Die ursprünglichen Funktionen waren überschaubar und das Thema noch nicht so intensiv anderswo behandelt, deshalb habe ich den Code von Nouba, denn du verwendest überarbeitet und in folgenden Kontext zum Download bereitgestellt. ->MD5 and SHA-1 Hashes in VBA


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

@Hias90,
also wenn man sich mit solchen Aufgaben beschäftigt, muss man sich mit Grundlagen beschäftigen oder man bezahlt wenn, der bereit ist, sich Wissen anzueignen.

Hier eine perfekte Anleitung zu dem Thema auf der Website von PhilS.

https://codekabinett.com/rdumps.php?Lang=1&targetDoc=windows-api-deklaration-vba-64-bit

Da kannst du dich einlesen.

Aber ohne Anstrengung wird das nichts...

Hias90


Hallo zusammen,

@PhilS Vielen Dank das hat super geklappt, musste nur den Functionsnamen wieder anpassen.
Und ich hab wirklich versucht alles nach Anleitung von dir zu machen, hab mich sogar am Wochenende 4h mit jemand unterhalten, um all das besser zu verstehen.
Aber von dem Expertenwissen bin ich noch weit weg, was ich auf jedenfall ändern möchte.

@markusxy Wie ich beschrieben hatte, wollte ich mir damals eine Benutzerverwaltung erstellen und bekam dann freundlicherweise diesen Code und musste in der Programmierung von diesem nie etwas ändern.
Das heißt aber nicht, das ich mein Wissen nicht gerne aufstocken will, werde mir den Link sorgfältig durchlesen.

markusxy

Zitat von: Hias90 am Juli 17, 2023, 08:29:35Das heißt aber nicht, das ich mein Wissen nicht gerne aufstocken will, werde mir den Link sorgfältig durchlesen.

Kann ich nur empfehlen, die beste Anleitung die mir bis heute untergekommen ist.