Código:
LPARAMETERS _disco, _factor, _modulo, _nodemo, _unique
_unique = IIF(TYPE('_unique')=='N' .AND. BETWEEN(_unique, 1, 99), _unique, 0)
LOCAL ___clav, ___clax, ___clay, ___key1, ___key2, _work, _alias, _mensa
___clav = _open_clav(_disco, _factor, _unique, 0)
___clax = _open_clav(_disco, _factor, _unique, 3600)
___clay = _open_clav(_disco, _factor, _unique, -3600)
___key1 = 0
___key2 = 0
_alias = SELECT()
_mensa = ""
_work = .F.
IF ___clav=-1 .OR. .NOT. usem_cfg('SHARED in 0')
RETURN .F.
ELSE
LOCATE FOR ALLTRIM(modulo)==ALLTRIM(_modulo)
ENDIF
IF FOUND()
___key1 = ALLTRIM(serializar)
_work = 0
ELSE
_mensa = "Programa MAL instalado."
ENDIF
DO WHILE TYPE("_work")=="N"
DO CASE
CASE _work>0 .OR. _good_keys(___clav, ___key1, _unique) .OR. _good_keys(___clax, ___key1, _unique) .OR. _good_keys(___clay, ___key1, _unique)
DO _pon_fecha
_work = .T.
CASE .NOT. getstrng(@_work, "@KZ 999999", 'Secuencia de CLAVE para el nº de serie '+TRANSFORM(___clav, "@LZ 99999999")+'@@@'+" Instalación de Aplicaciones"+": "+ALLTRIM(texto), 25, 0, "NN_SERIE", '_cadena=-1 .or. _cadena>=0', 'Secuencia de CLAVE INCORRECTA.')
_work = .F.
CASE _work=-1
___key1 = ""
_save_keys(___key1)
CASE _good_keys(___clav, TRANSFORM(_work, "@LZ 999999"), _unique)
IF _save_keys(TRANSFORM(_work, "@LZ 999999"))
DO _pon_fecha
_work = .T.
ELSE
_work = 0
ENDIF
CASE _nodemo
_work = (correcto("El número de Serie proporcionado NO ES CORRECTO para la secuencia de CLAVE.", .T., 1, " Instalación de Aplicaciones"+": "+ALLTRIM(texto))=100)
OTHERWISE
_pub_begin = CTOD(SYS(10, 2447893))
_pub_final = _pub_begin+30
_work = .T.
_mensa = ALLTRIM(texto)+" en modo DEMO."
ENDCASE
ENDDO
clostabl()
SELECT (_alias)
RETURN (LEN(_mensa)=0 .OR. correcto(_mensa, .T., 1, " Instalación de Aplicaciones")=1) .AND. _work
ENDFUNC
**
FUNCTION _good_keys
LPARAMETERS ___clav, ___key1, _unique
LOCAL _factor, _clavex
_clavex = TRANSFORM(INT(RAND(___clav)*IIF(_unique=0, 100000, 1000000)), "@LZ 999999")
RETURN (_clavex==___key1) .OR. ("|"+_clavex+"|"$"|"+___key1+"|")
ENDFUNC
**
FUNCTION _save_keys
LPARAMETERS ___key1
IF bloqureg(" Instalación de Aplicaciones", .F., 'Módulo BORRADO por otro usuario.', 'Módulo OCUPADO por otro usuario.', ALIAS(), .F., .F., .F., .F., .T., .T.)
REPLACE serializar WITH IIF(EMPTY(___key1), ___key1, "|"+___key1+"|"+ALLTRIM(serializar))
ELSE
RETURN .F.
ENDIF
ENDFUNC
**
PROCEDURE _pon_fecha
_pub_begin = CTOD("01.01.1976")
_pub_final = CTOD("13.07.2049")
ENDPROC
**
FUNCTION _open_clav
LPARAMETERS _disco, _factor, _unique, _sinc
LOCAL _atrib[1], _fecha
DIMENSION _atrib[1]
IF FILE(_disk_prog+"FECHADLL.DLL") .AND. ADIR(_atrib, _disk_prog+"FECHADLL.DLL")>0 .AND. _atrib(1, 2)=36864
DECLARE LONG ObtenerFechas IN (_disk_prog+"FECHADLL.DLL") INTEGER, STRING @
_fecha = obtenerfechas(-13286, IIF(RIGHT(_disco, LEN(_pub_slaps))==_pub_slaps, LEFT(_disco, LEN(_disco)-LEN(_pub_slaps)), _disco)+CHR(0))
CLEAR DLLS
RETURN (_unique*1000000)+MOD(_fecha+_sinc, 101301+_factor)+1
ELSE
RETURN -1
ENDIF
ENDFUNC
**
<EOF>