انتقل إلى المحتوى
LICENTIVO / INTEGRATION

SDK لترخيص برامج C: دليل CMake

أضف تفعيل التراخيص وفحص صلاحيات الميزات إلى تطبيق C11. اتبع مثال CMake لاستعادة بيانات اعتماد الجهاز والتعامل مع رفض الوصول.

C11تم التحديث

1. قم بإعداد المنتج والترخيص

في تطبيق أصلي مكتوب بلغة C11، استخدم SDK الخاص بلغة C لتفعيل ترخيص العميل والتحقق من صلاحية الميزة قبل استدعاء دالة رد النداء التي تنفّذ العملية. ابدأ بترخيص مرتبط بالجهاز وتصدير دون احتساب للاستخدام، ثم أضف عدادات الاستخدام بعد نجاح المسار الأساسي.

تُحسب حصة الأجهزة من التفعيلات الحالية وتعود عند التحرير. تبقى التراخيص العادية محسوبة دون اتصال، وتعيد التراخيص العائمة الحصة تلقائيًا أيضًا عند انتهاء الإيجار.

  1. انسخ معرّف المنتج من لوحة التحكم > المنتجات. افتح مفاتيح التوقيع العامة للمنتج نفسه والصق جميع أزواج معرّف المفتاح والمفتاح العام في كود التهيئة بدلاً من YOUR_PRODUCT_ID وYOUR_KEY_ID وYOUR_PUBLIC_KEY. يمكن للتكامل السريع توليد هذا الكود. لا يلزم ملف إعداد للمنتج؛ يتصل SDK افتراضياً بـ https://www.licentivo.com.
  2. في التكامل السريع، قم بإنشاء منتج أو تحديده. قم بتمكين ميزة تسمى التصدير في سياستها وإعداد ترخيص اختباري.

2. قم بتثبيت SDK

ثبّت CMake 3.18 أو إصدارًا أحدث أولًا. على Windows x64، استخدم Visual Studio 2022 C++ Build Tools وحزمة SDK المطابقة لـ MSVC، مع -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، وأضف مجلد bin الخاص بـ curl إلى 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 عند بدء برنامجك أو تنشيطه. اقرأ مفتاح العميل من نافذة التنشيط ومرّر معرّف المنتج والمفاتيح الموثوقة. احتفظ بالعميل حتى إغلاق التطبيق. ضع 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. تأكد من أن الترخيص الصالح الذي يتمتع بحق الوصول للتصدير ينشئ 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

مشاكل التكامل المشتركة

تحقق من معرّف المنتج وجميع أزواج معرّف المفتاح والمفتاح العام وترخيص العميل. المفاتيح العامة تخص المنتج؛ التراخيص وبيانات اعتماد الأجهزة منفصلة. لا توزّع مفاتيح الاختبار أو مفاتيح API الإدارية.

تم رفض الميزة، أو تم الوصول إلى حد الجهاز أو انتهت صلاحية الترخيص: افحص الترخيص والسياسة في وحدة التحكم، ثم أظهر الخطأ SDK للعميل. يجب ألا يستدعي التفويض الفاشل وظيفة التصدير.

يتحقق RunFeature من الوصول إلى الميزات؛ يقوم المتغير المقيس باحتجاز الاستخدام الذي تم تكوينه وتسويته. استخدم معرف عملية ثابتًا لكل مهمة عمل حقيقية وافحص نتائجها الدائمة قبل استعادة مهمة متقطعة.

لا يمكن لـ CMake العثور على Licentivo: استبدل SDK_PREFIX في أمر التكوين ببادئة CMake المطبوعة بواسطة المثبت. يجب أن يتطابق المترجم والهندسة المعمارية وlibcurl مع الحزمة الأصلية المثبتة.