# 8. Licencia y modo demo #

← FAQ y resolución de problemas · Índice

PBToolboxAI es una biblioteca comercial. El control de la licencia es totalmente sin conexión: ninguna conexión, ninguna activación, ninguna llamada a un servidor. Una clave firmada se asigna al arrancar y la DLL la verifica localmente.

## 8.1 Los tres tipos de claves #

Las claves son acumulables: llame a `PBT_SetLicense` tantas veces como sea necesario, la biblioteca conserva una clave por tipo.

Tipo | Titular | Desbloquea
--- | --- | ---
`dev` | Nominativa, un desarrollador | Únicamente en el IDE de PowerBuilder
`runtime` | Su empresa, incorporada en la aplicación entregada | Únicamente en un ejecutable compilado
`demo` | Suministrada con la aplicación de demostración | La aplicación de demostración, en el IDE, hasta su caducidad

Por lo tanto, un proyecto necesita las dos: un puesto `dev` por desarrollador y una clave `runtime` para la aplicación entregada a sus clientes.

- Una clave `dev` que acabara en un ejecutable no desbloquea nada.
- Una clave `runtime` no concede ningún puesto de desarrollo.
- Sus clientes finales no tienen nada que introducir ni nada que activar: la clave `runtime` está en su código.

> La detección «IDE o ejecutable» la realiza la propia DLL (nombre del proceso, módulos design-time cargados), no código de PowerBuilder — no se puede eludir desde sus fuentes.

## 8.2 Asignar la clave #

Una sola cosa que hacer, antes de la apertura de la primera ventana:

    // Declaracion - objeto aplicacion, "Local External Functions"
    Function long PBT_SetLicense (string as_client, string as_key) Library "pbtoolboxai.dll"

    // Evento open del objeto aplicacion
    long ll_rc
    string ls_cle_dev

    // La clave RUNTIME va en el codigo : DEBE ir dentro del ejecutable.
    ll_rc = PBT_SetLicense(gs_titulaire, gs_cle_runtime)

    // La clave DEV se lee del puesto : solo desbloquea el IDE, y en el codigo
    // iria en cada copia entregada sin servir para nada.
    ls_cle_dev = ProfileString("pbtoolboxai.ini", "license", "dev", "")
    if ls_cle_dev <> "" then ll_rc = PBT_SetLicense(gs_titulaire, ls_cle_dev)

    Open(w_principale)

> La clave se establece mediante la función de la DLL, nunca mediante un método de componente: se aplica a todo el proceso y debe establecerse antes de que exista ningún componente. Por esa misma razón `PBT_LicenseStatus` no pide ningún handle.

El titular se pasa en claro, como primer argumento: es el nombre (o la dirección de correo) a cuyo nombre se emitió la licencia, y debe coincidir con el que lleva la clave firmada. Así, una clave no puede circular sin el nombre de quien la compró.

Retorno | Significado
--- | ---
`0` | Clave válida y conservada
`-1` | Formato de clave no válido
`-2` | Firma no válida (clave alterada o ajena)
`-3` | Mantenimiento caducado para esta versión de la biblioteca (véase 8.5)
`-4` | Clave `demo` caducada
`-5` | El titular indicado no coincide con el de la clave

> 💡 Qué clave va dónde. La clave `runtime` pertenece al código: debe acabar dentro del ejecutable que entrega. La clave `dev` no — solo desbloquea el IDE, así que dentro de un ejecutable no sirve de nada y sin embargo circula, con el nombre de su empresa. Su sitio es un archivo `pbtoolboxai.ini` junto al IDE, o un valor del registro.

Asignar la clave después de la creación de un componente también funciona: los componentes ya abiertos se desbloquean inmediatamente. Pero lo más sencillo sigue siendo el evento `open` de la aplicación.

> 💡 Conserve la clave en una constante o en un recurso de su aplicación. Está firmada: no contiene ningún secreto aprovechable y no se puede modificar sin invalidar su firma.

## 8.3 Comprobar el estado de la licencia #

    // Declaracion
    Function long PBT_LicenseStatus (ref string as_json, long al_len) Library "pbtoolboxai.dll"

    string ls_statut

    ls_statut = Space(1024)
    PBT_LicenseStatus(ls_statut, 1024)
    // -> {"licensed":true,"ide":false,"keys":{...},"reason":""}

Útil en fase de integración para comprobar que una clave se tiene realmente en cuenta, o para registrar un arranque en su registro de aplicación.

## 8.4 El modo demo #

Sin una clave válida — o con una clave que no se aplica al contexto (una clave `dev` en un exe, por ejemplo) — la biblioteca funciona en modo demo: todo es utilizable, todo es visible, pero con límites — salvo los cuatro componentes de la edición comunidad, descritos justo debajo, que nunca están limitados.

### Cuatro componentes siguen siendo gratuitos #

La edición comunidad no requiere nada: sin ninguna clave, cuatro componentes funcionan sin distintivo y sin límite, indefinidamente.

Componente | Lo que aporta
--- | ---
statictext | Etiqueta con marcado: negrita, colores, enlaces, viñetas, bloques plegables
messagebox | Cuadro de diálogo modal con tema y botones libres
toaster | Notificaciones en la esquina de la pantalla, con título, imagen y acciones
webbrowser | Navegador WebView2 alojado en una ventana PowerBuilder

La elección es deliberada: son los cuatro que se encuentran primero, no llevan ningún modelo de datos propio y bastan para demostrar en un puesto bloqueado que el runtime se despliega — el obstáculo real antes de cualquier compra.

La lista vive en la DLL. `PBT_LicenseStatus` la devuelve tal cual, en `"free"`: su aplicación puede así anunciar a qué tiene derecho sin clave, en lugar de descubrirlo componente por componente.

Una clave válida siempre prevalece: en esos cuatro componentes como en los demás, restablece su nombre y su edición.

### El distintivo #

Cada componente muestra un distintivo «PBToolboxAI — DEMO», que no se puede ocultar.

### Los límites funcionales #

Componente | Límite en modo demo
--- | ---
tab | 3 páginas como máximo
ribbon | 2 pestañas como máximo
toolbar | 6 items mostrados, en todas las barras
tilesbox | 8 mosaicos mostrados
Todos los demás | Solo el distintivo — ningún límite funcional

Estos límites se aplican a la representación: nada falla, la visualización se trunca. Por lo tanto, usted puede evaluar realmente cada componente, con sus propios datos, antes de comprar.

Asignar una clave válida elimina al instante todos estos límites y retira el distintivo, sin reiniciar la aplicación.

## 8.5 Perpetua + mantenimiento #

La licencia es perpetua: las versiones cubiertas por su periodo de mantenimiento funcionan para siempre, incluso después de que este caduque.

En concreto, la clave lleva una fecha de fin de mantenimiento, comparada con la fecha de compilación de la DLL:

- una versión de la biblioteca publicada durante su mantenimiento queda desbloqueada definitivamente;
- una versión publicada después de la caducidad devuelve `-3`: renueve el mantenimiento para acceder a ella;
- sus aplicaciones ya entregadas nunca se ven afectadas: incorporan la versión que siempre han utilizado.

## 8.6 Preguntas frecuentes #

¿Mi clave se verifica en línea? No. Ninguna red, nunca. La verificación es una firma RSA validada localmente por Windows.

¿Mis clientes necesitan una clave? No. Su clave `runtime` está en su aplicación; ellos no ven nunca nada de la licencia.

¿Qué ocurre si olvido `PBT_SetLicense` en producción? La aplicación funciona, pero cada componente muestra el distintivo demo y se aplican los límites de la tabla anterior. Es el primer punto que hay que comprobar si aparece un distintivo en casa de un cliente.

¿Puedo asignar una clave `dev` y una clave `runtime` en el mismo código? Sí — es incluso el caso habitual: la `dev` sirve cuando ejecuta desde el IDE, la `runtime` cuando ejecuta el exe. Cada una se ignora en el otro contexto.

El distintivo aparece aunque la clave está asignada. Tres causas, por orden de frecuencia: (1) clave `dev` mientras ejecuta un exe compilado, o al revés; (2) valor devuelto por `PBT_SetLicense` sin comprobar — verifique que vale `0`; (3) mantenimiento caducado para la versión de DLL instalada (retorno `-3`). `PBT_LicenseStatus` lo resuelve en una línea.

Una clave es nominativa. Una clave `dev` está vinculada a un desarrollador, una clave `runtime` a su empresa. No las comparta fuera de su equipo.

← FAQ y resolución de problemas · Índice