मुख्य सामग्री पर जाएँ
LICENTIVO / INTEGRATION

C सॉफ़्टवेयर लाइसेंसिंग SDK: CMake ट्यूटोरियल

C11 ऐप में लाइसेंस सक्रियण और फ़ीचर जाँच जोड़ें। CMake उदाहरण के साथ डिवाइस क्रेडेंशियल बहाल करना और अस्वीकृत पहुँच सँभालना सीखें।

C11अपडेट

1. उत्पाद और लाइसेंस तैयार करें

नेटिव C11 ऐप में ग्राहक का लाइसेंस सक्रिय करने और काम के कॉलबैक को बुलाने से पहले फ़ीचर की अनुमति जाँचने के लिए C SDK उपयोग करें। शुरुआत डिवाइस से बँधे लाइसेंस और बिना उपयोग-गणना वाले एक्सपोर्ट से करें; मूल प्रक्रिया चलने लगे, तब उपयोग काउंटर जोड़ें।

डिवाइस कोटा वर्तमान सक्रियणों से गिना जाता है और रिलीज़ पर लौटता है। सामान्य लाइसेंस ऑफ़लाइन भी गिने जाते हैं; फ्लोटिंग लाइसेंस की लीज़ समाप्त होने पर भी कोटा अपने आप लौटता है।

  1. कंसोल > उत्पाद से उत्पाद ID कॉपी करें। उसी उत्पाद की हस्ताक्षर सार्वजनिक कुंजियाँ खोलें और हर कुंजी ID/सार्वजनिक कुंजी जोड़ी को आरंभिक कोड में डालें; YOUR_PRODUCT_ID, YOUR_KEY_ID और YOUR_PUBLIC_KEY बदलें। त्वरित एकीकरण यह कोड भी बना सकता है। उत्पाद कॉन्फ़िगरेशन फ़ाइल नहीं चाहिए; SDK डिफ़ॉल्ट रूप से https://www.licentivo.com से जुड़ता है।
  2. त्वरित एकीकरण में उत्पाद बनाएँ या चुनें। नीति में export फ़ीचर सक्षम करें और परीक्षण लाइसेंस तैयार करें।

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 को उसी डायरेक्टरी में सहेजें।

अपने कंपाइलर और आर्किटेक्चर से मेल खाने वाला साझा libcurl डेवलपमेंट पैकेज इंस्टॉल करें। Windows MSVC x64 पर CURL_DIR की जगह CURLConfig.cmake वाली डायरेक्टरी दें, स्थानीय परीक्षण के लिए curl की bin डायरेक्टरी को PATH में जोड़ें और ऐप के साथ आवश्यक DLL वितरित करें; Linux पर अपने वितरण का साझा libcurl डेवलपमेंट पैकेज इंस्टॉल करें।

Windows · PowerShell
& ([scriptblock]::Create((Invoke-WebRequest 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.ps1').Content)) -Language c -Toolchain msvc
Linux · Bash
curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' 'https://www.licentivo.com/assets/sdk/releases/v0.11.6/install.sh' | bash -s -- c
CMake · CMakeLists.txt
cmake_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)
Windows x64 · PowerShell · MSVC
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.' }
Linux x64 · Bash
set -e
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="SDK_PREFIX"
cmake --build build --target licensed_app

3. वास्तविक निर्यात सुरक्षित करें

अपने ऐप के शुरू होने या सक्रियण पर SDK आरंभ करें। सक्रियण फ़ॉर्म से ग्राहक की कुंजी पढ़ें और उत्पाद ID तथा विश्वसनीय कुंजियाँ दें। ऐप बंद होने तक क्लाइंट रखें। वास्तविक कार्य के प्रवेश पर ln_run_feature लगाकर निर्यात उदाहरण की जगह अपना फ़ंक्शन दें।

C11 · app.c
#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. ऐप बंद होने तक क्लाइंट जीवित रखें

यह कमांड-लाइन उदाहरण एक काम करके बंद होता है। डेस्कटॉप ऐप में स्टार्टअप पर एक क्लाइंट खोलें, निर्यात क्रिया से फ़ीचर कॉलबैक बुलाएँ और ऐप के निकास पर ही क्लाइंट बंद करें।

सक्रियण के बाद उसी उपयोगकर्ता और कैश स्थान से LICENTIVO_LICENSE_KEY खाली देकर निजी क्रेडेंशियल बहाल कर सकते हैं। क्रेडेंशियल उपयोगकर्ता की ऐप-डेटा डायरेक्टरी में रखें। बंद करना हार्टबीट रोकता है और फ़्लोटिंग सीट लौटाता है। सामान्य निकास पर डिवाइस-बद्ध पंजीकरण निष्क्रिय न करें।

ऑफ़लाइन उपयोग तभी उपलब्ध है जब नीति अनुमति देती हो और हस्ताक्षरित अनुमति मान्य हो। समाप्त अनुमति या अस्वीकृत फ़ीचर बंद रहना चाहिए। गणना ऑपरेशन के लिए नेटवर्क आवश्यक है।

ln_client हैंडल ऐप बंद होने तक रखें। ln_start स्टार्टअप अनुमति लेता है; सुरक्षित काम केवल ln_run_feature या उसकी गणना वाली विधि से चलाएँ। व्यावसायिक सफलता पर कॉलबैक 1 और विफलता पर 0 लौटाता है। दिए गए स्थिति स्ट्रिंग ln_free_string से मुक्त करें और निकास पर ln_destroy बुलाएँ।

5. चलाएँ और परिणाम जाँचें

  1. मान्य export अधिकार वाले लाइसेंस से licensed-report.txt बनने की पुष्टि करें।
  2. LICENTIVO_LICENSE_KEY खाली करके उसी उपयोगकर्ता से फिर चलाएँ; सहेजा क्रेडेंशियल बहाल होना चाहिए।
  3. LICENTIVO_FEATURE में अनुपस्थित फ़ीचर और LICENTIVO_OUTPUT में नया फ़ाइल नाम दें। प्रोग्राम अस्वीकृति बताए और वह फ़ाइल न बनाए।
  4. ऑफ़लाइन पुनः शुरुआत केवल नीति की अनुमति और अभी मान्य हस्ताक्षरित अनुमति से जाँचें। पृष्ठभूमि अपडेट त्रुटि के बाद असफल फ़ीचर जाँच को दरकिनार न करें।
Windows · PowerShell
$env:LICENTIVO_LICENSE_KEY = 'YOUR_TEST_LICENSE_KEY'
./build/Release/licensed_app.exe
Remove-Item Env:LICENTIVO_LICENSE_KEY
./build/Release/licensed_app.exe
Linux x64 · Bash
LICENTIVO_LICENSE_KEY=YOUR_TEST_LICENSE_KEY ./build/licensed_app
unset LICENTIVO_LICENSE_KEY
./build/licensed_app

सामान्य एकीकरण समस्याएँ

उत्पाद ID, हर कुंजी ID/सार्वजनिक कुंजी जोड़ी और ग्राहक लाइसेंस जाँचें। सार्वजनिक कुंजियाँ उत्पाद की हैं; लाइसेंस और डिवाइस प्रमाण अलग हैं। परीक्षण कुंजियाँ या प्रबंधन API Key वितरित न करें।

फ़ीचर अस्वीकृत, डिवाइस सीमा पूरी या लाइसेंस समाप्त हो तो कंसोल में लाइसेंस और नीति जाँचें। ग्राहक को SDK त्रुटि दिखाएँ। असफल अनुमति पर निर्यात फ़ंक्शन न चलाएँ।

RunFeature फ़ीचर अधिकार जाँचता है; गणना वाला विकल्प निर्धारित उपयोग आरक्षित करके हिसाब पूरा करता है। हर वास्तविक काम की स्थिर ऑपरेशन ID रखें और बाधित काम बहाल करने से पहले स्थायी परिणाम जाँचें।

CMake को Licentivo न मिले तो configure कमांड में SDK_PREFIX की जगह इंस्टॉलर का दिखाया CMake प्रीफ़िक्स दें। कंपाइलर, आर्किटेक्चर और libcurl स्थापित नेटिव पैकेज से मेल खाने चाहिए।