Fremd DLL einbinden?

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Fremd DLL einbinden?

Beitrag von satmax »

Hallo,

ich möchte gerne eine DLL einbinden also Funktionen daraus nutzen. Dazu benötige ich wahrscheinlich OT4XB, oder?

Mein Ansatz wäre in etwa:

Code: Alles auswählen

#include "DLL.ch"
#include "ot4xb.ch"

FUNCTION testCM()
LOCAL xRet

xRet:=CmAccess(CM_ACCESS_LAN_LOCAL, @cmAcc);

Return xRet

DLLFUNCTION CmAccess(n, @cmAcc) ;
  USING STDCALL FROM WibuCM32.DLL
Wobei cmAcc eine C++ Structur mit folgendem Aufbau ist:

Code: Alles auswählen

typedef struct __CMBOXINFO {
  CMBYTE mbMajorVersion;
  CMBYTE mbMinorVersion;
  CMUSHORT musBoxMask;
  CMULONG mulSerialNumber;
  CMUSHORT musBoxKeyId;
  CMUSHORT musUserKeyId;
  CMBYTE mabBoxPublicKey[CM_PUBLIC_KEY_LEN];
  CMBYTE mabSerialPublicKey[CM_PUBLIC_KEY_LEN];
  CMULONG mulReserve;
} CMBOXINFO;


typedef struct CMACCESS {
  CMULONG mflCtrl;                    1
  CMULONG mulFirmCode;                2
  CMULONG mulProductCode;             3
  CMULONG mulFeatureCode;             4
  CMULONG mulUsedRuntimeVersion;      5
  CMULONG midProcess;                 6
  CMUSHORT musProductItemReference;   7
  CMUSHORT musSession;                8
  unsigned char    mabIPv4Address[4];
  CMBOXINFO mcmBoxInfo;
} ;
Wie bilde ich so eine Structure und deren Datentypen unter xBase ab?

So in etwa (die noch falschen Datentypen sind mir bewusst)?

Code: Alles auswählen

BEGIN STRUCTURE __CMACCESS
    MEMBER LONG mflCtrl
    MEMBER LONG mulFirmCode
    MEMBER LONG mulProductCode
    MEMBER LONG mulFeatureCode
    MEMBER LONG mulUsedRuntimeVersion
    MEMBER LONG midProcess
    MEMBER LONG musProductItemReference
    MEMBER LONG musSession
    MEMBER LONG mabIPv4Address:={{},{},{},{}}
    MEMBER LONG mcmBoxInfo
    
END STRUCTURE
Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von brandelh »

solange man an die Funktion nur Text und LONG übergeben und von dieser nur LONG als Rückgabewert empfangen muss, könnte man es noch mit Xbase++ Bordmitteln erledigen.
Auch Strukturen könnte man mit BAB oder den BIN Funktionen erzeugen bzw. erhalten, aber die OT4XB macht vielen wesentlich einfacher.
Insbesondere die Strukturdefinition, da man dort alle möglichen Datentypen angeben und die STRUKTUR Syntax nutzen kann.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Fremd DLL einbinden?

Beitrag von AUGE_OHR »

hi,

wie Hubert schon sagte brauchst du bei "simplen" DLL Aufrufen mit "einfacher" Structur nur eine binär Umwandlung.

wenn man nun mit ot4xb eine Structur anlegt dann muss man die wie eine Class behandeln.

Code: Alles auswählen

INLINE METHOD SetDateTime(cDateTime)
LOCAL st := SYSTEMTIME():NEW()  // Structure already include in ot4xb
LOCAL nRet := 0
LOCAL nKW  := 0

   nKW  := WeekOf( cDateTime )

   st:wYear         := VAL( SUBSTR(cDateTime, 1,4) )
   st:wMonth        := VAL( SUBSTR(cDateTime, 5,2) )
   st:wDay          := VAL( SUBSTR(cDateTime, 7,2) )
   st:wDayOfWeek    := nKW
   st:wHour         := VAL( SUBSTR(cDateTime, 9,2) )
   st:wMinute       := VAL( SUBSTR(cDateTime,11,2) )
   st:wSecond       := VAL( SUBSTR(cDateTime,13,2) )
   st:wMilliseconds := 0

// old Version
* nRet := @user32:SendMessageA(::hDPick,DTM_SETSYSTEMTIME,GDT_VALID,st)

// http://msdn.microsoft.com/en-us/library/bb761813%28v=VS.85%29.aspx
   nRet := ::dp_DateTime_SetSystemtime(::hDPick,GDT_VALID,st)

RETURN nRet
nun hat Pablo schon "alle möglichen" Structuren in ot4xb angelegt ...
also erst mal im Source (\Source\winapi_CommonStructures.cpp) von Pablo nachsehen.

da du scheinbar mit dem Wibu-Key (WibuCM32.DLL) experimentierst solltest du mal rum fragen ob das noch jemand verwendet.
ich benutzte so was nicht mehr ... ich verschlüssle die Daten des Kunden mit einem Key ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von brandelh »

für was ist denn die "wibucm32.dll" ?
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von satmax »

Wibu Codemeter: Kopierschutz, Verschlüsselung und Lizenzmanagement.
Gruß
Markus
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von Rolf Ramacher »

aber wenn man die dll einbindet, so muß man doch die Funktionen kennen, die sich in dieser verbinden oder ??
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von satmax »

Rolf Ramacher hat geschrieben:aber wenn man die dll einbindet, so muß man doch die Funktionen kennen, die sich in dieser verbinden oder ??
Womöglich verstehe ich die Frage nicht richtig, aber Ja, sicher. Funktionen und Parameter sind mir bekannt. Ich kämpfe nur etwas mit den Strukturen und Parametern.
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von brandelh »

Man muss die Funktionen kennen, die man in von der DLL nutzen möchte, genau ;-)
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von satmax »

Ich habe da offensichtlich Probleme beim Anlegen der richtigen Struktur,

In C++ sieht das so aus:

Code: Alles auswählen

***** CMBOXINFO *****
typedef struct __CMBOXINFO {
  CMBYTE mbMajorVersion;
  CMBYTE mbMinorVersion;
  CMUSHORT musBoxMask;
  CMULONG mulSerialNumber;
  CMUSHORT musBoxKeyId;
  CMUSHORT musUserKeyId;
  CMBYTE mabBoxPublicKey[CM_PUBLIC_KEY_LEN];
  CMBYTE mabSerialPublicKey[CM_PUBLIC_KEY_LEN];
  CMULONG mulReserve;
} CMBOXINFO;


typedef struct CMACCESS {
  CMULONG mflCtrl;                   
  CMULONG mulFirmCode;                
  CMULONG mulProductCode;             
  CMULONG mulFeatureCode;             
  CMULONG mulUsedRuntimeVersion;  
  CMULONG midProcess;                 
  CMUSHORT musProductItemReference;  
  CMUSHORT musSession;                
  unsigned char    mabIPv4Address[4];
  CMBOXINFO mcmBoxInfo;
} ;
 */
Ich habe versucht das mit xBase++ so abzubilden:

Code: Alles auswählen

#define CM_ACCESS_LAN_LOCAL           0x0003
#define CM_PUBLIC_KEY_LEN  64

BEGIN STRUCTURE MY_CMBOXINFO
    MEMBER	BYTE mbMajorVersion
    MEMBER  BYTE mbMinorVersion
    MEMBER  U_INT16 musBoxMask
    MEMBER  ULONG mulSerialNumber
    MEMBER  U_INT16 musBoxKeyId
    MEMBER  U_INT16 musUserKeyId
    MEMBER  BYTE mabBoxPublicKey[CM_PUBLIC_KEY_LEN]
    MEMBER  BYTE mabSerialPublicKey[CM_PUBLIC_KEY_LEN]
    MEMBER  ULONG mulReserve
END STRUCTURE
	

BEGIN STRUCTURE MY_CMACCESS
    MEMBER ULONG mflCtrl
    MEMBER ULONG mulFirmCode
    MEMBER ULONG mulProductCode
    MEMBER ULONG mulFeatureCode
    MEMBER ULONG mulUsedRuntimeVersion
    MEMBER ULONG midProcess
    MEMBER U_INT16 musProductItemReference
    MEMBER U_INT16 musSession
    MEMBER BYTE mabIPv4Address:={{},{},{},{}}
    MEMBER LONG MY_CMBOXINFO
END STRUCTURE
Bei der Struktur habe ich gleich mehrere Probleme bei der Wahl der Datentypen:
was nehme ich unter xBase für:

unsigned char // habe versucht das mit BYTE zu ersetzen
unsigned char mabIPv4Address[4] // versucht mit BYTE mabIPv4Address:={{},{},{},{}} zu ersetzen, wird aber nicht korrekt sein da im Array ja kein Speicher allociert wird.

Auch das wird falsch sein:
MEMBER BYTE mabSerialPublicKey[CM_PUBLIC_KEY_LEN]


Hier mein Testcode

Code: Alles auswählen

FUNCTION testCM()
LOCAL cmBoxInfo:=MY_CMBOXINFO():new()
LOCAL cmAcc:=MY_CMACCESS():new()
LOCAL xRet

cmAcc:mflCtrl := 0
cmAcc:mulProductCode :=101490
cmAcc:mulFirmCode :=130001

xRet:=CmAccess(CM_ACCESS_LAN_LOCAL, @cmAcc)

RETURN xRet

*-----------------------------------------------------------------------------------
DLLFUNCTION CmAccess(n, @cmAcc) ;
  USING STDCALL FROM WibuCM32.DLL

Und hier noch die Fehlermeldung:

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows 7 06.02 Build 09200
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: C VALUE: _DLL  ©k ¤ªk ÚA
          -> VALTYPE: N VALUE: 3
          -> VALTYPE: O CLASS: MY_CMACCESS
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Parameter hat falschen Typ
oError:filename     : 
oError:genCode      :          2
oError:operation    : dllExecuteCall
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       1025
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von CMACCESS(112)
Aufgerufen von TESTCM(106)

Ich bin Euch für jeden Tipp dankbar!

Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von brandelh »

Ich denke, dass du die Zeile #include "ot4xb.ch" ... eingebunden hast oder ?
Ohne die wird dein Struktur Code nicht übersetzt !

http://www.xbwin.com/ot4xbXHlp/

Reference => Structure Definition Commands => Datentypen (näheres zu den möglichen Typen findet man in der Datei ot4xb.ch)

Code: Alles auswählen

DLLFUNCTION CmAccess(n, @cmAcc) USING STDCALL FROM WibuCM32.DLL
wenn man schon die ot4xb nutzt, dann sollte man alles damit machen.
Man könnte direkt aufrufen, aber ich baue lieber eine Funktion und setze die Parameter. Direkter Aufruf in Pablos kurzer Syntax :

Code: Alles auswählen

@WibuCM32:CmAccess(n, @cmAcc)
hier müsstest du die Strukturvariable cmAcc vorher erzeugen, und später auswerten ...
Ich würde eine eigene Klasse oder Funktionen bauen und das alles verstecken:

Code: Alles auswählen

function CmAccess(n)
    local cmAcc := MY_CMBOXINFO():New()
    @WibuCM32:CmAccess(n, @cmAcc)
return cmAcc
Bei der Struktur habe ich gleich mehrere Probleme bei der Wahl der Datentypen:
was nehme ich unter xBase für:
unsigned char // habe versucht das mit BYTE zu ersetzen
genau, ein unsigned char ist ein BYTE.
unsigned char mabIPv4Address[4] // versucht mit BYTE mabIPv4Address:={{},{},{},{}} zu ersetzen, wird aber nicht korrekt sein da im Array ja kein Speicher allociert wird.
Xbase++ Arrays sind anders als die Byte-Arrays von C.
hier wäre wohl eine UNION sinnvoll, 4 Byte insgesamt als DWORD oder LONG und dann 4 BYTE die den gleichen Platz belegen.

=> Tutorial => Using unions with gwst structures

ich habe das noch nicht gemacht, aber es sollte in etwa so aussehen:

Code: Alles auswählen

BEGIN STRUCTURE ipAddr // 4 Byte 
   MEMBER BYTE nB0
   MEMBER BYTE nB1
   MEMBER BYTE nB2
   MEMBER BYTE nB3
END STRUCTURE

BEGIN STRUCTURE  XYZ
   MEMBER ...
   BEGIN UNION
      MEMBER  DWORD nIpAdrr
      MEMBER @ ipAddr
   END UNION
   ...
END STRUCTURE

oXYZ := XYZ():New()
? oXYZ:nIpAdrr => numerisch
? oXYZ:IpAdrr:nB3,oXYZ:IpAdrr:nB2,oXYZ:IpAdrr:nB1,oXYZ:IpAdrr:nB4
Man kann ein Byte Array auch direkt in einen String legen und mit den BIN Funktionen zugreifen, aber eine Struktur mit Union ist wartungsfreundlicher.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Fremd DLL einbinden (Codemeter)?

Beitrag von satmax »

Hallo Hubert,
Hallo Jimmy,

danke! Im wesentlichen habe ich es nun beisammen. Nur das String auslesen klappt noch nicht, da wird nur der erste Buchstabe angezeigt. Ich brauche das im Moment aber nicht.

Hier mein Ergebnis, eventuell kann es auch jemand anderer verwenden:

myCodeMeter.ch

Code: Alles auswählen

* myCodeMeter.ch

#define CM_CHALLENGE_LEN              16
#define CM_BLOCK_SIZE                 16
#define CM_BLOCKCIPHER_KEY_LEN        32
#define CM_DIGEST_LEN                 32
#define CM_IP_ADDRESS_LEN             8
#define CM_PRIVATE_KEY_LEN            32
#define CM_PUBLIC_KEY_LEN             64
#define CM_SESSIONID_LEN              8
#define CM_TVB_LEN                    16
#define CM_RSA1024_KEY_LEN            128
#define CM_RSA2048_KEY_LEN            256
#define CM_RSA_MINIMAL_KEY_LEN        8
#define CM_SYM_KEY_LEN                16
#define CM_SIGNATURE_LEN              64
#define CM_EPHEMERAL_POINT_LEN        64
#define CM_BORROW_SERVERID_LEN        8

#define CM_MAX_COMPANY_LEN            32
#define CM_MAX_STRING_LEN             256
#define CM_MAX_PASSWORD_LEN           64


#define CM_ACCESS_LOCAL               0x0000
#define CM_ACCESS_LAN                 0x0001
#define CM_ACCESS_LOCAL_LAN           0x0002
#define CM_ACCESS_LAN_LOCAL           0x0003
#define CM_ACCESS_LANWAN              0x0011
#define CM_ACCESS_LOCAL_LANWAN        0x0012
#define CM_ACCESS_LANWAN_LOCAL        0x0013
#define CM_ACCESS_CMDMASK             0x0013

/* flags for kind of access */
#define CM_ACCESS_USERLIMIT           0x00000000
#define CM_ACCESS_NOUSERLIMIT         0x00000100
#define CM_ACCESS_EXCLUSIVE           0x00000200
#define CM_ACCESS_STATIONSHARE        0x00000300
#define CM_ACCESS_CONVENIENT          0x00000400
/* mask for the access modes */
#define CM_ACCESS_STRUCTMASK          0x00000700



/*****
 definition of CmGetInfo and the belonging options (flCtrl)
*****/
#define CM_GEI_BOXCONTROL             0x0000
#define CM_GEI_BOXINFO                0x0001
#define CM_GEI_BOXSECURITY            0x0002
#define CM_GEI_BOXTIME                0x0003
#define CM_GEI_ENTRYDATA              0x0004
#define CM_GEI_ENTRYINFO              0x0005
#define CM_GEI_INTERNALENTRYINFO      0x0006
#define CM_GEI_MEMINFO                0x0007
#define CM_GEI_SIGNEDLIST             0x0008
#define CM_GEI_SIGNEDTIME             0x0009
#define CM_GEI_SYSTEM                 0x000a
#define CM_GEI_VERSION                0x000b
#define CM_GEI_ENABLEBLOCKITEMS       0x000c
#define CM_GEI_ENABLELOOKUPITEMS_FI   0x000d
#define CM_GEI_ENABLELOOKUPITEMS_PI   0x000e
#define CM_GEI_CHIPINFO               0x000f
#define CM_GEI_BOXSTATUS              0x0010
#define CM_GEI_USBCHIPINFO            0x0011
#define CM_GEI_NETINFO_CLUSTER        0x0012
#define CM_GEI_NETINFO_USER           0x0013
#define CM_GEI_CREDENTIAL             0x0014
#define CM_GEI_SECURITYVERSION        0x0015
#define CM_GEI_NETINFO_USER_EXT       0x0016
#define CM_GEI_MEMINFO2               0x0017
#define CM_GEI_ACT_LICENSE_INFO       0x0018
#define CM_GEI_ACT_ERROR_INFO         0x0019
#define CM_GEI_CMACTVERSION           0x0020
#define CM_GEI_BORROWCLIENT           0x0030
#define CM_GEI_BORROWDATA             0x0031
#define CM_GEI_BORROWITEMS            0x0032
#define CM_GEI_ENTRYINFO2             0x0033
#define CM_GEI_ENABLEINFO             0x0034
#define CM_GEI_ACT_LICENSE_INFO2      0x0035

#define CM_GEI_CMDMASK                0x00ff
#define CM_GEI_USELOCALTIME           0x1000
#define CM_GEI_INDEXMASK              0xff000000


/*****
 definition of the BoxStatus flags (CM_GEI_BOXSTATUS)
*****/
#define CM_BOXSTATUS_LOWMEMORY         0x00000001
#define CM_BOXSTATUS_REPLUG            0x00000002
#define CM_BOXSTATUS_HASFLASH          0x00000004
#define CM_BOXSTATUS_ISCMACT           0x00000008
#define CM_BOXSTATUS_REMOVABLE         0x00000010
#define CM_BOXSTATUS_BATTERY_POWERED_CLOCK_USED 0x00000020
#define CM_BOXSTATUS_USES_HID_COMMUNICATION 0x00000040
#define CM_BOXSTATUS_FEATURE_MASK      0x000000FF

#define CM_ACTSTATUS_FILE              0x00000100
#define CM_ACTSTATUS_LOADED            0x00000200
#define CM_ACTSTATUS_ACTIVATE_BY_CODE  0x00000400
#define CM_ACTSTATUS_ACTIVATE_BY_FILE  0x00000800
#define CM_ACTSTATUS_ACTIVE            0x00001000
#define CM_ACTSTATUS_PROGRAMMABLE      0x00002000
#define CM_ACTSTATUS_INVALID           0x00004000
#define CM_ACTSTATUS_BROKEN            0x00008000
#define CM_ACTSTATUS_PSN_REQUIRED      0x02000000
#define CM_ACTSTATUS_VM_DETECTED       0x04000000 
#define CM_ACTSTATUS_BLACKLISTED       0x10000000 

  /* CM_ACTSTATUS_VM_DETECTED has two meanings: When returned by
     CM_GEI_BOXSTATUS it's an error condition when returned by
     CM_GF_ACT_GETFILEINFO, the file was created in a VM (which
     was permitted) */
#define CM_BOXSTATUS_CMACT_MASK        0x1F00FF00

#define CM_BOXSTATUS_ENABLED           0x00000000
#define CM_BOXSTATUS_DISABLED          0x00010000
#define CM_BOXSTATUS_TEMPENABLED       0x00020000
#define CM_BOXSTATUS_NOENABLEITEMS     0x00040000
#define CM_BOXSTATUS_AMBIGUOUS         0x00080000
#define CM_BOXSTATUS_MASK              0x000f0000

#define CM_BOXSTATUS_STATE_FUM         0x00100000
#define CM_BOXSTATUS_STATE_LOCKED      0x00200000
#define CM_BOXSTATUS_STATE_MASK        0x00F00000
myCodeMeter.prg:

Code: Alles auswählen

#include "Xbp.ch"
#include "std.ch"
#include "common.ch"

#include "DLL.ch"
#include "ot4xb.ch"
#include "myCodemeter.ch"

// #define NULL chr(0)

BEGIN STRUCTURE ipAddr // 4 Byte
   MEMBER BYTE nB0
   MEMBER BYTE nB1
   MEMBER BYTE nB2
   MEMBER BYTE nB3
END STRUCTURE

BEGIN STRUCTURE MY_CMBOXINFO
    MEMBER  BYTE mbMajorVersion
    MEMBER  BYTE mbMinorVersion
    MEMBER  U_INT16 musBoxMask
    MEMBER  ULONG mulSerialNumber
    MEMBER  U_INT16 musBoxKeyId
    MEMBER  U_INT16 musUserKeyId
    MEMBER  SZSTR mabBoxPublicKey SIZE CM_PUBLIC_KEY_LEN
    MEMBER  SZSTR mabSerialPublicKey SIZE CM_PUBLIC_KEY_LEN
    MEMBER  ULONG mulReserve
END STRUCTURE
	
BEGIN STRUCTURE MY_CMACCESS
    MEMBER ULONG mflCtrl
    MEMBER ULONG mulFirmCode
    MEMBER ULONG mulProductCode
    MEMBER ULONG mulFeatureCode
    MEMBER ULONG mulUsedRuntimeVersion
    MEMBER ULONG midProcess
    MEMBER U_INT16 musProductItemReference
    MEMBER U_INT16 musSession
    MEMBER @ ipAddr mabIPv4Address
    MEMBER LONG MY_CMBOXINFO
END STRUCTURE

BEGIN STRUCTURE CMTIME 
  MEMBER U_INT16 musYear
  MEMBER U_INT16 musMonth
  MEMBER U_INT16 musDay
  MEMBER U_INT16 musHours
  MEMBER U_INT16 musMinutes
  MEMBER U_INT16 musSeconds
  MEMBER ULONG mulSecondsSince01_01_2000
END STRUCTURE

BEGIN STRUCTURE CMBOXENTRY2 
  /* Firm Item data */
  MEMBER ULONG mflFiCtrl
  MEMBER ULONG mulFirmCode
  MEMBER U_INT16 musFirmAccessCounter
  MEMBER U_INT16 musReserve1
  MEMBER ULONG mulFirmUpdateCounter
  MEMBER ULONG mulFirmPreciseTime
  MEMBER BINSTR mausFirmItemText SIZE CM_MAX_STRING_LEN 
  MEMBER SZSTR mabReserve1 SIZE 108  /* aligned to 640 */
  MEMBER ULONG mflSetPios
  MEMBER ULONG mulProductCode
  MEMBER ULONG mulFeatureMap
  MEMBER @ CMTIME  mcmMaintenancePeriodStart
  MEMBER @ CMTIME  mcmMaintenancePeriodEnd
  MEMBER ULONG mulUnitCounter
  MEMBER @ CMTIME mcmExpirationTime
  MEMBER @ CMTIME mcmActivationTime
  MEMBER ULONG mulUsagePeriodLifeTime
  MEMBER @ CMTIME mcmUsagePeriodStartTime
  MEMBER ULONG mulLicenseQuantity
  MEMBER ULONG mulLingerTime
  MEMBER SZSTR mabReserve2 SIZE 48  /* aligned to 796 */
  MEMBER BYTE mfbDependencyPC
  MEMBER BYTE mfbDependencyFM
  MEMBER BYTE mfbDependencyMP
  MEMBER BYTE mfbDependencyUC
  MEMBER BYTE mfbDependencyET
  MEMBER BYTE mfbDependencyAT
  MEMBER BYTE mfbDependencyUP
  MEMBER BYTE mfbDependencyLQ
  MEMBER BYTE mfbDependencyLT
  MEMBER SZSTR mabReserve3 SIZE 15 /* aligned to 820 */
  MEMBER U_INT16 CMTIME
  MEMBER SZSTR mabReserve4 SIZE 202 /* aligned to 1024 */
END STRUCTURE

FUNCTION testCM(nProductCode)
LOCAL cmAcc:=MY_CMACCESS():new()
LOCAL nHandleCm, nGetInfo
LOCAL cmEntryInfo :=CMBOXENTRY2():new()
LOCAL nSecondsSince2000
LOCAL nAnzahlLizenzen:=0


cmAcc:mflCtrl := 0
cmAcc:mulProductCode :=nProductCode  // Productcode
cmAcc:mulFirmCode := 101490          // FirmCode

nHandleCm:=@WibuCM32:CmAccess(CM_ACCESS_LOCAL_LAN, @cmAcc)

nGetInfo = @WibuCM32:CmGetInfo(nHandleCm, CM_GEI_ENTRYINFO2, @cmEntryInfo, cmEntryInfo:_sizeof_())

If nGetInfo == cmEntryInfo:_sizeof_()
*    ' The real number of bytes  is returned.
*    ' If does not contain enough memory,
*    ' the number of needed bytes will be returned.
*    ' In this case the return value is larger than the cbDest parameter
*    ' and error code CMERROR_BUFFER_OVERFLOW is set.
	 nAnzahlLizenzen:=cmEntryInfo:mulLicenseQuantity
	 
	 nSecondsSince2000 := cmEntryInfo:mulFirmPreciseTime  // Sekunden seit 01.01.2000 00:00:00
	 
	 // Zeit am Dongle aktualisieren 
	IF CmSetCertifiedTimeUpdate(hcmse8, "cmtime.codemeter.com") <> 
		tsMsg("Kann die Uhrzeit nicht aktualisieren!")
	ENDIF	
Else
*    ' Some errors occurred.
	nHandleCm:=0
EndIf


RETURN nAnzahlLizenzen
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fremd DLL einbinden?

Beitrag von brandelh »

Wenn nur ein Buchstabe angezeigt wird, liegt das vermutlich an UNICODE !
Viele normale Buchstaben nutzen bei UNICODE ja ein chr(n)+chr(0) ... für ein Zeichen ...

Teste also

Code: Alles auswählen

ASCIIZ: MEMBER SZSTR <memberName>  SIZE <nSize>
UNICODE: MEMBER SZWSTR  <m>  SIZE <n>
oder aber die fehlende Längenangabe ...

Code: Alles auswählen

MEMBER SZSTR <memberName>  SIZE <nSize>
ASCIIZ Strings brauchen einen Buffer mit fixer Länge, vielleicht ist diese 1 wenn man nichts angibt ?
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Fremd DLL einbinden? (Codemeter)

Beitrag von satmax »

brandelh hat geschrieben:Wenn nur ein Buchstabe angezeigt wird, liegt das vermutlich an UNICODE !
Das war es:

Code: Alles auswählen

MEMBER SZWSTR mausFirmItemText SIZE CM_MAX_STRING_LEN 
Anstelle

Code: Alles auswählen

MEMBER BINSTR mausFirmItemText SIZE CM_MAX_STRING_LEN 
Damit ist auch mein String komplett! :)

Schönen Sonntag Abend noch!

Gruß
Markus
Gruß
Markus
Antworten