C 语言接入
使用 C 语言集成 DistroMate SDK
准备工作
- 获取
dm_api.dll和dm_api.h文件 - 将 DLL 文件放置在程序运行目录或系统 PATH 中
- 将头文件包含到项目中
头文件
#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_name | const char* | Pipe 名称,格式: \\.\pipe\<name> |
timeout_ms | uint32_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_data | const 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);参数:
| 参数 | 类型 | 描述 |
|---|---|---|
ptr | char* | 由 SDK 函数返回的字符串指针 |
内存管理
使用 C API 时需注意内存管理:
DM_Verify、DM_Activate、DM_GetLastError返回的字符串必须使用DM_FreeString释放DM_GetVersion返回的字符串是静态的,无需释放- 传入的字符串参数在函数返回后可以安全释放
编译链接
Windows (MSVC)
cl /c your_app.c
link your_app.obj dm_api.libWindows (MinGW)
gcc -o your_app.exe your_app.c -L. -ldm_api注意事项
- C API 不包含签名验证功能,你需要自行实现 RSA 签名验证
- 建议使用更高级语言的 SDK(如 C++、C#)以获得内置的签名验证功能
- 确保正确处理所有返回的错误码