1. 製品とライセンスを準備する
ネイティブ C11 アプリでは、C SDK で顧客のライセンスを認証し、業務コールバックの実行前に機能の利用権を確認します。まず端末固定ライセンスと回数を消費しないエクスポート機能を実装し、基本動作の確認後に利用回数制限を追加します。
デバイス枠は現在のアクティベーション数で計算し、解除すると返却されます。通常ライセンスはオフラインでも枠を使用し、フローティングライセンスはリース満了時にも自動返却されます。
- [コンソール] > [製品] から製品 ID をコピーします。その製品の署名公開鍵を開き、すべてのキー ID/公開鍵のペアを初期化コードに貼り付けて、YOUR_PRODUCT_ID、YOUR_KEY_ID、および YOUR_PUBLIC_KEY を置き換えます。迅速な統合により、これらのパブリック コード定数を生成できます。製品構成ファイルは必要ありません。 SDK のデフォルトは https://www.licentivo.com. です
- クイック統合で、製品を作成または選択します。ポリシーでエクスポートという名前の機能を有効にし、テスト ライセンスを準備します。
2.SDKをインストールする
CMake 3.18 以降をインストールします。Windows x64 では Visual Studio 2022 C++ Build Tools と対応する MSVC SDK パッケージを使い、-G "Visual Studio 17 2022" -A x64 を指定します。Linux x64 では C11・C++17 コンパイラーを使います。SDK_PREFIX はインストーラーが表示した CMake プレフィックスに置き換えてください。サンプルを app.c として保存し、下の CMakeLists.txt を同じディレクトリへ配置します。
コンパイラーと CPU アーキテクチャに合う、共有ライブラリ版 libcurl の開発パッケージをインストールします。Windows MSVC x64 では、CURL_DIR を CURLConfig.cmake があるディレクトリに置き換え、ローカル実行時は curl の bin ディレクトリを PATH に追加します。アプリ配布時には必要な DLL を同梱してください。Linux では、ディストリビューションの共有ライブラリ版 libcurl 開発パッケージを使います。
& ([scriptblock]::Create((Invoke-WebRequest 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.ps1').Content)) -Language c -Toolchain msvccurl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.sh' | bash -s -- ccmake_minimum_required(VERSION 3.18)
project(licensed_app LANGUAGES C)
find_package(Licentivo 0.11.6 REQUIRED)
add_executable(licensed_app app.c)
target_link_libraries(licensed_app PRIVATE Licentivo::C)
set_target_properties(licensed_app PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON)cmake -S . -B build -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH="SDK_PREFIX" -DCURL_DIR="CURL_DIR"
if ($LASTEXITCODE -ne 0) { throw 'CMake configure failed. Check the SDK prefix and matching libcurl development package.' }
cmake --build build --config Release --target licensed_app
if ($LASTEXITCODE -ne 0) { throw 'Build failed.' }set -e
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="SDK_PREFIX"
cmake --build build --target licensed_app3. 実際の輸出を保護する
SDK の初期化を、アプリの起動処理または認証処理へ組み込みます。認証画面で顧客のキーを受け取り、製品 ID と信頼する公開鍵を渡し、終了まで同じクライアントを維持してください。実際の業務処理を実行する箇所で ln_run_feature を呼び出し、サンプルのレポート出力処理を自分の業務関数に置き換えます。
#include "licentivo.h"
#include <stdio.h>
#include <stdlib.h>
/* BEGIN LICENTIVO PRODUCT */
/* Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys. */
static const char *PRODUCT_ID = "YOUR_PRODUCT_ID";
static const char *TRUSTED_KEYS_JSON = "{\"YOUR_KEY_ID\":\"YOUR_PUBLIC_KEY\"}";
/* END LICENTIVO PRODUCT */
static const char *setting(const char *name, const char *fallback) {
const char *value = getenv(name);
return value && value[0] ? value : fallback;
}
static int export_report(void *context) {
const char *path = (const char *)context;
/* Replace this write with your existing, non-metered export operation. */
FILE *file = fopen(path, "w");
if (!file) { perror("Export write failed"); return 0; }
int wrote = fputs("A report generated by the licensed application.\n", file) >= 0;
int closed = fclose(file) == 0;
return wrote && closed;
}
int main(void) {
/* Keep the handle to report startup errors. A GUI supplies the activation input. */
ln_client *client = ln_init_product(PRODUCT_ID, TRUSTED_KEYS_JSON, setting("LICENTIVO_LICENSE_KEY", ""));
if (!client) {
fputs("Startup failed: check the product ID and public keys and supply a license key for first activation.\n", stderr);
return 2;
}
if (!ln_start(client)) {
fprintf(stderr, "Startup failed: %s\n", ln_last_error(client));
ln_destroy(client);
return 2;
}
const char *feature = setting("LICENTIVO_FEATURE", "export");
const char *path = setting("LICENTIVO_OUTPUT", "licensed-report.txt");
int ok = setting("LICENTIVO_METERED", "")[0] == '1'
? ln_run_metered_feature(client, feature, 1, setting("LICENTIVO_OPERATION_ID", ""), export_report, (void *)path)
: ln_run_feature(client, feature, export_report, (void *)path);
if (!ok) {
char *status = ln_feature_status(client, feature);
fprintf(stderr, "Export denied or failed: %s; %s\n", status ? status : "status unavailable", ln_last_error(client));
ln_free_string(status);
}
if (ok) printf("License OK: %s is available\nExport completed: %s\n", feature, path);
ln_destroy(client); /* Real app: destroy on shutdown; no Deactivate on normal exit. */
return ok ? 0 : 2;
}
4. シャットダウンするまでクライアントを存続させます。
このコマンドラインの例は、1 つの操作を実行して終了します。デスクトップ アプリケーションでは、起動時に 1 つのクライアントを開き、エクスポート アクションから機能コールバックを呼び出し、アプリケーションの終了時にのみクライアントを閉じます。
アクティブ化後、その後の起動では LICENTIVO_LICENSE_KEY を空のままにして、同じユーザーとキャッシュの場所にプライベート認証情報を復元できます。その認証情報をユーザーの application-data ディレクトリに保存します。閉じるとハートビートが停止し、同時接続枠が戻ります。通常の終了では、ノードロックされたデバイスが非アクティブ化されるべきではありません。
オフライン アクセスは、ポリシーで許可され、署名された許可が有効な場合にのみ利用できます。期限切れまたは拒否された機能はブロックされたままにする必要があります。従量制課金操作にはネットワーク接続が必要です。
シャットダウンするまで ln_client ハンドルを保持します。 ln_start は起動認証を実行します。 ln_run_feature または従量制のバリアントのみが、保護された作業を呼び出すことができます。コールバックは、ビジネスが成功した場合は 1 を返し、失敗した場合は 0 を返します。 ln_free_string を使用して割り当てられたステータス文字列を解放し、シャットダウン時に ln_destroy を呼び出します。
5. 実行して結果を確認する
- エクスポート アクセス権を持つ有効なライセンスによって licensed-report.txt が作成されることを確認します。
- LICENTIVO_LICENSE_KEY をクリアし、同じユーザー アカウントを使用して再度実行します。保存された認証情報が復元されます。
- LICENTIVO_FEATURE をライセンスに含まれていない機能に設定し、LICENTIVO_OUTPUT を新しいファイル名に設定します。プログラムは、そのファイルを作成せずに拒否を報告する必要があります。
- オフライン再起動は、許可され、期限切れになっていない署名付きの許可を使用してのみテストしてください。バックグラウンド更新エラーの後に失敗した機能チェックをバイパスしないでください。
$env:LICENTIVO_LICENSE_KEY = 'YOUR_TEST_LICENSE_KEY'
./build/Release/licensed_app.exe
Remove-Item Env:LICENTIVO_LICENSE_KEY
./build/Release/licensed_app.exeLICENTIVO_LICENSE_KEY=YOUR_TEST_LICENSE_KEY ./build/licensed_app
unset LICENTIVO_LICENSE_KEY
./build/licensed_appよくある統合の問題
製品 ID、すべてのキー ID/公開鍵のペア、および顧客のライセンス入力を確認します。公開検証キーは製品に属します。顧客のライセンスと保存されたデバイスの認証情報は別のものです。開発テスト キーやベンダー管理 API キーを配布しないでください。
機能が拒否されました、デバイス制限に達したか、ライセンスが期限切れになりました: コンソールでライセンスとポリシーを検査し、顧客に SDK エラーを表示します。認証が失敗した場合は、エクスポート関数を呼び出してはなりません。
RunFeature は機能へのアクセスをチェックします。従量制のバリアントは、設定された使用量を予約および決済します。実際のビジネス ジョブごとに安定した操作 ID を使用し、中断されたジョブを回復する前にその永続的な結果を検査します。
CMake は Licentivo を見つけることができません。configure コマンドの SDK_PREFIX を、インストーラーによって出力された CMake プレフィックスに置き換えます。コンパイラ、アーキテクチャ、および libcurl は、インストールされているネイティブ パッケージと一致する必要があります。