PBToolboxAI v5 ← Site

8. Lizenz und Demomodus #

← FAQ und Fehlerbehebung · Inhalt


PBToolboxAI ist eine kommerzielle Bibliothek. Die Lizenzprüfung erfolgt vollständig offline: keine Verbindung, keine Aktivierung, kein Serveraufruf. Ein signierter Schlüssel wird beim Start gesetzt, die DLL prüft ihn lokal.


8.1 Die drei Schlüsseltypen #

Die Schlüssel sind kumulierbar: Rufen Sie PBT_SetLicense so oft wie nötig auf, die Bibliothek behält einen Schlüssel je Typ.

TypInhaberSchaltet frei
devNamentlich, ein EntwicklerNur in der PowerBuilder-IDE
runtimeIhr Unternehmen, eingebettet in die ausgelieferte AnwendungNur in einer kompilierten ausführbaren Datei
demoMit der Demoanwendung geliefertDie Demoanwendung, in der IDE, bis zum Ablauf

Ein Projekt benötigt also beide: einen dev-Platz je Entwickler und einen runtime-Schlüssel für die Anwendung, die Sie an Ihre Kunden ausliefern.

Die Erkennung „IDE oder ausführbare Datei“ wird von der DLL selbst vorgenommen (Prozessname, geladene Design-Time-Module), nicht von PowerBuilder-Code — sie lässt sich aus Ihren Quellen nicht umgehen.


8.2 Den Schlüssel setzen #

Nur eines ist zu tun, vor dem Öffnen des ersten Fensters:

// Deklaration - Anwendungsobjekt, "Local External Functions"
Function long PBT_SetLicense (string as_client, string as_key) Library "pbtoolboxai.dll"
// Event open des Anwendungsobjekts
// Local variables
long ll_rc
string ls_dev_key

// Der RUNTIME-Schluessel gehoert in den Code : er MUSS in die EXE.
ll_rc = PBT_SetLicense(gs_licensee, gs_runtime_key)

// Der DEV-Schluessel wird vom Rechner gelesen : er schaltet nur die IDE frei,
// im Code wuerde er in jede Kopie wandern, ohne dort etwas zu nuetzen.
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)

Der Schlüssel wird über die DLL-Funktion gesetzt, nie über eine Komponentenmethode: Er gilt für den gesamten Prozess und muss gesetzt werden, bevor irgendeine Komponente existiert. Aus demselben Grund verlangt PBT_LicenseStatus kein Handle.

Der Inhaber wird im Klartext als erstes Argument übergeben: der Name (oder die E-Mail-Adresse), auf den die Lizenz ausgestellt wurde, und er muss mit dem im signierten Schlüssel übereinstimmen. Ein Schlüssel kann also nicht weitergegeben werden, ohne den Namen des Käufers mitzugeben.

RückgabeBedeutung
0Schlüssel gültig und übernommen
-1Ungültiges Schlüsselformat
-2Ungültige Signatur (Schlüssel verändert oder fremd)
-3Wartung abgelaufen für diese Version der Bibliothek (siehe 8.5)
-4demo-Schlüssel abgelaufen
-5Der übergebene Inhaber stimmt nicht mit dem des Schlüssels überein

💡 Welcher Schlüssel gehört wohin. Der runtime-Schlüssel gehört in den Code: er muss in der ausgelieferten ausführbaren Datei landen. Der dev-Schlüssel nicht — er schaltet nur die IDE frei, in einer EXE ist er also nutzlos und reist trotzdem mit, samt Ihrem Firmennamen. Sein Platz ist eine Datei pbtoolboxai.ini neben der IDE oder ein Registry-Wert.

Den Schlüssel nach der Erstellung einer Komponente zu setzen, funktioniert ebenfalls: Bereits geöffnete Komponenten werden sofort freigeschaltet. Am einfachsten bleibt jedoch das Event open der Anwendung.

💡 Bewahren Sie den Schlüssel in einer Konstanten oder einer Ressource Ihrer Anwendung auf. Er ist signiert: Er enthält kein verwertbares Geheimnis und kann nicht verändert werden, ohne seine Signatur ungültig zu machen.


8.3 Den Lizenzzustand prüfen #

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

// Der Lizenzstatus, als JSON
ls_status = Space(1024)
PBT_LicenseStatus(ls_status, 1024)
// -> {"licensed":true,"ide":false,"keys":{...},"reason":""}

Nützlich in der Integrationsphase, um zu prüfen, ob ein Schlüssel berücksichtigt wird, oder um einen Start in Ihrem Anwendungsprotokoll festzuhalten.


8.4 Der Demomodus #

Ohne gültigen Schlüssel — oder mit einem Schlüssel, der nicht zum Kontext passt (etwa ein dev-Schlüssel in einer Exe) — läuft die Bibliothek im Demomodus: Alles ist nutzbar, alles ist sichtbar, aber mit Grenzen — außer den fünf Komponenten der Community-Edition, die gleich darunter beschrieben sind und nie eingeschränkt werden.

Fünf Komponenten bleiben kostenlos #

Die Community-Edition muss nicht eingerichtet werden: ganz ohne Schlüssel laufen fünf Komponenten ohne Abzeichen und ohne Grenze, zeitlich unbegrenzt.

KomponenteWas sie bringt
statictextBeschriftung mit Auszeichnung: fett, Farben, Links, Aufzählungen, klappbare Blöcke
messageboxThematisierter modaler Dialog mit frei wählbaren Schaltflächen
toasterBenachrichtigungen in der Bildschirmecke, mit Titel, Bild und Aktionen
webbrowserWebView2-Browser, eingebettet in ein PowerBuilder-Fenster
jsonJSON in reinem PowerScript lesen und schreiben (Pfade, Typen, Aufbau)

Die Wahl ist bewusst: Die vier visuellen Komponenten sind die, denen man zuerst begegnet, sie tragen kein eigenes Datenmodell, und sie genügen, um auf einem gesperrten Rechner zu beweisen, dass die Laufzeitumgebung sich verteilen lässt — das eigentliche Hindernis vor jedem Kauf. json kommt hinzu, weil es in reinem PowerScript geschrieben ist, ohne die DLL: ein Grundwerkzeug, keine Komponente.

Die Liste lebt in der DLL. PBT_LicenseStatus gibt sie unverändert unter "free" zurück: Ihre Anwendung kann also ansagen, worauf sie ohne Schlüssel Anspruch hat, statt es Komponente für Komponente zu entdecken.

Ein gültiger Schlüssel hat immer Vorrang: bei diesen fünf Komponenten wie bei allen anderen stellt er Ihren Namen und Ihre Edition wieder her.

Das Abzeichen #

Jede Komponente zeigt ein Abzeichen „PBToolboxAI — DEMO“, das nicht ausgeblendet werden kann.

Die funktionalen Grenzen #

KomponenteGrenze im Demomodus
tabHöchstens 3 sichtbare Registerkarten gezeichnet (die Komponente behält alle Ihre Seiten: der Schlüssel zeigt sie)
ribbonHöchstens 2 Registerkarten
toolbar6 angezeigte Items über alle Leisten hinweg; 6 Einträge pro Dropdown-Menüebene; 6 Auswahlen pro Dropdown-Liste
tilesbox8 angezeigte Kacheln
commandpalette5 angezeigte Befehle
speechout4 Sätze und 400 Zeichen pro Lesung (Warteschlange inbegriffen), dann wird der Demo-Hinweis gesprochen; nach den ersten 4 Sätzen endet jede Lesung damit
cryptoTexte mit höchstens 2048 Zeichen, Dateien und Blobs mit höchstens 2048 Bytes, bei der Eingabe wie bei der Ausgabe (auch eine Entschlüsselung oder Decodierung)
restclientAntwortkörper bei 4096 Zeichen abgeschnitten, weder Download noch Upload noch Bereichsanfrage (Range)
soundplayernur die ersten 10 Sekunden eines Tons werden gespielt (unabhängig von der Geschwindigkeit), und zwei fallende Töne sagen es
videoein Film stoppt nach 10 Sekunden; weder Sprung noch Bildaufnahme darüber hinaus
xmlDokumente mit höchstens 65 536 Zeichen, Änderungen inbegriffen; ein längeres gebautes Dokument wird weder geprüft (of_is_valid falsch) noch eingerückt (of_pretty leer)
listbar6 angezeigte Einträge über alle Abschnitte hinweg — eine Suche oder ein of_from_datastore zeigt nur diese sechs
statusbar4 angezeigte Bereiche; 6 Einträge je Dropdown-Liste eines Bereichs (Trennlinien zählen nicht), eine letzte ausgegraute Zeile sagt, wie viele verborgen bleiben
contextmenu6 Einträge je Liste, auf jeder Kaskadenebene (Trennlinien und Überschriften zählen nicht); die übrigen bleiben im Speicher, ohne angezeigt zu werden, und eine letzte ausgegraute Zeile sagt es
menubar3 Menüs in der Leiste; 6 Einträge je Liste und 12 je Menü, alle seine Kaskaden eingeschlossen (Trennlinien zählen nicht); eine gekürzte Liste endet mit einer ausgegrauten Zeile, die es sagt
radialmenuHöchstens 4 Zweige je Kranz (weniger, wenn ii_max_sectors kleiner ist), ohne Zweig „Mehr“, und eine einzige Ebene von Unterrädern (ein tieferer Zweig ist ausgegraut); ein gekürzter Kranz endet mit einem ausgegrauten Sektor „+N“, und „PBToolboxAI — DEMO“ steht unter der Nabe
shellexplorer8 Knoten je Baumebene
stepbar4 angezeigte Schritte
buttonbar4 angezeigte Schaltflächen; die folgenden werden weder gezeichnet noch über die Tastatur ausgelöst (ihr Alt+Buchstabe bleibt beim Fenster)
crosstab500 genutzte Quellzeilen, Export und Kopieren deaktiviert; of_get_cell_value und of_get_cell_rows arbeiten auf diesen 500 Zeilen und liefern dieselben Zahlen wie auf dem Bildschirm
breadcrumb4 angezeigte Segmente, die letzten des Pfads; 6 Zweige pro Zweigmenü (ein Demo-Hinweis nennt den Rest) und 6 Eingabevorschläge
jsontreeDie ersten 200 Zeilen des Dokuments werden angezeigt, höchstens 20.000 Zeichen (eine längere Zeile wird abgeschnitten); Suche und Auswahl bleiben darin
xmltreeDie ersten 200 Zeilen des Dokuments werden angezeigt, höchstens 20.000 Zeichen (eine längere Zeile wird abgeschnitten); Suche und Auswahl bleiben darin
datagrid100 angezeigte Zeilen, CSV- und Excel-Export deaktiviert, Kopieren (Strg+C) ebenso
markdownviewDer Anfang des Dokuments: 40 Blöcke (eine Überschrift, ein Absatz, ein Listeneintrag, eine Tabellenzeile zählen je als einer; ein Codeblock wird nach 40 Zeilen abgeschnitten) oder 4.000 Zeichen des Dokuments, je nachdem, was zuerst erreicht wird — ein längerer Block wird abgeschnitten —, gefolgt von einem Hinweis; die Suche und das Inhaltsverzeichnis halten sich an sie
form6 Felder, die ersten in Bildschirmreihenfolge — ein Feld eines eingeklappten Abschnitts zählt mit: das Aufklappen zeichnet nichts neu; die übrigen bleiben im Speicher und in of_values, ohne angezeigt oder beurteilt zu werden
propertygrid8 Eigenschaftszeilen, gezählt in der Reihenfolge des Bildschirms (Ansicht nach Kategorie): eine geschlossene Gruppe zählt als eine Zeile, ihre Untereigenschaften zählen erst, wenn die Gruppe offen ist, Kategorie-Kopfzeilen zählen nicht; der Rest bleibt im Speicher und in of_values, ohne angezeigt zu werden, und weder eine Zusammenfassung noch die Suche liest seinen Wert
kanbandie ersten 4 sichtbaren Spalten, 5 Karten pro Spalte, gezählt in der Reihenfolge der Spalte unter den sichtbaren Karten, jeweils gefolgt von einem Hinweis; Anzahl und Summe einer Kopfzeile nennen nur die gezeichneten Karten; die übrigen bleiben im Speicher und werden verschoben, ohne angezeigt zu werden
gantt12 gezeichnete Aufgaben, die ersten Zeilen des Rasters in seiner Reihenfolge (der Inhalt eines eingeklappten Sammelvorgangs zählt nicht), gefolgt von einem Hinweis; die übrigen bleiben im Speicher, im kritischen Pfad und in den Daten und dem Fortschritt des Sammelvorgangs, der sie enthält, ohne angezeigt oder auswählbar zu sein
schedulerDie ersten 12 Termine des sichtbaren Bereichs, die übrigen bleiben im Speicher, ohne angezeigt zu werden
angulargaugeDie ersten 3 sichtbaren Bereiche werden gezeichnet (ein ausgeblendeter Bereich zählt nicht); die übrigen bleiben im Speicher, ohne angezeigt zu werden, und der gesetzte Schlüssel zeigt sie, ohne etwas erneut zu senden
chartcartesianDie ersten 3 Reihen werden gezeichnet, Legende inbegriffen; die übrigen bleiben im Speicher, ohne angezeigt zu werden, und der gesetzte Schlüssel zeigt sie, ohne etwas erneut zu senden
chartpieDie ersten 5 Segmente werden gezeichnet, Legende inbegriffen, und die Prozente auf sie berechnet; die übrigen bleiben im Speicher, ohne angezeigt zu werden, und der gesetzte Schlüssel zeigt sie, ohne etwas erneut zu senden
gaugeDie ersten 3 sichtbaren Bereiche werden gezeichnet (ein ausgeblendeter Bereich zählt nicht); die übrigen bleiben im Speicher, ohne angezeigt zu werden, und der gesetzte Schlüssel zeigt sie, ohne etwas erneut zu senden
carouselDie ersten 6 sichtbaren Elemente werden gezeichnet, in der Reihenfolge des Karussells (ein ausgeblendetes Element zählt nicht); die übrigen bleiben im Speicher, ohne angezeigt oder auswählbar zu sein, und der gesetzte Schlüssel zeigt sie, ohne etwas erneut zu senden
treeviewDie ersten 8 Knoten jeder Ebene werden gezeichnet, unter jedem Elternknoten, in der Reihenfolge des Modells, und 200 Knoten im ganzen Baum, die zuerst hinzugefügten — vor Sortierung, Suche und Ausblenden (ein ausgeblendeter Knoten zählt, eine Suche oder Sortierung zeigt nie den neunten, Lose und Gruppen eingeschlossen; ein Gesamtwert zählt nie, was die Grenze verbirgt); die übrigen bleiben im Speicher, ohne angezeigt oder auswählbar zu sein, und der gesetzte Schlüssel zeigt sie, ohne etwas erneut zu senden; of_export_csv und of_export_xlsx werden abgelehnt
dockcontainer3 Bereiche: das vierte of_add_panel liefert -6, sein Steuerelement bleibt sichtbar an seinem Platz
codeeditorDie ersten 200 Zeilen werden angezeigt und sind bearbeitbar, gefolgt von einem Hinweis; die übrigen bleiben im Speicher und in is_text, ohne angezeigt zu werden: Suche, Markierungen und il_doc_line halten sich an die angezeigten Zeilen, und eingefügter Text, der darüber hinausgeht, kommt zu den Zeilen im Speicher
Alle anderenNur das Abzeichen — keine funktionale Grenze

Diese Grenzen gelten für die Darstellung: Nichts schlägt fehl, die Anzeige wird abgeschnitten. Sie können daher jede Komponente wirklich bewerten, mit Ihren eigenen Daten, bevor Sie kaufen.

Das Setzen eines gültigen Schlüssels hebt alle diese Grenzen sofort auf und entfernt das Abzeichen, ohne die Anwendung neu zu starten.


8.5 Unbefristet + Wartung #

Die Lizenz ist unbefristet: Die von Ihrem Wartungszeitraum abgedeckten Versionen funktionieren für immer, auch nach dessen Ablauf.

Konkret trägt der Schlüssel ein Wartungsenddatum, das mit dem Erstellungsdatum der DLL verglichen wird:


8.6 Häufige Fragen #

Wird mein Schlüssel online geprüft? Nein. Kein Netzwerk, niemals. Die Prüfung ist eine RSA-Signatur, die lokal von Windows validiert wird.

Brauchen meine Kunden einen Schlüssel? Nein. Ihr runtime-Schlüssel steckt in Ihrer Anwendung; sie bekommen von der Lizenz nie etwas zu sehen.

Was passiert, wenn ich PBT_SetLicense in der Produktion vergesse? Die Anwendung funktioniert, aber jede Komponente zeigt das Demo-Abzeichen und die Grenzen aus der obigen Tabelle gelten. Das ist der erste Punkt, den Sie prüfen sollten, wenn bei einem Kunden ein Abzeichen erscheint.

Kann ich einen dev-Schlüssel und einen runtime-Schlüssel im selben Code setzen? Ja — das ist sogar der Regelfall: Der dev-Schlüssel greift, wenn Sie aus der IDE ausführen, der runtime-Schlüssel, wenn Sie die Exe ausführen. Jeder wird im jeweils anderen Kontext ignoriert.

Das Abzeichen erscheint, obwohl der Schlüssel gesetzt ist. Drei Ursachen, nach Häufigkeit geordnet: (1) ein dev-Schlüssel, während Sie eine kompilierte Exe ausführen, oder umgekehrt; (2) der Rückgabewert von PBT_SetLicense wurde nicht geprüft — vergewissern Sie sich, dass er 0 lautet; (3) Wartung abgelaufen für die installierte DLL-Version (Rückgabe -3). PBT_LicenseStatus klärt das in einer Zeile.

Ein Schlüssel ist personengebunden. Ein dev-Schlüssel ist an einen Entwickler gebunden, ein runtime-Schlüssel an Ihr Unternehmen. Geben Sie sie nicht außerhalb Ihres Teams weiter.


← FAQ und Fehlerbehebung · Inhalt