Probleme DLL Aufruf

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mueckerich
Beiträge: 220
Registriert: 13.09.2004 11:33
Wohnort: Am schönsten Flecken der Erde, zwischen PC und Motorrad

Probleme DLL Aufruf

Beitrag von mueckerich »

Hallo,

habe beim portieren eines VB-Projektes :evil: auf PB ein Problem mit einer DLL. Die DLL dient dazu eine Lizenzierung die sich als Datei auf der HD befindet auszulesen. (TNX an Frank Franzoni für CopYProtector - leider hat er das Prog. (Freeware) nicht mehr auf seiner Page www.franzoni-online.de)
Unter VB funzt :allright: das ganze. Vor dem Aufruf der Funktion in der Copy32.DLL kann ich die Strukturelemente mit dem Debug anzeigen. nach dem Aufruf schmiert das Prog. beim Zugriff auf der Strukturelemente ohne Fehlermeldung sang und klanglos ab :cry:. Vieleicht kann mir jemand von Euch sagen warum??? :praise:

Den kompletten Sourecode inklusive der Lizenzierungsdatei sowie der DLL-Beschreibung könnte ich Euch mailen.

Hier ein Auszug aus dem PB-Projekt:

Code: Alles auswählen

Enumeration
  #CP32DLL
EndEnumeration 

Structure CPLicFile
  LF_User.s
  LF_Company.s
  LF_Product.s
  LF_SystemID.s
EndStructure

Procedure CP_GetLicenseFileData(LicFile.s, LicKey.s)
  ;Lesen der Lizenzdaten aus der Lizenzierungsdatei
  LicData\LF_User = Space(#STRINGLEN_USERDATA+1) + "USER"
  LicData\LF_Company = Space(#STRINGLEN_USERDATA+1) + "COMPANY"
  LicData\LF_Product = Space(#STRINGLEN_USERDATA+1) + "PRODUCT"
  LicData\LF_SystemID = Space(#STRINGLEN_SYSTEMID+1) + "SYTEM_ID"
   
  CallDebugger
  Debug "STUKTURINHALT VOR AUFRUF DER DLL"
  Debug LicData\LF_Company
  Debug Len(LicData\LF_Company)
  Debug LicData\LF_Product
  Debug Len(LicData\LF_Product)
  Debug LicData\LF_SystemID
  Debug Len(LicData\LF_SystemID)
  Debug LicData\LF_User
  Debug Len(LicData\LF_User)
   
   
  If CP_LibOpen = #False
    ProcedureReturn
  EndIf
  If LicFile = "" 
    ProcedureReturn
  EndIf
  CallFunction(#CP32DLL, "GetLicenseFile", LicFile, @LicData, LicKey, #False )
   
  CallDebugger 
  Debug LicData\LF_Company
  Debug Len(LicData\LF_Company)
  Debug LicData\LF_Product
  Debug Len(LicData\LF_Product)
  Debug LicData\LF_SystemID
  Debug Len(LicData\LF_SystemID)
  Debug LicData\LF_User
  Debug Len(LicData\LF_User)
  CallDebugger
   
EndProcedure


If OpenLibrary(#CP32DLL,"CopyP32.DLL")
  CP_GetLicenseFileData("C:\TEST.LIC","test")
EndIf[/color]
Und so ist es in VB:

Code: Alles auswählen

'Konstanten
 'Länge der Strings in der USERDATA Struktur
Const STRINGLEN_USERDATA = 40           
'Länge des LicenceKey Strings
Const STRINGLEN_LICENCEKEY = 28 
 'Länge der eindeutigen SystemID        
Const STRINGLEN_SYSTEMID = 12  
 'Länge des Version Strings          
Const STRINGLEN_COPYPVERSION = 10  
 'Länge der Seriennummer 
Const STRINGLEN_SERIALNUMBER = 5 

 'ID's für die Berechnung einer eindeutigen SystemID  
Const ID_DEFAUL T= 0                             
Const ID_MACADDR = 1               	
Const ID_PRODUCTID = 2              	
Const ID_REGISTERD = 3              	

'Weiterhin muß Visual Basic die Strukturen USERDATA, DONGLEDATA und LICENCEFILE bekannt gemacht werden.
'USERDATA Struktur zur Aufnahme der Benutzerdaten von der Dongle Diskette
 Private Type USERDATA
    Company As String * STRINGLEN_USERDATA+1
    Version As String * STRINGLEN_USERDATA+1
    Product As String * STRINGLEN_USERDATA+1
    Comment As String * STRINGLEN_USERDATA+1
 End Type

'DONGLEDATA Struktur zur Aufnahme der Donglerdaten von der Dongle Diskette
 Private Type DONGLEDATA
    LicenceKey As String * STRINGLEN_LICENCEKEY+1
    SystemID As String * STRINGLEN_SYSTEMID+1

    CP_Version As String  * STRINGLEN_COPYPVERSION+1
    SerialNumber * STRINGLEN_SERIALNUMBER+1
 End Type

'LICENSEFILE Struktur zur Aufnahme der Daten einer Lizenzdatei
Private Type LICENCEFILE
    User As String * STRINGLEN_USERDATA+1
    Company As String * STRINGLEN_USERDATA+1
    Product As String * STRINGLEN_USERDATA+1
    SystemID As String * STRINGLEN_SYSTEMID+1
End Type

'Damit Visual Basic die Funktionen der 'copyp32.dll' aufrufen kann, müssen diese über Declare-Anweisungen eingebunden werden.

Private Declare Function GetUserData Lib "copyp32.dll" (ByVal x As Long, data As USERDATA) As Boolean
Private Declare Function GetAllowedWindowsVersions Lib "copyp32.dll" (ByVal drive As Long, ByVal sys As String, ByVal ver As String) As Boolean
Private Declare Function CalcSystemID Lib "copyp32.dll" (ByVal id As String, ByVal typ As Long) As Boolean
Private Declare Function GetDongleData Lib "copyp32.dll" (ByVal drive As Long, data As DONGLEDATA, ByVal Code As String) As Boolean

Private Declare Function GetTokenCount Lib "copyp32.dll" (ByVal drive As Long, token As Long, ByVal Code As String) As Boolean
Private Declare Function SetTokenCount Lib "copyp32.dll" (ByVal drive As Long, ByVal token As Long, ByVal Code As String) As Boolean
Private Declare Function SetSystemID Lib "copyp32.dll" (ByVal drive As Long, ByVal id As String, ByVal Code As String) As Boolean
Private Declare Function WriteLicenseFile Lib "copyp32.dll" (ByVal file As String, data As LICENCEFILE, ByVal Code As String, ByVal Registry As Boolean) As Boolean

Private Declare Function GetLicenseFile Lib "copyp32.dll" (ByVal file As String, data As LICENCEFILE, ByVal Code As String, ByVal Registry As Boolean) As Boolean

'Jetzt können die Funktionen aufgerufen werden.

'Beispiel:
    ...	
    Dim data As DONGLEDATA
    Dim Code As String
    
    Code =...   'Hier wird die Codierung eingetragen
    If GetDongleData(0, data, Code) Then
        textLizenz.Text = data.LicenceKey
        textSystemID.Text = data.SystemID

        textCPVersion.Text = data.CP_Version
        textSerialNumber = data.SerialNumber
    End If
   ...
TNX

Mueckerich
"Wenn Sie glauben, mich verstanden zu haben, dann habe ich mich falsch ausgedrückt" ( Alan Greenspan)
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag von ChaOsKid »

hi mueckerich,

so auf den ersten blick fällt mir auf das LicData keine strukturzuweisung hat.
vielleicht liegt es daran....

evtl mal Global LicData.CPLicFile am anfang reinhauen....

mfG
ChaOsKid
Benutzeravatar
mueckerich
Beiträge: 220
Registriert: 13.09.2004 11:33
Wohnort: Am schönsten Flecken der Erde, zwischen PC und Motorrad

Beitrag von mueckerich »

Hi ChaOsKid
TNX :allright:
habe nur vergessen den folgenden Teil mit den Zuweisungen in den Code reinzukopieren,

Code: Alles auswählen

CopyP32 Variablendekladarionen
;{
Global CP_LibOpen.b                                       ;Flag ob Library bereits geöffnet ist
Global LicData.CPLicFile
Global UserData.CPUserData
Global DongleData.CPDongleData
ist also schon drin, mag aber dennoch nicht.
Manchmal schmiert das Prog auch nicht ab, dann sind die Variablen aber nach dem DLL-Aufruf immer noch leer, bzw immer noch mit den alten Werten befüllt. Habe bereits die CallCFunction ausprobiert, gleiches Ergebnis :cry: . Langsam gehen mir die Ideen aus.
"Wenn Sie glauben, mich verstanden zu haben, dann habe ich mich falsch ausgedrückt" ( Alan Greenspan)
Antworten