PBToolboxAI v5 ← Site

8. Licenza e modalità demo #

← FAQ e risoluzione dei problemi · Sommario


PBToolboxAI è una libreria commerciale. Il controllo della licenza è interamente offline: nessuna connessione, nessuna attivazione, nessuna chiamata a un server. Una chiave firmata viene impostata all'avvio, la DLL la verifica localmente.


8.1 I tre tipi di chiavi #

Le chiavi sono cumulabili: chiami PBT_SetLicense tutte le volte che serve, la libreria conserva una chiave per tipo.

TipoTitolareSblocca
devNominativa, un solo sviluppatoreSolo nell'IDE PowerBuilder
runtimeLa Sua società, incorporata nell'applicazione consegnataSolo in un eseguibile compilato
demoFornita con l'applicazione dimostrativaL'applicazione dimostrativa, nell'IDE, fino alla scadenza

Un progetto ha quindi bisogno di entrambe: una postazione dev per ogni sviluppatore e una chiave runtime per l'applicazione consegnata ai Suoi clienti.

Il rilevamento « IDE o eseguibile » è effettuato dalla DLL stessa (nome del processo, moduli design-time caricati), non da codice PowerBuilder — non può essere aggirato dai Suoi sorgenti.


8.2 Impostare la chiave #

Una sola cosa da fare, prima dell'apertura della prima finestra:

// Dichiarazione - oggetto applicazione, "Local External Functions"
Function long PBT_SetLicense (string as_client, string as_key) Library "pbtoolboxai.dll"
// Event open dell'oggetto applicazione
// Local variables
long ll_rc
string ls_dev_key

// La chiave RUNTIME va nel codice : DEVE finire nell'eseguibile.
ll_rc = PBT_SetLicense(gs_licensee, gs_runtime_key)

// La chiave DEV si legge dalla postazione : sblocca solo l'IDE, e nel codice
// finirebbe in ogni copia consegnata senza servire a nulla.
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 chiave si posa tramite la funzione della DLL, mai tramite un metodo di componente: vale per l'intero processo e va posata prima che esista qualsiasi componente. È per la stessa ragione che PBT_LicenseStatus non chiede alcun handle.

Il titolare viene passato in chiaro, come primo argomento: è il nome (o l'indirizzo e-mail) a cui la licenza è stata intestata e deve corrispondere a quello contenuto nella chiave firmata. Una chiave non può quindi circolare senza il nome di chi l'ha acquistata.

RitornoSignificato
0Chiave valida e conservata
-1Formato di chiave non valido
-2Firma non valida (chiave alterata o estranea)
-3Manutenzione scaduta per questa versione della libreria (vedere 8.5)
-4Chiave demo scaduta
-5Il titolare indicato non corrisponde a quello della chiave

💡 Quale chiave va dove. La chiave runtime appartiene al codice: deve finire nell'eseguibile che consegnate. La chiave dev no — sblocca solo l'IDE, quindi in un eseguibile è inutile pur continuando a circolare, con il nome della vostra società. Il suo posto è un file pbtoolboxai.ini accanto all'IDE, o un valore nel registro.

Impostare la chiave dopo la creazione di un componente funziona ugualmente: i componenti già aperti si sbloccano immediatamente. Ma la soluzione più semplice resta l'event open dell'applicazione.

💡 Conservi la chiave in una costante o in una risorsa della Sua applicazione. È firmata: non contiene alcun segreto sfruttabile e non può essere modificata senza invalidarne la firma.


8.3 Verificare lo stato della licenza #

// Dichiarazione
Function long PBT_LicenseStatus (ref string as_json, long al_len) Library "pbtoolboxai.dll"
// Local variables
string ls_status

// Lo stato della licenza, in JSON
ls_status = Space(1024)
PBT_LicenseStatus(ls_status, 1024)
// -> {"licensed":true,"ide":false,"keys":{...},"reason":""}

Utile in fase di integrazione per verificare che una chiave sia effettivamente presa in considerazione, oppure per tracciare un avvio nel Suo registro applicativo.


8.4 La modalità demo #

Senza una chiave valida — o con una chiave che non si applica al contesto (una chiave dev in un exe, per esempio) — la libreria funziona in modalità demo: tutto è utilizzabile, tutto è visibile, ma con dei limiti — tranne i cinque componenti dell'edizione community, descritti qui sotto, che non sono mai limitati.

Cinque componenti restano gratuiti #

L'edizione community non richiede nulla: senza alcuna chiave, cinque componenti funzionano senza badge e senza limiti, a tempo indeterminato.

ComponenteChe cosa porta
statictextEtichetta con marcatura: grassetto, colori, collegamenti, elenchi, blocchi richiudibili
messageboxFinestra di dialogo modale a tema, con pulsanti liberi
toasterNotifiche nell'angolo dello schermo, con titolo, immagine e azioni
webbrowserBrowser WebView2 ospitato in una finestra PowerBuilder
jsonLeggere e scrivere JSON in PowerScript puro (percorsi, tipi, costruzione)

La scelta è voluta: i quattro componenti visivi sono quelli che si incontrano per primi, non portano alcun modello di dati proprio e bastano a dimostrare su una postazione bloccata che il runtime si distribuisce — il vero ostacolo prima di ogni acquisto. json si aggiunge perché è scritto in PowerScript puro, senza la DLL: è uno strumento di base, non un componente.

L'elenco vive nella DLL. PBT_LicenseStatus lo restituisce tale e quale, in "free": la vostra applicazione può quindi annunciare a che cosa ha diritto senza chiave, invece di scoprirlo componente per componente.

Una chiave valida prevale sempre: su questi cinque componenti come sugli altri, ripristina il vostro nome e la vostra edizione.

Il badge #

Ogni componente mostra un badge « PBToolboxAI — DEMO », non nascondibile.

I limiti funzionali #

ComponenteLimite in modalità demo
tabAl massimo 3 schede visibili disegnate (il componente conserva tutte le sue pagine: la chiave le mostra)
ribbon2 schede al massimo
toolbar6 item visualizzati, su tutte le barre; 6 voci per livello di menu a discesa; 6 scelte per elenco a discesa
tilesbox8 riquadri visualizzati
commandpalette5 comandi elencati
speechout4 frasi e 400 caratteri per lettura (coda compresa), poi viene detta la menzione demo; superate le prime 4 frasi, ogni lettura termina con essa
cryptotesti di al più 2048 caratteri, file e blob di al più 2048 byte, in ingresso come in uscita (anche una decifratura o una decodifica)
restclientcorpi delle risposte tagliati a 4096 caratteri, né download, né upload, né richiesta di intervallo (Range)
soundplayersolo i primi 10 secondi di un suono sono riprodotti (qualunque sia la velocità), e due note discendenti lo dicono
videoun film si ferma dopo 10 secondi; né salto né cattura d'immagine oltre
xmldocumenti di al più 65 536 caratteri, modifiche comprese; un documento costruito più lungo non è né convalidato (of_is_valid falso) né indentato (of_pretty vuoto)
listbar6 voci visualizzate, su tutte le sezioni — una ricerca o un of_from_datastore mostra solo queste sei
statusbar4 pannelli visualizzati; 6 voci per lista a discesa di un pannello (i separatori non contano), un'ultima riga disattivata dice quante restano nascoste
contextmenu6 voci per elenco, a ogni livello di cascata (separatori e intestazioni non contano); le altre restano in memoria senza essere mostrate, e un'ultima riga disattivata lo dice
menubar3 menu sulla barra; 6 voci per elenco e 12 per menu, tutte le sue cascate comprese (i separatori non contano); un elenco troncato finisce con una riga disattivata che lo dice
radialmenuAl massimo 4 rami per corona (meno se ii_max_sectors è più piccolo), senza ramo « Altro », e un solo livello di sotto-ruote (un ramo più profondo è disattivato); una corona troncata finisce con un settore disattivato « +N », e « PBToolboxAI — DEMO » è scritto sotto il mozzo
shellexplorer8 nodi per livello dell'albero
stepbar4 passaggi visualizzati
buttonbar4 pulsanti visualizzati; i successivi non sono né disegnati né attivabili da tastiera (la loro lettera Alt resta alla finestra)
crosstab500 righe di origine usate, esportazione e copia disattivate; of_get_cell_value e of_get_cell_rows funzionano su queste 500 righe e danno le stesse cifre dello schermo
breadcrumb4 segmenti visualizzati, gli ultimi del percorso; 6 rami per menu dei rami (una nota demo dice il resto) e 6 suggerimenti di digitazione
jsontreeLe prime 200 righe del documento visualizzate, al massimo 20.000 caratteri (una riga più lunga viene tagliata); ricerca e selezione restano al loro interno
xmltreeLe prime 200 righe del documento visualizzate, al massimo 20.000 caratteri (una riga più lunga viene tagliata); ricerca e selezione restano al loro interno
datagrid100 righe visualizzate, esportazioni CSV ed Excel disattivate, anche la copia (Ctrl+C)
markdownviewL'inizio del documento: 40 blocchi (un titolo, un paragrafo, una voce di elenco, una riga di tabella contano ciascuno uno; un blocco di codice è tagliato a 40 righe) o 4.000 caratteri del documento, il primo raggiunto — un blocco più lungo è tagliato —, seguiti da una nota; la ricerca e l'indice si attengono a essi
form6 campi, i primi mostrati nell'ordine dello schermo — un campo di una sezione compressa conta anch'esso: espanderla non ridisegna nulla; gli altri restano in memoria e in of_values senza essere mostrati né giudicati
propertygrid8 righe di proprietà, contate nell'ordine dello schermo (vista per categoria): un gruppo chiuso conta per una riga, le sue sotto-proprietà contano solo quando il gruppo è aperto, le intestazioni di categoria non contano; il resto rimane in memoria e in of_values senza essere mostrato, e né un riepilogo né la ricerca ne leggono il valore
kanbanle prime 4 colonne visibili, 5 schede per colonna contate nell'ordine della colonna tra le schede visibili, ognuna seguita da una nota; il conteggio e la somma di un'intestazione dicono solo le schede disegnate; le altre restano in memoria e si spostano senza essere mostrate
gantt12 attività disegnate, le prime righe della griglia nel suo ordine (il contenuto di un riepilogo compresso non conta), seguite da una nota; le altre restano in memoria, nel percorso critico e nelle date e nell'avanzamento del riepilogo che le contiene, senza essere mostrate né selezionabili
schedulerI primi 12 appuntamenti dell'intervallo a schermo, gli altri restano in memoria senza essere visualizzati
angulargaugeI primi 3 intervalli visibili disegnati (un intervallo nascosto non conta); gli altri restano in memoria senza essere visualizzati, e la chiave impostata li mostra senza rinviare nulla
chartcartesianLe prime 3 serie disegnate, legenda compresa; le altre restano in memoria senza essere visualizzate, e la chiave impostata le mostra senza rinviare nulla
chartpieLe prime 5 fette disegnate, legenda compresa, e le percentuali calcolate su di esse; le altre restano in memoria senza essere visualizzate, e la chiave impostata le mostra senza rinviare nulla
gaugeI primi 3 intervalli visibili disegnati (un intervallo nascosto non conta); gli altri restano in memoria senza essere visualizzati, e la chiave impostata li mostra senza rinviare nulla
carouselI primi 6 elementi visibili disegnati, nell'ordine del carosello (un elemento nascosto non conta); gli altri restano in memoria senza essere visualizzati né selezionabili, e la chiave impostata li mostra senza rinviare nulla
treeviewI primi 8 nodi di ogni livello disegnati, sotto ogni padre, nell'ordine del modello, e 200 nodi in tutto l'albero, i primi aggiunti — prima dell'ordinamento, della ricerca e dell'occultamento (un nodo nascosto conta, una ricerca o un ordinamento non mostrano mai il nono, lotti e gruppi compresi; un totale non conta mai ciò che il limite nasconde); gli altri restano in memoria senza essere visualizzati né selezionabili, e la chiave impostata li mostra senza rinviare nulla; of_export_csv e of_export_xlsx sono rifiutati
dockcontainer3 pannelli: il quarto of_add_panel restituisce -6, il suo controllo resta al suo posto, visibile
codeeditorLe prime 200 righe visualizzate e modificabili, seguite da una nota; le altre restano in memoria e in is_text senza essere visualizzate: la ricerca, gli indicatori e il_doc_line si attengono alle righe visualizzate, e un testo incollato che le supera raggiunge le righe in memoria
Tutti gli altriSolo il badge — nessun limite funzionale

Questi limiti si applicano al rendering: nulla fallisce, la visualizzazione è troncata. Può quindi valutare davvero ogni componente, sui Suoi dati, prima di acquistare.

Impostare una chiave valida rimuove istantaneamente tutti questi limiti e toglie il badge, senza riavviare l'applicazione.


8.5 Perpetua + manutenzione #

La licenza è perpetua: le versioni coperte dal Suo periodo di manutenzione funzionano per sempre, anche dopo la scadenza dello stesso.

In concreto, la chiave porta una data di fine manutenzione, confrontata con la data di compilazione della DLL:


8.6 Domande frequenti #

La mia chiave viene verificata online? No. Nessuna rete, mai. La verifica è una firma RSA convalidata localmente da Windows.

I miei clienti hanno bisogno di una chiave? No. La Sua chiave runtime è nella Sua applicazione; loro non vedono mai nulla della licenza.

Che cosa succede se dimentico PBT_SetLicense in produzione? L'applicazione funziona, ma ogni componente mostra il badge demo e si applicano i limiti della tabella qui sopra. È il primo punto da verificare se un badge appare presso un cliente.

Posso impostare una chiave dev e una chiave runtime nello stesso codice? Sì — è anzi il caso più comune: la dev serve quando esegue dall'IDE, la runtime quando esegue l'exe. Ciascuna viene ignorata nell'altro contesto.

Il badge appare anche se la chiave è impostata. Tre cause, in ordine di frequenza: (1) chiave dev mentre esegue un exe compilato, o il contrario; (2) valore restituito da PBT_SetLicense non verificato — controlli che sia 0; (3) manutenzione scaduta per la versione di DLL installata (ritorno -3). PBT_LicenseStatus risolve il dubbio in una riga.

Una chiave è nominativa. Una chiave dev è legata a uno sviluppatore, una chiave runtime alla Sua società. Non le condivida fuori dal Suo team.


← FAQ e risoluzione dei problemi · Sommario