Antes de nada, hay una confusión sobre las opciones que Copilot te ha indicado. Las casillas "Enable XLS Padlock VBA API" y "Expose VBA API via PLEval"
no existen como tales en XLS Padlock 2025.2, y tampoco hay ningún fichero
XLSPadlock.exe independiente que haya que activar: la API de VBA ya está disponible de forma nativa en cualquier EXE compilado con XLS Padlock, a través del COM add-in
GXLSForm.GXLSFormula. No hay nada que habilitar en la licencia.
El problema de que tu macro "no devuelva nada" es que los nombres de funciones que te ha sugerido Copilot (
XLSPL_GetActivationKey,
XLSPL_GetLicenseExpirationDate, etc.)
no existen en XLS Padlock. Copilot los ha inventado.
La API real se consulta a través de
PLEvalVar(...). Estas son las únicas variables de licencia disponibles en tiempo de ejecución:
PLEvalVar("IsTrial") — True si el EXE se ejecuta como clave de prueba (demo), False si está registrado
PLEvalVar("TrialState") — días (o ejecuciones) restantes; funciona tanto para claves trial como para claves registradas con fecha de caducidad
PLEvalVar("SystemID") — el ID de hardware del equipo del usuario
Limitaciones importantes (por diseño, por seguridad):
- No existe ninguna API para recuperar el código de activación en texto claro en tiempo de ejecución — hacerlo invalidaría la protección por hardware
- No hay ninguna API para obtener la fecha exacta de caducidad como fecha; se usa
TrialState para saber los días/usos restantes
Ejemplo de función que puedes asignar a tu botón:
Code:
Public Sub MostrarInfoLicencia()
Dim XLSPadlock As Object
Dim tipoLic As String
Dim restante As Variant
Dim sysID As String
On Error Resume Next
Set XLSPadlock = Application.COMAddIns("GXLSForm.GXLSFormula").Object
On Error GoTo 0
If XLSPadlock Is Nothing Then
MsgBox "La información de licencia sólo está disponible al ejecutar el EXE compilado."
Exit Sub
End If
If XLSPadlock.PLEvalVar("IsTrial") Then
tipoLic = "Demo / Trial"
Else
tipoLic = "Registrado (anual o ilimitado)"
End If
restante = XLSPadlock.PLEvalVar("TrialState")
sysID = XLSPadlock.PLEvalVar("SystemID")
MsgBox "Tipo de licencia: " & tipoLic & vbCrLf & _
"Días/usos restantes: " & restante & vbCrLf & _
"System ID: " & sysID
End Sub
Tres puntos importantes para tus tres tipos de licencia (demo, anual, ilimitada), todas con bloqueo por hardware:
IsTrial sólo devuelve True cuando la clave se ha generado como clave trial con la opción "nag screen". Tus claves "anuales" deben generarse como claves registradas con fecha de caducidad — para ellas IsTrial será False y la duración restante se lee de TrialState.
- Para distinguir "anual" e "ilimitada" en tu formulario, lo más limpio es usar un producto distinto (o un prefijo de clave distinto) para cada plan, o codificar el tipo de plan en un campo personalizado al generar la clave. XLS Padlock por sí solo no distingue "anual" de "ilimitada", ya que una clave ilimitada simplemente no tiene fecha de caducidad.
PLEvalVar devuelve un valor vacío cuando el fichero .xlsm se ejecuta directamente en Excel (fuera del EXE). Por eso tu macro con On Error Resume Next no devolvía nada durante las pruebas: hay que probar siempre desde el .exe ya compilado.
Documentación:
https://www.xlspadlock.com/doc/vba-api-cookbook