AV-SOFT
AVLock SIMPLE
Introducción
Que es AVLock SIMPLE?
Como adquirir AVLock SIMPLE?
Nuevo en v5.1
Usando AVLock SIMPLE
Como instalar AVLock SIMPLE?
Conceptos Básicos
Configuración
Usuarios e Instancias
Esquemas de protección
Ejemplos
Nuevo Estilo
Ejemplo 1
Ejemplo 2
Ejemplo 3
Ejemplo 4
Ejemplo 5
Request Key
UserData Based
Ejemplos PayPal IPN
Propiedades
Métodos
El Online License Manager (OLM)
Como's
La utilidad Configurator
La utilidad RegMonitor
La Utilidad KeyGen
La Utilidad CodeCheck
La Utilidad KeyCheck
Información adicional
Acuerdo de licencia
Historia de versiones_2

Nuevo Estilo

Top  Previous  Next

 

Un nuevo estilo de ejemplos se implementó en esta versión con el fin de hacer más fácil su configuración al utilizarlo conjuntamente con una nueva utilidad llamada configurator que permite generar código de configuración del componente para después insertarlo en las aplicaciones. Con pequeñas variantes, el funcionamiento de los ejemplos es el mismo que en las versiones anteriores. Abajo puede ver una toma de pantalla que muestra las carpetas de los ejemplos que se presentan con este nuevo estilo:

 

newexample00

 

 

De todos estos ejemplos solo describiremos el ejemplo 1a en su versión para el OLM avanzado, que es la más completa, una vez que Ud.  se familiarice con este ejemplo, podrá entender fácilmente el resto de los ejemplos incluidos en el paquete.  En este tópico solo describimos el código y su funcionalidad, para mayor información vea los ejemplos old-style donde se describen prácticas realizadas paso a paso.

 

Ejemplo 1a

 

 

La siguiente es la lista de los ficheros que conforman este ejemplo:

 

project1.dpr

unit1.dfm

unit1.pas

regist.dfm

regist.pas

wait.dfm

wait.pas

avlockunit.pas

conf.inc

 

 

project1.dpr

 

Es el fichero del proyecto. Note aquí en el código de abajo, la única linea que se agregó a este fichero para permitir que AVLOCK controle la aplicación. Aquí se llama al procedimiento DoRegister, que muestra un formulario para que el usuario pueda registrarse y finalmente según sea al estado de registración decide si continúa con la ejecución del programa o la interrumpe.

 

program Project1;

 

uses

 Forms,

 Unit1 in 'unit1.pas' {Form1},

 Regist in 'Regist.pas' {RegForm},

 avlockunit in 'avlockunit.pas',

 wait in 'wait.pas' {WaitForm};

 

{$R *.res}

 

begin

 Application.Initialize;

 Application.CreateForm(TForm1, Form1);

 Form1.DoRegister(False); //<-- solo se agregó esta linea

 Application.Run;

end.

 

Para utilizar AVLOCK con su propio proyecto bastará con que agregue la linea mencionada arriba y copie el resto de los archivos del ejemplo a su proyecto y los vincule al mismo. Abajo puede ver los ficheros que conforman este ejemplo:

 

newexample01

 

unit1.dfm, unit1.pas

 

En este ejemplo, los ficheros unit1.dfm y unit1.pas conforman el formulario principal del proyecto. Abajo puede ver el código fuente de esta unidad, solo hay un procedimiento para cada uno de los botones que se colocaron en el form, y estos hacen referencia a algunas funciones que se encuentran en la unidad avlockunit.pas.

 

A la clausula uses se le agregaron dos referencias, AVLockS5 y avlockunit que invocan al componente AVLock y a la unidad avlockunit.pas ya mencionada.

 

unit Unit1;

 

interface

 

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls,

 Forms, Dialogs, StdCtrls, ExtCtrls, AVLockS5, avlockunit;

 

type

 TForm1 = class(TForm)

   BtnReg: TButton;

   Label1: TLabel;

   Label2: TLabel;

   BtnFree: TButton;

   BtnRestricted: TButton;

  procedure BtnRegClick(Sender: TObject);

  procedure BtnRestrictedClick(Sender: TObject);

  procedure BtnFreeClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

end;

 

var

 Form1: TForm1;

 

implementation

{$R *.dfm}

 

procedure TForm1.BtnFreeClick(Sender: TObject);

begin

 showmessage('This Feature is always Available');

end;

 

procedure TForm1.BtnRestrictedClick(Sender: TObject);

begin

  if (keydata.Status = Registered) then showmessage('This Feature is currently Available')

  else showmessage('this Feature is currently Unavailable');

end;

 

procedure TForm1.BtnRegClick(Sender: TObject);

begin

 DoRegister(True);

end;

 

end.

 

Analizaremos a continuación el código de cada uno de estos botones:

 

El botón [Free Features]:

Solo muestra un mensaje indicando que a través de este botón se accede a funciones de libre uso.

 

El botón [Restricted Features]:

Este código, utilizando una sentencia IF evalua la expresión booleana (keydata.Status = Registered) y según sea el resultado True o False muestra el mensaje apropiado. Lo único nuevo para Ud. en este código es la expresión (keydata.Status = Registered), keydata es una estructura tipo record definida en el compoenente AVLock que contiene toda la información sobre el estado de registración actual del componente, aquí se está haciendo referencia al campo Status que puede tomar uno de los siguientes valores (Unregistered, Moved, Expired, Registered). De esta manera Ud. podría habilitar/bloquear el acceso a las funciones permitidas solo para usuarios registrados.

 

El botón [Register Now]:

Este botón accede al formulario de registración (regist.dfm, regist.pas), se lo invoca con un llamado a la función DoRegister(True) de la misma forma que lo hicimos en el archivo de proyecto, con la diferencia que ahora usamos el parámetro "True" indicando que debe ser invocado en forma incondicional.

 

 

regist.dfm, regist.pas

Estos son los ficheros del formulario de registración. Abajo se muestra una vista del mismo:

 

newexample02

 

Veamos cada uno de los controles utilizados en este form:

 

lstatus: TLabel;

Utilizado para mostrar el estado actual de registración.

 

EdIcode: TEdit;

Utilizado para mostrar el Installcode correspondiente al computador donde se está ejecutando la aplicación.

 

EdName: TEdit;

Utilizado para que el usuario ingrese su nombre.

 

EdCompany: TEdit;

Utilizado para que el usuario ingrese su Compañía.

 

EdEmail: TEdit;

Utilizado para que el usuario ingrese su dirección de correo electrónico.

 

EdOther: TEdit;

Utilizado en este caso para que el usuario ingrese su dirección postal.

 

EdKey: TEdit;

Utilizado para que el usuario ingrese la clave de registración.

 

BtnLoad: TButton;

Permite que el usuario ingrese la clave descargándola desde un fichero.

 

OpenDialog1: TOpenDialog;

Invocado desde BtnLoad para seleccionar el fichero que contiene la clave de registración.

 

BtnReg: TButton;

Permite Registrar la clave que el usuario ingresó previamente en EdKey.

 

BtnContinue: TButton;

Permite abandonar el formulario de registración.

 

Los siguientes botones no deben colocarse en la versión final de su aplicación. Su finalidad es permitirle realizar su práctica con el componente y poder probar las diferentes funcionalidades del mismo.

 

BtnTrial: TButton;

Permite Iniciar el periodo Trial de la aplicación.

 

BtnCheckDate: TButton;

Permite verificar la fecha del sistema a través de internet.

 

BtnCheckAndFix: TButton;

Permite verificar la fecha del sistema a través de internet y corregirla.

 

BtnSynch: TButton;

Permite sincronizar la información de registración local con la información existente en el OLM (Online License Manager). En este caso utilizando la función OnlineSynch().

 

BtnFull: TButton;

Permite sincronizar la información de registración local con la información existente en el OLM (Online License Manager). En este caso utilizando la función OnlineFullSynch().

 

BtnRenew: TButton;

Permite Registrar una nueva Clave autorizada y generada desde el OLM, Se deben establecer los parámetros correspondientes a la nueva clave a generar en el OLM y después asignar el campo (Paid='Y'), esto se puede hacer accediendo al OLM a través del panel de control, entonces cuando se invoca la función OnlineRenew() con este botón, se accede al OLM y si (Paid='Y') entonces se genera la nueva clave y se la envía a la aplicación, en caso contrario, si (Paid='N') se  sincroniza la información de registración local con la información existente en el OLM igual que al utilizar la función OnlineSynch(). En su aplicación Ud. podría colocar un botón similar para permitir que el usuario registre una nueva clave cuando Ud. la autoriza desde el OLM o quizás pueda optar por colocar este llamado al iniciar la aplicación de manera que cada vez que esta se inicia se verifique si existe una nueva clave autorizada y se la registre.

 

BtnRemove: TButton;

Permite remover la información de registración local y del OLM (Online License Manager).

 

BtnInstances: TButton;

Muestra las instancias que se están ejecutando en ese momento, siempre que se haya establecido InstancesCtrl  := True;

 

Abajo se muestra el código fuente de la unidad. Note que en la clausula uses de la implementación hemos colocado una referencia a avlockunit.  Además puede ver que cada uno de los botones invoca a procedimientos y funciones declarados y definidos en la unidad avlockunit.

 

unit Regist;

 

interface

 

uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

 StdCtrls, ExtCtrls;

 

type

 TRegForm = class(TForm)

   Panel1: TPanel;

   Image1: TImage;

   Image2: TImage;

   Panel2: TPanel;

   BtnContinue: TButton;

   EdKey: TEdit;

   Panel3: TPanel;

   LRegInfo: TLabel;

   LToReg: TLabel;

   BtnReg: TButton;

   Label1: TLabel;

   lstatus: TLabel;

   Panel4: TPanel;

   Label3: TLabel;

   BtnRemove: TButton;

   Panel5: TPanel;

   Label2: TLabel;

   EdIcode: TEdit;

   Label39: TLabel;

   BtnTrial: TButton;

   BtnCheckDate: TButton;

   BtnCheckAndFix: TButton;

   Label4: TLabel;

   BtnRenew: TButton;

   BtnSynch: TButton;

   Label5: TLabel;

   LName: TLabel;

   LCompany: TLabel;

   Label34: TLabel;

   Label6: TLabel;

   EdName: TEdit;

   EdCompany: TEdit;

   EdEmail: TEdit;

   EdOther: TEdit;

   BtnFull: TButton;

   BtnLoad: TButton;

   OpenDialog1: TOpenDialog;

   BtnInstances: TButton;

   procedure BtnContinueClick(Sender: TObject);

   procedure BtnRegClick(Sender: TObject);

   procedure BtnRemoveClick(Sender: TObject);

   procedure BtnTrialClick(Sender: TObject);

   procedure BtnCheckDateClick(Sender: TObject);

   procedure BtnCheckAndFixClick(Sender: TObject);

   procedure BtnRenewClick(Sender: TObject);

   procedure BtnSynchClick(Sender: TObject);

   procedure BtnFullClick(Sender: TObject);

   procedure BtnLoadClick(Sender: TObject);

   procedure BtnInstancesClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

 

implementation

uses avlockunit;

{$R *.DFM}

 

procedure TRegForm.BtnContinueClick(Sender: TObject);

begin

 modalresult:=mrOk;

end;

 

procedure TRegForm.BtnLoadClick(Sender: TObject);

var Ftxt: TextFile;

   s: string;

begin

if opendialog1.Execute then begin

   AssignFile(Ftxt, opendialog1.FileName);

   Reset(Ftxt);

   ReadLn(Ftxt, s);

   EdKey.Text := trim(s);

   CloseFile(Ftxt);

 end;

end;

 

procedure TRegForm.BtnRegClick(Sender: TObject);

var s:string;

begin

 RegKey(EdKey.Text, edname.Text, edcompany.Text, edemail.Text, edother.Text, s);

end;

 

procedure TRegForm.BtnTrialClick(Sender: TObject);

var s:string;

begin

 showmessage(StartTrial(edname.Text ,edcompany.Text ,edemail.Text ,edother.Text, s));

if (s<>'') then lstatus.Caption :=s;

end;

 

procedure TRegForm.BtnRenewClick(Sender: TObject);

var s:string;

begin

 showmessage(Renew(s));

if (s<>'') then lstatus.Caption :=s;

end;

 

procedure TRegForm.BtnSynchClick(Sender: TObject);

var s:string;

begin

 showmessage(Synch(s));

if (s<>'') then lstatus.Caption :=s;

end;

 

procedure TRegForm.BtnFullClick(Sender: TObject);

var s:string;

begin

 showmessage(FullSynch(s));

if (s<>'') then lstatus.Caption :=s;

end;

 

procedure TRegForm.BtnInstancesClick(Sender: TObject);

begin

 showinstances;

end;

 

procedure TRegForm.BtnCheckDateClick(Sender: TObject);

begin

 checkdate;

end;

 

procedure TRegForm.BtnCheckAndFixClick(Sender: TObject);

begin

 checkandfixdate;

end;

 

procedure TRegForm.BtnRemoveClick(Sender: TObject);

var s:string;

begin

 showmessage(RemoveReg(s));

 lstatus.Caption :=s;

end;

 

end.

 

 

avlockunit.pas

Contiene las funciones básicas de implementación del componente. A continuación analizaremos cada una de las partes de este código. En la sección de interface tenemos las siguientes declaraciones de constantes y variables:

 

const

ACTION_DATE_TURNED_BACK: integer = 1; //0:No action, 1:Fix the date

ACTION_EXPIRED         : integer = 2; //0:no action, 1:nag screen, 2:terminate

EXPIRY_DAYS_TO_WARN    : integer = 15;

USER_DATA_REQUIRED     : boolean = True;

 

 

var

 AVLock  : TAVLockS5;

 keydata : TKeyData;

 

 

ACTION_DATE_TURNED_BACK define que se debe hacer cuando el usuario retrasó la fecha del sistema, presumiblemente intentando reutilizar un periodo trial expirado.

 

ACTION_EXPIRED define que se debe hacer cuando la aplicación está en estado expirado.

 

EXPIRY_DAYS_TO_WARN define el número de días antes de la expiración cuando se debe mostrar el formulario de registración al inicio para advertir al usuario que debería registrarse.

 

USER_DATA_REQUIRED define si se requiere que el usuario ingrese su información personal antes de iniciar el periodo trial o registrarse.

 

La variable AVLock es la declaración del componente AVLock que se creará en la sección initialization y destruirá en la sección finalization.

 

La variable keydata de tipo TKeyData es una estructura tipo record definida en el componente AVLock (fichero avlocks5.pas), con el fin de contener toda la información sobre el estado de registración del componente. Abajo puede ver su declaración:

 

  TRegStatus = (Unregistered, Moved, Expired, Registered);

 TKeyType = (Trial, Temporal, Permanent, Unregister, UnregisterAll);

 

 TKeyData = record

   Status: TRegStatus;

   KeyType: TKeyType;

   Startdate: TDate;

   EndDate: TDate;

   Days: word;

   DaysLeft: word;

   Users: byte;

   Instances: byte;

   Primary: Boolean;

   DateBacked: Boolean;

   TooManyInstances: Boolean;

   Values: string;

   Key: string;

   ICodeP: string;

   InstallCodep: string;

 end;

 

 

En la sección initialization se crea la variable AVLock

 

initialization

 AVLock:=TAVLockS5.Create(nil);

 with AVLock do begin

{$I conf.pas}

 end;

 

Con la sentencia {$I conf.pas} insertamos en ese punto el contenido del fichero conf.pas que contiene la configuración del componente. Este fichero puede ser generado con la utilidad configurator. Abajo puede ver el código que viene con este ejemplo:

 

InstallCodeSources := Machine_Data;

MachineSources := [System_UUID,BaseBoard_SN];

InstancesCtrl  := False;

RegPath        := ExeDir;

RegFolder      := '';

EncryptionKey  := hextoascii('616263313233');//abc123

EncryptionKey2 := hextoascii('78797A333231');//xyz321

AppID          := strtoint(hextoascii('3132333031'));//12301

AppName        := hextoascii('4D79417070');//MyApp

AppVersion     := hextoascii('312E302E30');//1.0.0

WebHost        := hextoascii('7777772E61762D736F66742E636F6D');//www.av-soft.com

TimeHost       := hextoascii('74696D652D612E6E6973742E676F76');//time-a.nist.gov

OlmPath        := hextoascii('2F6F6C6D3531');///olm51

OlmBasicScript := hextoascii('62617369636F6C6D2E706870');//basicolm.php

OlmAdvScript   := hextoascii('616476616E6365646F6C6D2E706870');//advancedolm.php

ACTION_DATE_TURNED_BACK := 1;

ACTION_EXPIRED      := 1;

EXPIRY_DAYS_TO_WARN := 15;

USER_DATA_REQUIRED  := True;

 

La de arriba es la versión obfuscada de conf.pas que tiene todos los valores de texto convertidos a hexadecimal y después con la función hextoascii se convierten nuevamente a su texto original en tiempo de ejecución. Es conveniente utilizar este formato para ocultar esta información en el código del fichero ejecutable. La versión sin obfuscar es la siguiente:

 

InstallCodeSources := Machine_Data;

MachineSources := [System_UUID,BaseBoard_SN];

InstancesCtrl  := False;

RegPath        := ExeDir;

RegFolder      := '';

EncryptionKey  := 'abc123';

EncryptionKey2 := 'xyz321';

AppID          := 12301;

AppName        := 'MyApp';

AppVersion     := '1.0.0';

WebHost        := 'www.av-soft.com';

TimeHost       := 'time-a.nist.gov';

OlmPath        := '/olm51';

OlmBasicScript := 'basicolm.php';

OlmAdvScript   := 'advancedolm.php';

ACTION_DATE_TURNED_BACK := 1;

ACTION_EXPIRED      := 1;

EXPIRY_DAYS_TO_WARN := 15;

USER_DATA_REQUIRED  := True;

 

 

 

A continuación vamos a ver las funciones y procedimientos definidos en el fichero avlockunit.pas:

 

 

function GetRegStatus:string;

 

Esta función realiza la tarea de obtener la información desde los datos de registración local (fichero .avr) y volcarla en los diferentes campos de keydata, esto se realiza con la linea AVLock.GetKeyData(0,keydata). Donde 0 es el index utilizado, cuando utilizamos una sola clave para controlar la aplicación se usa index=0. Abajo puede ver el código de esta función:

 

 

function GetRegStatus:string;

var s:string;

begin

 

 AVLock.GetKeyData(0,keydata);

 

 if keydata.DateBacked then

case ACTION_DATE_TURNED_BACK of

   1:if AVLock.OnlineCheckDate(true) then begin

       AVLock.restart;

       AVLock.GetKeyData(0,keydata);

    end else keydata.Status := Expired;

   2:keydata.Status := Expired;

end;

 

 s:='';

case keydata.Status of

   Unregistered: s:='Not registered';

   Moved       : s:='Moved to another computer';

   Expired     : s:='Expired';

   Registered  : begin

     s:='';

    case keydata.KeyType of

       Trial     : s:=s+'Trial '+inttostr(keydata.Days)+' days - '+inttostr(keydata.DaysLeft)+' days left.';

       Temporal  : s:=s+'Temporal '+inttostr(keydata.Days)+' days - '+inttostr(keydata.DaysLeft)+' days left.';

       Permanent : s:=s+'Permanent, no time limit.';

     end;

   end;

 end;

 result:=s;

end;

 

 

Después de haber obtenido los valores de los campos de keydata, se verifica si la fecha del sistema fue atrasada, si esto ocurre, el campo DateBacked toma el valor True, entonces con la linea "if keydata.DateBacked then" realizamos las acciones configuradas para esta situación; Si el valor de ACTION_DATE_TURNED_BACK es 1, llamando al método AVLock.OnlineCheckDate(true) corregimos la fecha del sistema a través de internet, si la operación da resultado, reiniciamos el componente con AVLock.restart y obtenemos nuevamente los valores de keydata llamando nuevamente a GetKeyData y si la operación no resultó exitosa asignamos el estado del componente como expirado con la asignación KeyData.Status:=Expired. También hacemos lo mismo en el caso de que ACTION_DATE_TURNED_BACK sea igual a 2.

 

A continuación examinamos el valor de keydata.Status y keydata.KeyType para obtener un string con un mensaje descriptivo del estado de registración que devolvemos como resultado de la función.

 

procedure wait(n:integer);

 

Este procedimiento muestra un cuadro con una cuenta regresiva a fin de motivar al usuario a registrarse (nag screen). Abajo puede ver el código.

 

procedure wait(n:integer);

var F:TWaitForm;

   reg:boolean;

begin

 reg:=True;

 F:=TWaitForm.Create(nil);

 try

   F.cnt:=n;

   F.ShowModal;

   reg := (F.ModalResult = mrCancel);

finally

   freeandnil(F);

end;

 if reg then DoRegister(True);

end;

 

 

procedure DoRegister(force:boolean);

 

Este es su código fuente:

 

procedure DoRegister(force:boolean);

var F : TRegForm;

   s, ic :string;

   ok:boolean;

begin

 s:=GetregStatus;

 if AVLock.IsLocal and (force or (keydata.Status = Moved) or (keydata.DaysLeft < EXPIRY_DAYS_TO_WARN))

 then begin

   AVLock.ReadAppData(False,ic,icode);

   F:=TRegForm.Create(nil); //Create the registration Form

  try

     F.EdIcode.Text   := AVLock.InstallCode;

     F.EdName.Text    := AVLock.UserName;

     F.EdCompany.Text := AVLock.Company;

     F.EdEmail.Text   := AVLock.Email;

     F.EdOther.Text   := AVLock.OtherCode;

     F.lstatus.Caption:=s;

     F.ShowModal;

  finally

     FreeAndNil(F);

   end;

 end;

if (keydata.Status <> Registered) then begin

  case ACTION_EXPIRED  of //0:no action, 1:nag screen, 2:terminate

   1: wait(10);

   2:begin

       showmessage('Not Registered');

       application.Terminate;

     end;

   end;

 end;

if AVLock.InstancesCtrl then begin

  if keydata.TooManyInstances then begin

     showmessage('Too many instances');

     application.Terminate;

  end;

  if not AVLock.IsLocal and (AVLock.activeinstances.count < 2) then begin

     showmessage('This application must be run first from the server.');

     application.Terminate;

   end;

 end;

end;

 

Ya habíamos visto como se llamaba a este procedimiento en el fichero del proyecto para mostrar un formulario donde el usuario pueda registrarse y finalmente según sea al estado de registración decide si continúa con la ejecución del programa o la interrumpe. Tiene un solo parámetro boolean "force" que permite que el formulario se muestre en forma condicional o incondicional. Si es True, se muestra en forma incondicional, pero si es False, antes de mostrarlo se consulta el estado del componente y solo se lo muestra si la siguiente linea resulta ser True.

 

if AVLock.IsLocal and (force or (keydata.Status = Moved) or (keydata.DaysLeft < EXPIRY_DAYS_TO_WARN))

 

Después, si es True, con AVLock.ReadAppData(False,ic,icode); se leen desde los datos locales de registración los datos del usuario, se crea el formulario con F:=TRegForm.Create(nil);, se asignan los campos del formulario y se lo muestra con la sentencia F.ShowModal;  

A continuación, se verifica el estado de registración del componente y en caso de no estar registrado (keydata.Status <> Registered)

se ejecuta la acción correspondiente al valor de la constante de configuración ACTION_EXPIRED, si es 1 se muestra la pantalla wait(10) con dies segundos de cuenta regresiva y si es 2 se muestra el mensaje "Not Registered" y se termina la ejecución del programa.  

 

Después se efectúa el control de instancias que solo se realiza si AVLock.InstancesCtrl es True.

 

procedure trimfields(var usrname,company,email,other:string);

 

Es un procedimiento utilitario que aplica la función trim a las variables pasadas como parametros.

 

function testfields(usrname,company,email,other:string):boolean;

 

Esta función utilitaria verifica que todos los datos del usuario pasados como parametros estén completados.

 

function StartTrial(usrname,company,email,other:string; var newstatus:string):string;

 

Esta función inicia el periodo trial de la aplicación. Solo se aplica si la aplicación no está registrada (keydata.Status = Unregistered).

Después si la constante de configuración USER_DATA_REQUIRED es True se verifica que se hayan completado los datos del usuario y de no ser así se muestra un mensaje y se abandona la función.  Finalmente se hace un llamado al método OnlineStartTrial del componente para iniciar el periodo trial. Si la operación fue exitosa se guardan los datos del usuario en el registro del OLM con AVLock.OnlineSaveUserDAta() y se obtiene nuevamente el etado de registración y se lo pasa a través de la variable newstatus. El mensaje generado se pasa como resultado de la función. Abajo puede ver su código:

 

function StartTrial(usrname,company,email,other:string; var newstatus:string):string;

var n:integer;

 res:string;

begin

 result:='';

if (keydata.status <> UnRegistered) then begin

   result:='Trial period already registered.';

   exit;

end;

 res:='00';

 trimfields(usrname,company,email,other);

if (keydata.Status = Unregistered) then begin

  if USER_DATA_REQUIRED then begin

    if not testfields(usrname,company,email,other) then begin

       result:='Please take a few moments to fill out your user data, then try again.';

       exit;

     end;

   end;

                  //(index,users,inst,days,values)

   res := AVLock.OnlineStartTrial(0,1,1,30,'000');

end;

if (res='00') then begin

   AVLock.OnlineSaveUserData(usrname,company,email,other,0);

   newstatus:=GetRegStatus;

   result:='Trial started or synchronized successfully.';

end else result:='Could not start the trial period.';

end;

 

 

function RegKey(key,usrname,company,email,other:string; var newstatus:string):string;

 

Esta función Registra una clave de registración en el OLM y localmente. Se pasan como parámetros la clave de registración y los datos del usuario. Primero se verifica con testfields si se han ingresado los datos del usuario. Finalmente se guardan los datos del usuario con OnlineSaveUserData y se registra la clave con OnlineRegisterKey, se obtiene el nuevo estado de registración con GetREgStatus y se lo pasa a través de la variable newstatus. Se devuelve como resultado de la función un mensaje que describe la operación realizada. Abajo puede ver el codigo fuente:

 

function RegKey(key,usrname,company,email,other:string; var newstatus:string):string;

var s1,s2: string;

   err:integer;

begin

 result:='';

 trimfields(usrname,company,email,other);

if not testfields(usrname,company,email,other) then begin

   result:='Please fill out your user data then try again.';

   exit;

end;

//Save Uuser data into the OLM and locally

 s1:=AVLock.OnlineSaveUserData(usrname,company,email,other,0);

//register KEY into the OLM and locally

 if (s1='00') then begin

   s2:=AVLock.OnlineRegisterKey(trim(key));

   if (s2='00') then begin

     result:='Key registered successfully';

     newstatus:=GetRegStatus;

  end else result := Error2Str(s2);

 end else result := Error2Str(s1);

end;

 

 

function Renew(var newstatus:string):string;

 

Esta función accede al OLM y verifica si el campo Paid es igual a 'Y' (Paid='Y'), en ese caso genera una nueva clave de registración en el OLM y la pasa a la aplicación para ser guardada en los datos locales de registración. Para mayor información vea (Métodos > Métodos de acceso al  OLM)

 

function Renew(var newstatus:string):string;

var res, msg:string;

begin

 newstatus:='';

 res := AVLock.OnlineRenew(0);

if (res='00') or (res='') then newstatus:=GetRegStatus;

if (res='00') then result:='User Data synchronized and Renewal Applied'

else if (res='') then result:='User Data synchronized'

else result:='ERROR: '+res;

end;

 

 

function Synch(var newstatus:string):string;

 

Esta función realiza una sincronización (OLM -> Local) utilizando el método OnlineSynch. Lee la información de registración y del usuario desde el OLM y reemplaza con esta los datos locales de registración. Para mayor información vea (Métodos > Métodos de acceso al  OLM)

 

function Synch(var newstatus:string):string;

var res:string;

begin

 newstatus:='';

 res := AVLock.OnlineSynch(0);

if (res='00') then begin

   newstatus:=GetRegStatus;

   result:='User and Key data Synchronized';

end else result := Error2Str(res);

end;

 

 

function FullSynch(var newstatus:string):string;

 

Esta función básicamente realiza una sincronización (OLM -> Local) como en el caso anterior, pero dada la situación de registración puede actuar como el metodo StartTrial (en caso de no haber un registro existente en el OLM) o actuar como el metodo OnlineRenew cuando (Paid='Y'). Para mayor información vea (Métodos > Métodos de acceso al  OLM)

 

function FullSynch(var newstatus:string):string;

var res, msg:string;

begin

 newstatus:='';

 res := AVLock.OnlineFullSynch(0);

if (res='00') or (res='') then newstatus:=GetRegStatus;

if (res='00') then result:='User and Key data synchronized and/or renewal applied and/or Trial Started'

else if (res='') then result:='Synchronized User data only'

else result := Error2Str(res);

end;

 

procedure ShowInstances;

 

Este procedimiento muestra las instancias de la aplicación que se están ejecutando.

 

procedure ShowInstances;

var s:string;

   i:integer;

begin

if AVLock.InstancesCtrl then begin

   AVLock.Refresh;

   s:='There are active '+inttostr(AVLock.activeinstances.count)+' of '+

   inttostr(keydata.Instances)+' Instances allowed'+#13#10

   +'----------------------------------------------------------'+#13#10;

   for i:=0 to AVLock.activeinstances.count -1

   do s:=s+AVLock.activeinstances[i]+#13#10;

     s:=s+'----------------------------------------------------------';

   showmessage(s);

end else showmessage('Instances control not allowed');

end;

 

procedure CheckDate;

 

Este procedimiento obtiene la fecha actual desde un servidor de internet y la compara con la fecha del sistema. Si hay una diferencia mayor a un día muestra un díalogo al usuario invitandolo a corregir la fecha del sistema con la obtenida desde internet.

 

procedure CheckDate;

var onlinedate:tdatetime;

   dif:integer;

begin

 onlinedate := GetOnlineDate(AVLock.TimeHost);

 dif := trunc(abs(date - onlinedate));

if (dif > 1) then begin

  if (messagedlg('Your system date seems to be incorrect.'+#13#10+

              'Computer date = '+formatdatetime('mmm dd, yyyy',date)+#13#10+

              '  Online date = '+formatdatetime('mmm dd, yyyy',onlinedate)+#13#10+

              'Would you like to fix your system date now? ',

               mtConfirmation, [mbYes, mbNo], 0) = mrYes)

  then fixsystemdate(onlinedate);

end else showmessage('Your system date seems to be correct');

end;

 

procedure CheckAndFixDate;

 

Este procedimiento verifica que la aplicación esté registrada y en ese caso corrige la fecha del sistema sin consultar utilizando el método OnlineChackDate.

 

procedure CheckAndFixDate;

begin

 if (keydata.Status = registered) then AVLock.OnlineCheckDate(true) //fix system date

else showmessage('Please register or start the trial period before to call this feature.');

end;

 

function RemoveReg(var newstatus:string):string;

 

Esta función elimina los datos de registración locales y del OLM. Permite eliminar la registración existente para volver a probar con otra configuración. No debería estar accesible al usuario final.

 

 

function RemoveReg(var newstatus:string):string;

var ok:boolean;

   s:string;

begin

if AVLock.EraseReg then result:= 'Local registration data removed'+#13#10

else result:= 'Could not remove Local registration data'+#13#10;

 ok:=False;

 s:= AVLock.OnlineRemoveReg(0); //remove regitration data from the Advanced OLM

 ok:= ((s='00') or (s='11'));

if ok then result:=result+'Online registration data removed'

else result:=result+'Could not remove Online registration data';

 newstatus:=GetRegStatus;

end;