Site Announcements

Liebe Gäste des Forums, wir freuen uns, dass ihr zu uns gelangt seid.
Windev ist eine sehr umfangreiche und starke Entwicklerumgebung für Anwendungen unter Windows, Linux und Internetapplikationen inkl. Mobile.
Hier sind Antworten und Anregungen dazu zu finden!
Möchtest du aktiv mitschreiben? Dann melde dich durch Klick auf den Text "Registrieren" hier rechts oberhalb an.

Sizeof() oder len() für structure?

Alle Themen rund um die Erstellung von Programmen

Sizeof() oder len() für structure?

Beitragvon satmax » 10. Mai 2016, 16:25

Als erste Übung bin ich gerade dabei meinen codemeter (Dongle) Zugriff mit Windev umzusetzen. Im Prinzip funktioniert das auslesen des Dongles bereits.

Ich habe mir dazu mehrer Structures anlegen müssen:


Beispiel:

Code: Alles auswählen
STCMENTRYDATA is Structure
   mflCtrl is unsigned int  // ULONG
   mflDependency is unsigned int  // ULONG
   cMulReserve is int  // ULONG
   nMcbDataEXPRESS is 4-byte unsigned int
   sMabData is ANSI string of 2*256-1   // gnCM_MAX_STRING_LEN 
END


PROCEDURE CodeMeterReadDataArray(nProductCode)
stCmAcc is STMY_ACCESS
stCmEntryInfo is STCMBOXENTRY2
nAnzahlLizenzen is int = 0
nItems  is int = 10
arrPBuffer is array of STCMENTRYDATA
nHandleCm is int
nRet is int =0

stCmAcc:nMflCtrl        = CM_ACCESS_NOUSERLIMIT
stCmAcc:nmulProductCode = nProductCode  // Productcode
stCmAcc:nMulFirmCode    = 104711          // FirmCode

FOR i = 1 TO nItems  // Puffer vorbelegen
   ArrayAdd(arrPBuffer)
END


nRet = API("WibuCM32.dll", "CmGetInfo", nHandleCm, CM_GEI_ENTRYDATA, &arrPBuffer, 527*nItems)   // WibuCM32.dll  sizeof(arrPBuffer)

FOR i = 1 TO nItems  // debug print license info to screen
   Info(arrPBuffer[i].sMabData)
END
   


2 Sachen:
1) wie kann ich die Größe einer structure ermittlen (lenght() funktioniert nicht), also etwas wie sizeof() in C

2) wie kann ich die 265 mit einer Konstante (gnCM_MAX_STRING_LEN ) ersetzen:
sMabData is ANSI string of 2*256-1 // gnCM_MAX_STRING_LEN

also:
gnCM_MAX_STRING_LEN is int=256
sMabData is ANSI string of 2*gnCM_MAX_STRING_LEN -1 // funkt aber nicht.


unter Xbase++ war das einfach ein #define
satmax
Member
 
Beiträge: 165
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Has thanked: 0 time
Have thanks: 1 time

Re: Sizeof() oder len() für structure?

Beitragvon Herbert » 11. Mai 2016, 05:58

Du hast ja die Struktur in eine Arrayvariable geholt.
Da sollte ArrayCount() genügen
http://doc.windev.com/en-US/?3075006&name=functions_for_managing_the_arrays

Abarbeiten kannst du das Array auch direkt mit
Code: Alles auswählen
FOR EACH PBuffer of arrPBuffer
...
END
http://doc.windev.com/en-US/?1510019&name=FOR_EACH_Associative_array

Wieso willst du in der Definition einer Struktur eine Stringlänge festlegen? Das ist meiner Meinung nach nicht möglich, da hier nur der Container festgelegt wird.
Code: Alles auswählen
sMabData is ANSI string
genügt dann
Erst bei Initialisierung kann der zu verwendenden Variablen (Array) zugewiesen werden:
Code: Alles auswählen
FOR i = 1 TO nItems  // Puffer vorbelegen
   ArrayAdd(arrPBuffer)
   arrPBuffer.sMabData=SPACE(gnCM_MAX_STRING_LEN)
END

sollte dann klappen
Herbert
Site Admin
 
Beiträge: 357
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Has thanked: 5 times
Have thanks: 3 times

Re: Sizeof() oder len() für structure?

Beitragvon satmax » 11. Mai 2016, 07:50

Da sollte ArrayCount() genügen

Da erhalte ich aber nur die Anzahl der Elemente, ich brauche aber für die Windows API die exakte Größe der Struktur/eines Elementes.
Aber mit den Arrays muss ich mich noch etwas auseinandersetzen.

Wieso willst du in der Definition einer Struktur eine Stringlänge festlegen?


Weil die API-Funktionen dies so benötigen, würde ich hier eine Struktur mit einer falschen Länge übergeben würde der API Aufruf nicht funktionieren.

Nach meinen Test ändert das Befüllen des Strings mit (Leer)Zeichen gar nichts, egal ob ich da 1 oder 100000 Zeichen reinmache, es funktioniert immer:
arrPBuffer[i].sMabData=RepeatString("x",gnCM_MAX_STRING_LEN+100000)

IMHO wird bei einem API Aufruf also immer die Länge der Struktur laut Struktur Definition verwendet.

Folgender Code funktioniert auch einwandfrei, ändere ich aber irgendeinen Datentyp (Länge, Anzahl der Bytes) geht nichts mehr:
Code: Alles auswählen
ipAddr is Structure // 4 Byte
   nB0 is byte
   nB1 is byte
   nB2 is byte
   nB3 is byte
END

STMY_ACCESS is Structure
   nMflCtrl             is unsigned int
   nMulFirmCode           is unsigned int
   nmulProductCode        is unsigned int
   nmulFeatureCode        is unsigned int
   nmulUsedRuntimeVersion  is unsigned int
   midProcess           is unsigned int
   musProductItemReference is 2-byte unsigned int
   musSession           is 2-byte unsigned int
   stMabIPv4Address        is ipAddr
   MY_CMBOXINFO          is int
END

...
stCmAcc is STMY_ACCESS
...
stCmAcc:nMflCtrl        = CM_ACCESS_STATIONSHARE
stCmAcc:nmulProductCode = nProductCode  // Productcode
stCmAcc:nMulFirmCode    = 104711          // FirmCode
...
nHandleCm = API("WibuCM32.dll", "CmAccess", CM_ACCESS_LOCAL_LAN, &stCmAcc)   // Lockt einen Benutzer am Dongle
...


Also ergibt sich die Größe der Struktur sehr wohl aus der Definition.
Übrigens, "stCmAcc " ist kein Arry, ich bräuchte aber auch hier die Größe (Länge) der Variable (Struktur)
satmax
Member
 
Beiträge: 165
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Has thanked: 0 time
Have thanks: 1 time

[GELÖST]Re: Sizeof() oder len() für structure?

Beitragvon satmax » 11. Mai 2016, 14:19

Das Leben kann so einfach sein, eben kam die Antwort von PC Soft:

The size of a structure is returned by the Dimension() command.

http://doc.windev.com/en-US/?3013022&na ... n_function

Also in meinem Fall:

Dimension(arrPBuffer[1])

oder gleich an der richtigen Codestelle:
API("WibuCM32.dll", "CmGetInfo", nHandleCm, CM_GEI_ENTRYDATA, &arrPBuffer, Dimension(arrPBuffer[1])*nItems)

und die Sache ist gelöst. Sollte jemand für Windev den Zugriff auf den Codemeter Stick benötigen einfach hier melden.
satmax
Member
 
Beiträge: 165
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Has thanked: 0 time
Have thanks: 1 time

Re: Sizeof() oder len() für structure?

Beitragvon Herbert » 12. Mai 2016, 05:47

Ah super, danke.
Herbert
Site Admin
 
Beiträge: 357
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Has thanked: 5 times
Have thanks: 3 times


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron