Distromate Docs

C 语言接入

使用 C 语言集成 DistroMate SDK

准备工作

  1. 获取 dm_api.dlldm_api.h 文件
  2. 将 DLL 文件放置在程序运行目录或系统 PATH 中
  3. 将头文件包含到项目中

头文件

#include "dm_api.h"

快速开始

#include <stdio.h>
#include <stdlib.h>
#include "dm_api.h"

int main() {
    // 1. 检查是否由 Launcher 启动
    int restart_result = DM_RestartAppIfNecessary();
    if (restart_result == 1) {
        // Launcher 已启动,退出当前进程
        return 0;
    } else if (restart_result < 0) {
        fprintf(stderr, "Failed to restart via launcher\n");
        return 1;
    }

    // 2. 连接到 Launcher
    const char* pipe_name = "\\\\.\\pipe\\distromate_pipe";
    if (DM_Connect(pipe_name, DM_DEFAULT_TIMEOUT_MS) != 0) {
        char* error = DM_GetLastError();
        fprintf(stderr, "Connection failed: %s\n", error ? error : "Unknown error");
        if (error) DM_FreeString(error);
        return 1;
    }

    // 3. 验证许可证
    const char* request = "{\"nonce_str\": \"random_string_32chars_here\"}";
    char* response = DM_Verify(request);
    
    if (response) {
        printf("Verification response: %s\n", response);
        DM_FreeString(response);
    } else {
        char* error = DM_GetLastError();
        fprintf(stderr, "Verification failed: %s\n", error ? error : "Unknown error");
        if (error) DM_FreeString(error);
    }

    // 4. 通知初始化完成
    if (DM_Initiated() != 0) {
        fprintf(stderr, "Failed to notify initiated\n");
    }

    // 5. 关闭连接
    DM_Close();

    return 0;
}

API 参考

DM_RestartAppIfNecessary

检查程序是否由 Launcher 启动,如果不是则通过 Launcher 重启。

int32_t DM_RestartAppIfNecessary(void);

返回值:

描述
0程序由 Launcher 启动,无需重启
1程序未由 Launcher 启动,已启动 Launcher,当前进程应退出
-1查找或启动 Launcher 失败
-2获取当前可执行文件路径失败

DM_Connect

连接到 Launcher。

int32_t DM_Connect(const char *pipe_name, uint32_t timeout_ms);

参数:

参数类型描述
pipe_nameconst char*Pipe 名称,格式: \\.\pipe\<name>
timeout_msuint32_t超时时间(毫秒),0 表示使用默认值 (5000ms)

返回值:

描述
0连接成功
-1连接失败
-3参数无效

DM_Close

关闭与 Launcher 的连接。

int32_t DM_Close(void);

返回值: 始终返回 0

DM_IsConnected

检查是否已连接到 Launcher。

int32_t DM_IsConnected(void);

返回值:

描述
1已连接
0未连接

DM_Verify

验证许可证。

char *DM_Verify(const char *json_data);

参数:

参数类型描述
json_dataconst char*JSON 格式请求数据,必须包含 nonce_str 字段

返回值:

  • 成功: 返回响应 JSON 字符串指针,必须使用 DM_FreeString 释放
  • 失败: 返回 NULL,可通过 DM_GetLastError 获取错误信息

DM_Activate

激活许可证。

char *DM_Activate(const char *json_data);

参数:DM_Verify

返回值:DM_Verify

DM_Initiated

通知 Launcher 程序初始化完成。

int32_t DM_Initiated(void);

返回值:

描述
0成功
-1通知失败
-2通信错误
-3未连接

DM_GetVersion

获取 DLL 版本号。

const char *DM_GetVersion(void);

返回值: 版本字符串(静态内存,无需释放)

DM_GetLastError

获取最后一次错误信息。

char *DM_GetLastError(void);

返回值:

  • 成功: 返回错误信息字符串指针,必须使用 DM_FreeString 释放
  • 失败: 返回 NULL

DM_FreeString

释放由 SDK 分配的字符串。

void DM_FreeString(char *ptr);

参数:

参数类型描述
ptrchar*由 SDK 函数返回的字符串指针

内存管理

使用 C API 时需注意内存管理:

  • DM_VerifyDM_ActivateDM_GetLastError 返回的字符串必须使用 DM_FreeString 释放
  • DM_GetVersion 返回的字符串是静态的,无需释放
  • 传入的字符串参数在函数返回后可以安全释放

编译链接

Windows (MSVC)

cl /c your_app.c
link your_app.obj dm_api.lib

Windows (MinGW)

gcc -o your_app.exe your_app.c -L. -ldm_api

注意事项

  1. C API 不包含签名验证功能,你需要自行实现 RSA 签名验证
  2. 建议使用更高级语言的 SDK(如 C++、C#)以获得内置的签名验证功能
  3. 确保正确处理所有返回的错误码

On this page