Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Evento adecuado para controlar si el software está registrado (https://www.clubdelphi.com/foros/showthread.php?t=62696)

vejerf 08-01-2009 16:55:11

Evento adecuado para controlar si el software está registrado
 
Feliz Año a todos los usuarios de este fantástico foro!!!
Estoy intentando dotar de algo de seguridad a una aplicación realizada simplemente para evitar la libre distribución del mismo (sino mi jefe me mata :D). Estoy usando el componente mxProtector y una protección que se basa en registrar el software con un número de serie que se obtiene a partir del id de hardware y de un username. Mi pregunta es la siguiente, ¿qué evento es el más apropiado para realizar este control?
Hay que tener en cuenta que el funcionamiento sería, algo como sigue:
if Registrado then
begin
//Inicialización del programa
//Cauce normal del programa
end
else
begin
//Formulario de registro
if Registrado then
//Inicialización del programa
//Cauce normal del programa
else
Close;
end;

Gracias!!!

dec 08-01-2009 17:04:44

Hola,

Lo cierto es que no creo que haya un sólo lugar en el que actuar en tu caso. Puede ser donde tú quieras o necesites. Puede ser al principio del todo, en el propio archivo "DPR", antes de crear ningún formulario de la aplicación; pero, también puede ser una vez inicializada la aplicación, incluso dejar al usuario usar ciertas partes del programa con normalidad, mientras que no otras, hasta que no lo "registre". No sé si con esto te digo algo que merezca la pena o qué. ;)

vejerf 08-01-2009 17:12:06

Hola Dec,
Primero decirte que cualquier comentario que aporte algo merece la pena ;) y después de hacerte un poco la pelota comentarte que me interesaría hacer el control antes de crear los formularios, pero no sé como hacerlo. Me dices que se puede hacer en el dpr, pero no se como. Por otra parte pienso como lo voy a hacer antes de crear los formularios si el formulario de registro es otro formulario. Estoy atascaillo aysss

ContraVeneno 08-01-2009 17:16:31

yo lo pondría en el evento "OnCreate" de tu formulario principal y la primera instrucción, sería la inicialización del componente. Revisa la ayuda y los "demos" que hay sobre ese componente, en ellos se explica bastante bien como proteger la aplicación por fechas o por número de serie.

dec 08-01-2009 17:30:48

Hola,

Aparte de lo dicho por el amigo Contra, echa un vistazo a este archivo "DPR":

Código Delphi [-]
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  URegisterForm in 'URegisterForm.pas' {RegisterForm};

{$R *.res}

begin
  Application.Initialize;

  with TRegisterForm.Create(nil) do
  try
    ShowModal();
  finally
    Free();
  end;

  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Como ves, se trata del archivo "DPR" de un proyecto "vacío" (aunque ya existe el formulario "Form1", que, es el principal) al que se le ha añadido otro formulario. Pues bien, antes de crear el formulario principal de la aplicación, como puedes ver, podemos crear y utilizar otro formulario, u otro componente. No sé si con esto ya coges la idea o no. :rolleyes: ;)

vejerf 08-01-2009 17:45:19

Gracias a los dos,
Por una parte ya estaba trabajando en la solución de ContraVeneno porque me parecía lo más lógico, pero no tenía muy claro si funcionaría así o no por que el Registro también era un formulario. Por otra parte creo que entiendo tu idea Dec, aunque no sabía que se podía incluir código en el DPR. Creo que te aportación ha sido muy valiosa.
Ya por último y con la solución de ContraVeneno casi implementada me he encontrado con un problema. Si la aplicación está registrada va bien. Si se registra tb va bien. El problema es que no se tenga un número de serie válido y la aplicación deba finalizarse. En este caso debe terminarse sin dar ningún mensaje de aviso cosa que hago en el evento OnCloseQuery. ¿Hay alguna forma de finalizar la aplicación sin pasar por este evento?
Gracias de nuevo!!!

dec 08-01-2009 17:50:15

Hola,

Cita:

¿Hay alguna forma de finalizar la aplicación sin pasar por este evento?
Ya lo creo:

Código Delphi [-]
Application.Terminate();

Respecto del archivo "DPR", piensa que una aplicación de consola sólo cuenta con este archivo. Delphi nos "abstrae" del mismo, trabajando directamente con formularios, pero, como has visto, estos formularios se crean en el archivo "DPR", es ahí donde la aplicación se pone en marcha, y es perfectamente posible programar lo que se necesite ahí mismo. Y ya no digo más, que, luego todo se sabe. :D

vejerf 08-01-2009 17:56:09

Joer macho es q sabeis de to!!! jeje
Gracias de nuevo... aunq prometo seguir dando más la lata :p

ContraVeneno 08-01-2009 18:12:41

Revisa el demo sobre el componente que estas utilizando, ahí viene como comprobar las fechas de registro, el ID del hardware, el número de serie, etc... ese componente tiene un evento para cada situación. En otras palabras, en lugar de manejarlo en el OnCloseQuery, lo podrías manejar en el OnExpiration o en el OnInvalidSerialNumber, que son eventos del componente.

roman 08-01-2009 18:52:44

Cita:

Empezado por vejerf
El problema es que no se tenga un número de serie válido y la aplicación deba finalizarse

Por esto mismo, a mi me parece más adecuado lo que plantea dec porque, ¿para qué construir un formulario (el principal) si al final cabe la posibilidad de que no lo necesitemos?

Lo que pasa es que, dado que se trata de un componente, lo más cómodo es insertarlo en algún lugar, y lo más a la mano es el formulario principal; pero también puedes insertarlo en el formulario de registro y usar ahí los eventos que te indica ContraVeneno.

// Saludos

vejerf 08-01-2009 19:22:07

Me parece muy buena tu idea Roman... así que intentaré llevarla a cabo. Si me encuentro con algún problemilla lo mismo voy variando los planes :D.
Gracias a todos!!!

vejerf 09-01-2009 14:16:59

Hola de nuevo,
En una primera prueba de registro todo funciona perfectamente tal y como yo quería. La solución de incluir el formulario de registro en el .dpr antes de crear cualquier otro formulario me funciona muy bien.
Gracias a todos por vuestra inestimable e impagable ayuda ;)

vejerf 09-01-2009 17:17:00

Pues me he precipitado al decir que todo iba bien. La cosa es que me falla al volver a iniciar la aplicación habiéndome registrado, entonces me vuelve a pedir el nº de serie como si no me hubiera registrado. No sé si el fallo está en la inicializáción del componente o donde. Os dejo el código a ver si veis algo extraño. Creo que en el dpr no está el fallo aunq lo dejo aquí.

Código Delphi [-]
var
  Registrado : Boolean;
  RegistroForm : TRegistroForm;
begin
  Application.Initialize;
  try
    RegistroForm := TRegistroForm.Create(nil);
    Registrado := RegistroForm.mxProtector.IsRegistered;
    if not Registrado then
    begin
      RegistroForm.ShowModal; //Formulario para registrarse en el que podemos o registrarnos o cancelar el registro
      Registrado := RegistroForm.mxProtector.IsRegistered;
      if not Registrado
        Application.Terminate
      else
        //Continuo con la aplicacion
    end
    else
      //Continuo con la aplicación
end;

Gracias.

roman 09-01-2009 17:49:50

Ni idea. Aquí habría que saber cómo funciona el componente y cómo lo estás usando dentro de TRegistroForm. Aparentemente el registro no se hace.

// Saludos

ContraVeneno 09-01-2009 18:33:08

a mi se me hace que va por aquí:

Cita:

Empezado por mxPRotectoHelp
procedure Init;

Unit
mxProtector

Description
Use Init to check the registrations in one step.
If poAutoInit included in Options this method will be called automatically after application lunch, is it is not included you have to call it or one of following methods to check the registration.

* CheckPassword
* CheckStartTrial
* CheckTimeTrial
* CheckDayTrial
* CheckRegistration


vejerf 06-02-2009 11:59:00

Hola de nuevo,

Tengo un problema con el componente MxProtector a la hora de generarme el nº de serie y es que me está generando el mismo para varios equipos. Yo había realizado la prueba en 3 PC's distintos y me daba distintos nº de serie. Para generar los nº de serie se basa en el Id hardware, pero para mi sorpresa ayer fui a instalarlo en 4 portátiles Panasonic y me leía el mismo Id hardware y por tanto me generaba el mismo serial.
¿Como puedo hacer para que me genere seriales distintos para PC's distintos?
¿Ese Id hardware de donde lo toma, es decir, donde está registrado para yo poder verlo?

Gracias!!!

ContraVeneno 06-02-2009 15:46:12

según tengo entendido, la llave la genera considerando el IDHardware y el nombre de usuario... podría ser que las laptops al ser de la misma marca, sean de la misma serie, utilicen el mismo hardware... ¿pero el nombre de usuario al que registras es el mismo?

vejerf 06-02-2009 15:49:47

Pues sí le daba el mismo nombre de usuario. Es una aplicación que debe funcionar independientemente de las cuentas de usuario en el PC, entonces yo a ese campo lo que hice fue darle el nombre de la aplicación, pues pensaba que el Id Hardware sería distinto en cada uno.
Gracias por tu respuesta.

cmm07 06-02-2009 16:01:31

pues yo no utilizo ese componente sino lo hago algo similar de la siguiente manera, coloco 4 Edit, en el 1º coloco la Idetificación : que es el nombre del programa a registrar (ej.Soft1), en el 2º IdCPU que es la Id del hardware, en el 3º Fecha que es la fecha de labios interna, y la 4º registrado a que es el nombre de la empresa u otro, despues estos 4 edits los convierto en numeros, los sumo, y lo multiplico por un numero en especial, y tachan ya tenemos el codigo, y para la parte de registración, lo hago de un modo externo algo similar como la licencia de Delphi 2009.

¿será seguro este metodo? ¿lo podrán hackear y decifrar el metodo?
gracias.

vejerf 09-02-2009 17:08:34

Hola de nuevo,
Volviendo al tema, mi duda es si hay algún otro campo que sea un identificativo único de un PC para poder usarlo para el registro. ¿Se os ocurre alguno? Si es así ¿como se obtiene?
Gracias!!!


La franja horaria es GMT +2. Ahora son las 23:16:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi