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
devque acabara en un ejecutable no desbloquea nada. - Una clave
runtimeno concede ningún puesto de desarrollo. - Sus clientes finales no tienen nada que introducir ni nada que activar: la clave
runtimeestá 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
// Local variables
long ll_rc
string ls_dev_key
// La clave RUNTIME va en el codigo : DEBE ir dentro del ejecutable.
ll_rc = PBT_SetLicense(gs_licensee, gs_runtime_key)
// 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_dev_key = ProfileString("pbtoolboxai.ini", "license", "dev", "")
if ls_dev_key <> "" then ll_rc = PBT_SetLicense(gs_licensee, ls_dev_key)
Open(w_main)
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_LicenseStatusno 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
runtimepertenece al código: debe acabar dentro del ejecutable que entrega. La clavedevno — 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 archivopbtoolboxai.inijunto 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"
// Local variables
string ls_status
// El estado de la licencia, en JSON
ls_status = Space(1024)
PBT_LicenseStatus(ls_status, 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 cinco componentes de la edición comunidad, descritos justo debajo, que nunca están limitados.
Cinco componentes siguen siendo gratuitos #
La edición comunidad no requiere nada: sin ninguna clave, cinco 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 |
| json | Leer y escribir JSON en PowerScript puro (rutas, tipos, construcción) |
La elección es deliberada: los cuatro componentes visuales son los 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. json se suma porque está escrito en PowerScript puro, sin la DLL: es una herramienta básica, no un componente.
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 cinco 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 | Como máximo 3 pestañas visibles dibujadas (el componente conserva todas sus páginas: la clave las muestra) |
| ribbon | 2 pestañas como máximo |
| toolbar | 6 items mostrados, en todas las barras; 6 entradas por nivel de menú desplegable; 6 opciones por lista desplegable |
| tilesbox | 8 mosaicos mostrados |
| commandpalette | 5 comandos mostrados |
| speechout | 4 frases y 400 caracteres por lectura (cola incluida), luego se dice la mención demo; pasadas las 4 primeras frases, cada lectura termina con ella |
| crypto | textos de 2048 caracteres, archivos y blobs de 2048 bytes como máximo, tanto a la entrada como a la salida (también un descifrado o una decodificación) |
| restclient | cuerpos de las respuestas cortados a 4096 caracteres, sin descarga, ni subida, ni petición de rango (Range) |
| soundplayer | solo se reproducen los 10 primeros segundos de un sonido (sea cual sea la velocidad), y dos notas descendentes lo dicen |
| video | una película se detiene tras 10 segundos; ni salto ni captura de imagen más allá |
| xml | documentos de 65 536 caracteres como máximo, modificaciones incluidas; un documento construido más largo no se valida (of_is_valid falso) ni se indenta (of_pretty vacío) |
| listbar | 6 entradas mostradas, en todas las secciones — una búsqueda o un of_from_datastore solo muestra esas seis |
| statusbar | 4 paneles mostrados; 6 entradas por lista desplegable de un panel (los separadores no cuentan), una última línea atenuada indica cuántas quedan ocultas |
| contextmenu | 6 entradas por lista, en cada nivel de cascada (los separadores y los encabezados no cuentan); las demás quedan en memoria sin mostrarse, y una última línea atenuada lo indica |
| menubar | 3 menús en la barra; 6 entradas por lista y 12 por menú, todas sus cascadas incluidas (los separadores no cuentan); una lista recortada termina con una línea atenuada que lo indica |
| radialmenu | Como máximo 4 ramas por corona (menos si ii_max_sectors es menor), sin rama «Más», y un solo nivel de sub-ruedas (una rama más profunda queda atenuada); una corona recortada termina con un sector atenuado «+N», y «PBToolboxAI — DEMO» figura bajo el cubo |
| shellexplorer | 8 nodos por nivel del árbol |
| stepbar | 4 pasos mostrados |
| buttonbar | 4 botones mostrados; los siguientes no se dibujan ni se activan con el teclado (su letra Alt se queda en la ventana) |
| crosstab | 500 filas de origen usadas, exportación y copia desactivadas; of_get_cell_value y of_get_cell_rows funcionan sobre esas 500 filas y dan las mismas cifras que en pantalla |
| breadcrumb | 4 segmentos mostrados, los últimos de la ruta; 6 ramas por menú de ramas (una nota de demo dice el resto) y 6 sugerencias de escritura |
| jsontree | Las 200 primeras líneas del documento mostradas, 20.000 caracteres como máximo (una línea más larga se corta); la búsqueda y la selección se quedan en ellas |
| xmltree | Las 200 primeras líneas del documento mostradas, 20.000 caracteres como máximo (una línea más larga se corta); la búsqueda y la selección se quedan en ellas |
| datagrid | 100 filas mostradas, exportaciones CSV y Excel desactivadas, también la copia (Ctrl+C) |
| markdownview | El principio del documento: 40 bloques (un título, un párrafo, una entrada de lista, una fila de tabla cuentan cada uno como uno; un bloque de código se corta a 40 líneas) o 4.000 caracteres del documento, lo primero que se alcance — un bloque más largo se corta —, seguidos de una nota; la búsqueda y la tabla de contenidos se atienen a ellos |
| form | 6 campos, los primeros mostrados en el orden de la pantalla — un campo de una sección plegada también cuenta: desplegarla no redibuja nada; los demás quedan en memoria y en of_values sin mostrarse ni juzgarse |
| propertygrid | 8 filas de propiedades, contadas en el orden de la pantalla (vista por categoría): un grupo cerrado cuenta como una fila, sus subpropiedades solo cuentan una vez abierto el grupo, los encabezados de categoría no cuentan; el resto queda en memoria y en of_values sin mostrarse, y ni un resumen ni la búsqueda leen su valor |
| kanban | las 4 primeras columnas visibles, 5 tarjetas por columna contadas en el orden de la columna entre las tarjetas visibles, cada una seguida de una nota; el recuento y la suma de un encabezado solo dicen las tarjetas dibujadas; las demás se quedan en memoria y se mueven sin mostrarse |
| gantt | 12 tareas dibujadas, las primeras filas de la cuadrícula en su orden (lo que contiene un resumen plegado no cuenta), seguidas de una nota; las demás se quedan en memoria, en la ruta crítica y en las fechas y el avance del resumen que las contiene, sin mostrarse ni poder seleccionarse |
| scheduler | Las 12 primeras citas del intervalo en pantalla, las demás se quedan en memoria sin mostrarse |
| angulargauge | Los 3 primeros rangos visibles dibujados (un rango oculto no cuenta); los demás se quedan en memoria sin mostrarse, y la clave puesta los muestra sin volver a enviar nada |
| chartcartesian | Las 3 primeras series dibujadas, leyenda incluida; las demás se quedan en memoria sin mostrarse, y la clave puesta las muestra sin volver a enviar nada |
| chartpie | Las 5 primeras porciones dibujadas, leyenda incluida, y los porcentajes calculados sobre ellas; las demás se quedan en memoria sin mostrarse, y la clave puesta las muestra sin volver a enviar nada |
| gauge | Los 3 primeros rangos visibles dibujados (un rango oculto no cuenta); los demás se quedan en memoria sin mostrarse, y la clave puesta los muestra sin volver a enviar nada |
| carousel | Los 6 primeros elementos visibles dibujados, en el orden del carrusel (un elemento oculto no cuenta); los demás se quedan en memoria sin mostrarse ni poder seleccionarse, y la clave puesta los muestra sin volver a enviar nada |
| treeview | Los 8 primeros nodos de cada nivel dibujados, bajo cada padre, en el orden del modelo, y 200 nodos en todo el árbol, los primeros añadidos — antes de la ordenación, la búsqueda y la ocultación (un nodo oculto cuenta, una búsqueda o una ordenación nunca muestran el noveno, lotes y grupos incluidos; un total nunca cuenta lo que el límite oculta); los demás se quedan en memoria sin mostrarse ni poder seleccionarse, y la clave puesta los muestra sin volver a enviar nada; of_export_csv y of_export_xlsx se rechazan |
| dockcontainer | 3 paneles: el cuarto of_add_panel devuelve -6, su control se queda en su sitio, visible |
| codeeditor | Las 200 primeras líneas mostradas y editables, seguidas de una nota; las demás se quedan en memoria y en is_text sin mostrarse: la búsqueda, los marcadores e il_doc_line se atienen a las líneas mostradas, y un texto pegado que las sobrepasa se une a las líneas en memoria |
| 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.