|
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:

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:

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:

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;
|