data et variables

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

data et variables

Message par gansta93 »

Salut tlm,

J'ai une variable, et je veux la mettre dans un data.f.
Cette variable change à chaque lancemant. Est-ce possible?
En fait le système serait de vérifier combien de foies le programme a été utilisé.
donc je crai la variable qui li la data, je fais des vérification, si elle est égale à 50 je lance la demande de mise à jours, supérieure je la remait à 1, et si elle n'existe pas, je la mais à 1.
donc en dessous je mais

Code : Tout sélectionner

datasection
data.f nombre.f
EndDataSection
mais pb n'accepte pas. Comment puis-je faire?
Quelqu'un a-t-il une idée svp?
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

On ne peut pas mettre des variables en data.

La solution serait de gérer cela avec une variable qui pourrait être stockée dans un fichier (éventuellement fichier de Preferences).

Ou de stocker un élement externe dans un fichier qui te permette de calculer la valeur à utiliser pour cette variable.

S'agit-il d'un dispositif pour compter le nombre de fois que le programme a été utilisé ?

Si c'est le cas, il faut imaginer un dispositif à double niveau pour éviter les tracasseries avec les petits malins.

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

sinon sous windows y'a aussi le registre...

Dri
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Oui j'ai pensé au preference... mais il suffirait de l'effacer à chaque coup... et d qu'il revenait dans le programme, ça le remettait à zéro.
Et pareil pour le registre WINDOWS... il suffit de chercher l'entrée correspondante.
Sinon j'aurais pensé à crypter le fichier de preferences en mettant par exemple le nombre en MD5.
Mais le problème c'est qu'il faut savoir le décrypter le MD5.
Existe-t-il un moyen de le décrypter avec PB?
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Un premier vers la question 'compteur d'utilisations'

Si telle est bien la question posée, voici un squelette intéressant. Juste un point de départ, reprenant un dispositif que j'ai déjà utilisé.

Ici j'ai mis un truc tout simple pour l'encodage / décodage d'une donnée stockée dans un fichier.

A partir de là si le sujet intéresse quelqu'un, on peut faire évoluer ce code sur deux axes :

- travailler l'algorithme d'encodage / décodage pour le rendre plus hermétique
- voir si il est facile et consistant d'intégrer la donnée cryptée non pas dans un fichier externe, mais dans l'exécutable lui-même par exemple.

A vos remarques !

Code : Tout sélectionner

;
; Workaround for a program usage counter
; ----------------------------------------------------
; Essai de cryptage d'un compteur d'utilisation d'un prog
;
; FWeil 20040707
;

;
; Set the size of the program messages array
; ----------------------------------------------------
; Fixe la taille du tableau des messages programme
;
#Max_Messages = 10

;
; Program messages array
; Tableau des messages du programme
;
Dim Messages.s(#Max_Messages)

;
; Procedure GetUserLanguage() : user language detection
; ----------------------------------------------------
; Procedure GetUserLanguage() : détection de la langue utilisateur
;
Procedure.s GetUserLanguage()
  Language.s
  GetSystemDefaultLangID = GetSystemDefaultLangID_()
  Select GetSystemDefaultLangID
    Case 1036   ; = French (Standard)
      Language = "FR"
    Default
      Language = "EN"
  EndSelect
  ProcedureReturn Language
EndProcedure

;
; Procedure Encrypt() : string encryption. The string can be decrypted using Decrypt()
; ----------------------------------------------------
; Procedure Encrypt() : encodage d'une chaine de caractères. La chaine peut être décodée avec Decrypt()
;
Procedure.s Encrypt(String.s)
  Result.s
  For i = 1 To Len(String)
    Cod.b = Asc(Mid(String, i, 1))
    Result = Result + Chr(Random(7) << 5 + (Cod & $F0) >> 3) + Chr(Random(3) + (Cod & $0F) << 3)
  Next
  ProcedureReturn Result
EndProcedure

;
; Procedure Decrypt() : string decryption using symmetrical algorythm in connection with Encrypt()
; ----------------------------------------------------
; Procedure Decrypt() : décodage d'une chaine de caractères en utilisant l'algorithme symétrique de Encrypt()
;
Procedure.s Decrypt(String.s)
  Result.s
  For i = 1 To Len(String) Step 2
    Cod.b = (Asc(Mid(String, i, 1)) << 3) & $F0 + (Asc(Mid(String, i + 1, 1)) >> 3) & $0F
    Result + Chr(Cod)
  Next
  ProcedureReturn Result
EndProcedure

  ;
  ; User language detection and data section positioning to load program messages accordingly
  ; ----------------------------------------------------
  ; Détection de la langue utilisateur et placement approprié dans la zone data pour lire les messages du programme
  ;
  Select GetUserLanguage()
    Case "FR"
      Restore FR
    Default
      Restore EN
  EndSelect
  
  CurrentMessage = 0
  Repeat
    Read Message.s
    Messages(CurrentMessage) = Message
    CurrentMessage + 1
  Until Message = "EndDataSection"
  
  ;
  ; Program launch loading the encrypted 'usage counter' information
  ; This information is decrypted and parsed, and eventually updated information is encrypted again for saving in the file.
  ; ----------------------------------------------------
  ; Lancement du programme avec chargement de l'information 'compteur d'utilisation' encryptée
  ; Cette information est décryptée et analysée, puis le cas échéant, l'information mise à jour est ré-encryptée et enregistrée dans le fichier.
  ;
  If ReadFile(0, "Usage counter.xyz")
      a$ = ReadString()
      Usage_Counter = Val(Decrypt(a$))
      CloseFile(0)
      Usage_Counter + 1
      If OpenFile(0, "Usage counter.xyz")
          WriteString(Encrypt(Str(Usage_Counter)))
          CloseFile(0)
          Quit = #FALSE
        Else
          MessageRequester(Messages(0), Messages(1), #PB_MessageRequester_OK)
          Quit = #TRUE
      EndIf
      If Quit = #FALSE
          If Usage_Counter > 2
              MessageRequester(Messages(0), Messages(2), #PB_MessageRequester_OK)
              Quit = #TRUE
            Else
              Quit = #FALSE
          EndIf
      EndIf
    Else
      If CreateFile(0, "Usage counter.xyz")
          WriteString(Encrypt("0"))
          Quit = #FALSE
        Else
          MessageRequester(Messages(0), Messages(1), #PB_MessageRequester_OK)
          Quit = #TRUE
      EndIf
  EndIf
  
  If Quit = #FALSE
      MessageRequester("OK", "OK", #PB_MessageRequester_OK)
  EndIf
End

;
; Data section contains two data blocks corresponding to accepted languages
; ----------------------------------------------------
; La zone data contient les messages du programme avec un bloc pour chaque langue reconnue
;
DataSection

  FR:
  
  Data.s "Alerte"
  Data.s "Le programme ne peut être lancé : installation défaillante"
  Data.s "Le programme a été utilisé au delà de la licence accordée"
  Data.s "EndDataSection"
  
  EN:
  
  Data.s "Warning"
  Data.s "Can't run the program : bad installation"
  Data.s "Program used more than the license authorized"
  Data.s "EndDataSection"

EndDataSection
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

OK... c'est vrai que c'est interressant... il faut que je voi ça de plus prait... ça me paraît interressant...
Mais comment pourait-on inclure cela dirrectemant dans l'exécutable vu qu'il est impossible de mettre des data variables.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

salut,

J'ai comme un pb avec ton code.
Il ne détecte pas la langue.
J'ai essayé de trouver pourquoi, maisrien à faire, je suis en paramaître français, mais il me mait toujours les messages en anglais.
Comment cela se fait-il?
Je ne trouve pas.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

sais pas d'ou vient ton problème avec la détection de la langue, mais tu peux forcer en français en ajoutant les lignes :

Select GetUserLanguage()
Case "FR"
Restore FR
Default
Restore EN
EndSelect

par

Restore FR
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

fweil a écrit :sais pas d'ou vient ton problème avec la détection de la langue, mais tu peux forcer en français en ajoutant les lignes :

Select GetUserLanguage()
Case "FR"
Restore FR
Default
Restore EN
EndSelect

par

Restore FR
En fait pour le français pour les paramaîtres de WINDOWS il ne faut pas mettre1036, mais 11928588.
Je l'ai essayé avec un autre programme et ça marche mais là ça ne veux pas marcher je vais essayer de trouver une solution.
Si on ne faisait pas la procedure userlanguage() mais qu'on faisait dirrectemant comme ça.

Code : Tout sélectionner

select GetSystemDefaultLangID_()
case 11928588
Restore FR
default
Restore EN
endselect
Peut-être que ça marcherait mieu.
Et pour l'ordre des choses, pourquoi ne pas mettre les data au début?
Tu ne pense pas que ça serait mieu... ne serait-ce que pour mieu comprendre le programme?
Je dis juste cela comme ça.
Je vais tester mes truc.[/code]
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Tu peux modifier le code à tno avantage. Il n'y a pas de problème.

Moi j'utilise le code 1036 pour la langue sous WIN2000. Je sais que ça fonctionne sous NT, W2K et XP.

Là je suis en train d'essayer de patcher l'exécutable qui contient la procédure de comptage d'accès au logiciel, de manière à ce que le compteur soit intégré au binaire.

Pour l'instant je ne suis pas parvenu à le faire fonctionner bien, mais j'espère ne pas être loinde la solution.

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

fweil a écrit :Tu peux modifier le code à tno avantage. Il n'y a pas de problème.

Moi j'utilise le code 1036 pour la langue sous WIN2000. Je sais que ça fonctionne sous NT, W2K et XP.

Là je suis en train d'essayer de patcher l'exécutable qui contient la procédure de comptage d'accès au logiciel, de manière à ce que le compteur soit intégré au binaire.

Pour l'instant je ne suis pas parvenu à le faire fonctionner bien, mais j'espère ne pas être loinde la solution.

Slts
Bon courage... moi avec mon petit niveau j'suis pas prait d'y arriver... j'arrive déja pas à comprendre comme donctionne le cryptage alors je chipote sur ce que je comprand :-) en gros pas grand chose.
Tout ça pour dire... bonne chance.
Je ne voi pas pk sous 98 ils ont pas fait avec le 1036 mais bon... fo pas chercher c'est Microsoft!!!!! :-) le pire c'est que c'est vrai.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Bizarre!
Si je fais ma méthode mais en remplaçant le select par du If...Else...EndIf, ça marche.
Fo pas chercher à comprendre mon PC doit être bizarre... comme son propriétaire qui ne se panche même pas sur le problème principal.
Pour le cryptage, tu peux m'expliquer stp????? je suis perdu.
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

gansta93,

Ton niveau n'est pas tellement petit ... après tout tu te débrouilles pas mal.

Enfin bon, je viens de te poster qq chose qui te fera probablement plaisir.

http://purebasic.hmt-forum.com/viewtopi ... highlight=

Pour le cryptage, le principe est simple même si la formulation n'est pas toujours aisée à comprendre dans le code.

Il s'agit de mélanger les bits d'informations avec d'autres, de les mélanger entre eux, le tout selon une règle qui permet de retrouver le chemin inverse.

Ici l'algo de cryptage que j'ai pris est un truc basique, puisque de toutes manières l'info utile est noyée dans le bianire de l'exécutable.

Cela n'interdit pas le piratage, mais ça limite quand même les risques.

Pour le présent code, j'ai simplement choisi de découper chaque octet en deux, et de rajouer des bits aléatoires pour rendre le tout assez incompréhensible. Mais la reconstruction des octets d'origine est assez simple et rapide.

Slts
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Message par gansta93 »

Comprand pas... marche pas avec moi c pas juste!!!!!
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour

Le code qui suit lit ou crée la première fois la valeur d'un compteur "lu" sauvegardé dans le fichier "compteur.txt".
Il ajoute un à ce compteur, le sauvegarde dans le fichier et l'affiche dans la fenêtre
Lorsque le programme est chargé une 4 ème fois il est remis à zero au bout d'une seconde et ainsi de suite.
Merci de me dire si c'est ce que tu voulais !

Code : Tout sélectionner

Enumeration
  #Window_0 : #Text_0 : #Text_3 : #Button_0
EndEnumeration

Global FontID3
FontID3 = LoadFont(3, "Arial Narrow", 12, #PB_Font_Bold)

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 649, 191, 262, 87,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Test")
    If CreateGadgetList(WindowID())
      TextGadget(#Text_0, 15, 20, 244, 20, "Ce programme à été chargé :   0  fois")
      SetGadgetFont(#Text_0, FontID3)
      ButtonGadget(#Button_0, 78, 52, 107, 27, "Fermer")
      SetGadgetFont(#Button_0, FontID3)
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()
OpenFile(0,"compteur.txt")
lu.s=Str(Val(ReadString())+1)
SetGadgetText(#Text_0,"Ce programme à été chargé : "+lu+"  fois")
If Val(lu)>3
Delay(1000)
  SetGadgetText(#Text_0,"Remise à Zéro du compteur")
  lu="0"
EndIf

FileSeek(0)
WriteStringN(lu)

Repeat
  Event = WaitWindowEvent() 
  If Event = #PB_EventGadget
    GadgetID = EventGadgetID()
    If GadgetID = #Button_0
      End
    EndIf
  EndIf
Until Event = #PB_EventCloseWindow
End

Denis

Bonne Jounée à tous
Répondre