Podrías utilizar algo tal que así:
Para el ejemplo, crea un formulario y añádele dos 'CommandButton', uno para crear la clave en el registro y otro para comprobarla. Luego añade este código al form.
********************************************************************************
Option Explicit
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const REG_SZ = 1
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const NUMERO_DESPISTE = 32 'Por ejemplo
Private Const DIAS_PLAZO = 30 'También por ejemplo
Private Sub Command1_Click()
RegistrarClaveSetup ValorClaveSetup()
End Sub
Private Sub Command2_Click()
ChkClaveSetup
End Sub
Private Function ValorClaveSetup() As Long
ValorClaveSetup = (Year(Now) + NUMERO_DESPISTE) * 10000& _
+ (Month(Now) + NUMERO_DESPISTE) * 100& + Day(Now) + NUMERO_DESPISTE
End Function
Private Sub RegistrarClaveSetup(ByVal Clave As String)
Dim lngRc As Long, lngResult As Long
lngRc = RegOpenKey(HKEY_LOCAL_MACHINE, "Software", lngResult)
lngRc = RegCloseKey(lngResult)
lngRc = RegCreateKey(lngResult, "SoftwareDeBea", lngResult)
lngRc = RegCreateKey(lngResult, "AplicacionDeBea", lngResult)
lngRc = RegSetValue(lngResult, "", REG_SZ, Clave, 0)
End Sub
Private Sub ChkClaveSetup()
Dim strClave As String
Dim intDia As Integer, intMes As Integer, intAnho As Integer
strClave = RecuperarClaveSetup
If Len(strClave) <> 8 Then
MsgBox "Clave no válida"
Exit Sub
End If
intAnho = Val(Left(strClave, 4)) - NUMERO_DESPISTE
intMes = Val(Mid(strClave, 5, 2)) - NUMERO_DESPISTE
intDia = Val(Right(strClave, 2)) - NUMERO_DESPISTE
If DateDiff("d", Now, intDia & "/" & intMes & "/" & intAnho) <= DIAS_PLAZO Then
MsgBox "Dentro del plazo"
Else
MsgBox "Plazo expirado"
End If
End Sub
Private Function RecuperarClaveSetup() As String
Dim lngRc As Long, lngResult As Long, strValor As String
lngRc = RegOpenKey(HKEY_LOCAL_MACHINE, "Software", lngResult)
lngRc = RegCloseKey(lngResult)
lngRc = RegOpenKey(lngResult, "SoftwareDeBea", lngResult)
strValor = String(255, 0)
lngRc = RegQueryValue(lngResult, "AplicacionDeBea", strValor, 255)
lngRc = RegCloseKey(lngResult)
RecuperarClaveSetup = Left(strValor, InStr(1, strValor, Chr(0)) - 1)
End Function
********************************************************************************
Bueno, el ejemplo básicamente recupera la fecha actual y la pone como
aaaammdd tras sumarle un número (NUMERO_DESPISTE) a cada parte para que el valor en el registro no parezca una fecha (te podrías currar otro camuflage...). Escribes el valor camuflado en el registro en 'HKEY_LOCAL_MACHINE/SOFTWARE/SOFTWAREDEBEA/APLICACIONDEBEA'. Luego cuando quieras recuperas ese valor y le restas el número para convertirlo otra vez a fecha. Utilizas 'DateDiff' para conocer los días que han pasado.
Esto así a grandes rasgos... Examina el código y adáptalo a tus necesidades. También te tengo que decir que este método es un poco ingenuo y tal vez relativamente fácil de crackear, pero puede ser efectivo. Un consejo es que cambies los nombres de variables, funciones, métodos, etc., para que no parezca que son lo que son...
Suerte.