鸿蒙笔记3:用Lazarus程序取得资源文件路径
目录1 简介2 Lazarus要读写的文件夹放在哪3 增加 napi_init.cpp4 修改原有的 libLazarusOHOS_Wrapper.cpp5 编译libLazarusOHOS_Wrapper.cpp6 鸿蒙项目增加文件 libLazarusOHOS_Wrapper.d.ts7 鸿蒙项目修改文件 QAbilityStage.ets8 lazarus 程序增加一个单元 OHOSPaths9 修改Lazarus程序主窗体代码10 运行结果本文基于秋风的10多篇lazarus鸿蒙开发博文及资源整理修改 秋·风 - 博客园1 简介鸿蒙应用安装后资源被自动解压到应用沙箱路径中通过 context.resourceDir 获取目录后可直接以文件路径访问只读。如果需要读写操作需要先将文件复制到 filesDir 沙箱目录中。Lazarus程序不能直接使用 context.resourceDir需要采取另外办法取得该路径进行读写操作。另外不同环境下这些目录不同不能写死在Lazarus程序中。秋风的博客内容及资源成功解决了鸿蒙与Lazarus的整合在特定细节需求方面需要自行修改完善。本文简要介绍鸿蒙打包lazarus程序如何获取资源的准确路径。2 Lazarus要读写的文件夹放在哪Lazarus需要读写的文件夹假设是cust_data 放在鸿蒙项目目录\entry\src\main\resources\resfile3 增加 napi_init.cpp在1.LazarusOHOS_Wrapper文件夹中增加 napi_init.cpp负责从 AbilityContext 中提取路径并提供给 Lazarus 侧使用。内容// 这个文件负责从 AbilityContext 中提取路径并提供给 Lazarus 侧使用 // napi_init.cpp #include napi/native_api.h #include cstring #include hilog/log.h // 缓存真实沙箱路径静态存储与 OHOS_GetFilesDir 等共享 static char g_realFilesDir[1024] {0}; static char g_realCacheDir[1024] {0}; static char g_realResourceDir[1024] {0}; static bool g_pathsReady false; // 辅助函数从 context 对象获取字符串属性并缓存 static bool GetAndCachePath(napi_env env, napi_value context, const char* propertyName, char* buffer, size_t bufSize) { napi_value prop; napi_status status napi_get_named_property(env, context, propertyName, prop); if (status ! napi_ok) { OH_LOG_ERROR(LOG_APP, [NAPI] Failed to get property: %{public}s, propertyName); return false; } // 可能返回的是 resourceManager 或 FilePath 对象需要区分处理 // 对于 filesDir/cacheDir/resourceDir在 context 下通常是直接字符串或 getter 函数 // HarmonyOS API 9 中 context.filesDir 直接返回 string size_t strLen 0; status napi_get_value_string_utf8(env, prop, buffer, bufSize, strLen); if (status ! napi_ok) { OH_LOG_ERROR(LOG_APP, [NAPI] Failed to get string for: %{public}s, propertyName); return false; } buffer[strLen] \0; OH_LOG_INFO(LOG_APP, [NAPI] %{public}s %{public}s, propertyName, buffer); return true; } // 外部可调用的初始化接口 extern C __attribute__((visibility(default))) napi_value OHOS_InitPaths(napi_env env, napi_callback_info info) { size_t argc 1; napi_value args[1]; napi_status status napi_get_cb_info(env, info, argc, args, nullptr, nullptr); if (status ! napi_ok || argc 1) { OH_LOG_ERROR(LOG_APP, [NAPI] OHOS_InitPaths: No context provided); napi_value ret; napi_get_boolean(env, false, ret); return ret; } napi_value context args[0]; // 依次获取路径 bool success true; success GetAndCachePath(env, context, filesDir, g_realFilesDir, sizeof(g_realFilesDir)); success GetAndCachePath(env, context, cacheDir, g_realCacheDir, sizeof(g_realCacheDir)); success GetAndCachePath(env, context, resourceDir, g_realResourceDir, sizeof(g_realResourceDir)); g_pathsReady success; napi_value result; napi_get_boolean(env, success, result); return result; } // Lazarus 侧调用的 C 接口替代原来依赖 Qt 的函数 extern C const char* OHOS_GetFilesDir() { if (g_pathsReady) return g_realFilesDir; else return ; // 未初始化时返回空串 } extern C const char* OHOS_GetCacheDir() { if (g_pathsReady) return g_realCacheDir; else return ; } extern C const char* OHOS_GetResourceDir() { if (g_pathsReady) return g_realResourceDir; else return ; } // NAPI 模块注册 static napi_value RegisterInitPaths(napi_env env, napi_value exports) { napi_property_descriptor desc[] { {OHOS_InitPaths, nullptr, OHOS_InitPaths, nullptr, nullptr, nullptr, napi_default, nullptr} }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } static napi_module demoModule { .nm_version 1, .nm_flags 0, .nm_filename nullptr, .nm_register_func RegisterInitPaths, .nm_modname lazarusohos, .nm_priv nullptr, .reserved {0}, }; extern C __attribute__((constructor)) void RegisterModule(void) { napi_module_register(demoModule); }4 修改原有的 libLazarusOHOS_Wrapper.cpp内容为// libLazarusOHOS_Wrapper.cpp - HarmonyOS Qt5 Lazarus LCL wrapper // QApplication is already created by Qt OHOS plugin (libqohos.so) // before this library is loaded. Do NOT create another one. // 现在 OHOS_GetFilesDir 等函数已经在 napi_init.cpp 中实现了 // 原来的 wrapper 就不需要再通过 Qt 获取路径了 // 可以保留 wrapper 的 main 函数用于加载 Lazarus 库 // 但删除路径获取代码。 // libLazarusOHOS_Wrapper.cpp #include cstdio #include dlfcn.h // 路径函数声明由 napi_init.cpp 提供这里不用定义 extern C const char* OHOS_GetFilesDir(); extern C const char* OHOS_GetCacheDir(); extern C const char* OHOS_GetBundleDir(); // 不再使用可留空实现返回 typedef void (*InitAndShowFormFunc)(); extern C int main(int, char**) { // 此时路径可能还未初始化打印为空 fprintf(stderr, [Wrapper] OHOS_GetFilesDir: %s\n, OHOS_GetFilesDir()); fprintf(stderr, [Wrapper] OHOS_GetCacheDir: %s\n, OHOS_GetCacheDir()); // QApplication already exists from libqohos.so void* lib dlopen(libOHOS_QT_Lazarus.so, RTLD_NOW | RTLD_GLOBAL); if (!lib) { fprintf(stderr, [Wrapper] dlopen failed: %s\n, dlerror()); return 1; } InitAndShowFormFunc InitAndShowForm (InitAndShowFormFunc)dlsym(lib, InitAndShowForm); if (!InitAndShowForm) { fprintf(stderr, [Wrapper] dlsym failed: %s\n, dlerror()); dlclose(lib); return 1; } InitAndShowForm(); return 0; }5 编译libLazarusOHOS_Wrapper.cpp执行以下指令生成 aarch64 格式的so文件。为了访问hap包安装后的资源文件目录和沙箱目录此处经过修改与原文有所不同。原文指令lazarus鸿蒙开发3编译libLazarusOHOS_Wrapper.so - 秋·风 - 博客园注意先删除原来存在的文件 libLazarusOHOS_Wrapper.soSET NATIVE_OHOS_SDKd:/fpc4ohos/sdk/default/openharmony/native SET SYSROOT%NATIVE_OHOS_SDK%/sysroot SET QT5DIRd:/oh/Qt-5.12.12-ohos-aarch64 %NATIVE_OHOS_SDK%\llvm\bin\clang -shared ^ -o libLazarusOHOS_Wrapper.so ^ -I%SYSROOT%\usr\include ^ -I%SYSROOT%\usr\include\napi ^ -I%QT5DIR%\include ^ -I%QT5DIR%\include\QtCore ^ -I%QT5DIR%\include\QtGui ^ -I%QT5DIR%\include\QtWidgets ^ -L%SYSROOT%\usr\lib\aarch64-linux-ohos ^ -L%QT5DIR%\lib ^ -lace_napi.z ^ -lQt5Core ^ -lQt5Gui ^ -lQt5Widgets ^ -lc ^ -ldl ^ --sysroot%SYSROOT% ^ -target aarch64-linux-ohos ^ -fPIC ^ napi_init.cpp ^ libLazarusOHOS_Wrapper.cpp执行以下指令生成 x86_64 格式的so文件。为了访问hap包安装后的资源文件目录和沙箱目录此处经过修改与原文有所不同。原文指令lazarus鸿蒙开发3编译libLazarusOHOS_Wrapper.so - 秋·风 - 博客园SET NATIVE_OHOS_SDKd:/fpc4ohos/sdk/default/openharmony/native SET SYSROOT%NATIVE_OHOS_SDK%/sysroot SET QT5DIRd:/oh/Qt-5.12.12-ohos-x86_64 %NATIVE_OHOS_SDK%\llvm\bin\clang -shared ^ -o libLazarusOHOS_Wrapper.so ^ -I%SYSROOT%\usr\include ^ -I%SYSROOT%\usr\include\napi ^ -I%QT5DIR%\include ^ -I%QT5DIR%\include\QtCore ^ -I%QT5DIR%\include\QtGui ^ -I%QT5DIR%\include\QtWidgets ^ -L%SYSROOT%\usr\lib\x86_64-linux-ohos ^ -L%QT5DIR%\lib ^ -lace_napi.z ^ -lQt5Core ^ -lQt5Gui ^ -lQt5Widgets ^ -lc ^ -ldl ^ --sysroot%SYSROOT% ^ -target x86_64-linux-ohos ^ -fPIC ^ napi_init.cpp ^ libLazarusOHOS_Wrapper.cpp6 鸿蒙项目增加文件 libLazarusOHOS_Wrapper.d.tsD:\fpc4ohos\ohos_demo\2.ohos_hap_project\entry\src\main\ets\common\libLazarusOHOS_Wrapper.d.ts内容为// entry/src/main/ets/common/libLazarusOHOS_Wrapper.d.ts export interface Wrapper { OHOS_InitPaths(context: object): boolean; } declare const wrapper: Wrapper; export default wrapper;7 鸿蒙项目修改文件 QAbilityStage.etsD:\fpc4ohos\ohos_demo\2.ohos_hap_project\entry\src\main\ets\qabilitystage\QAbilityStage.ets代码// import lazarushos from libLazarusOHOS_Wrapper.so; // 新增导入 import lazarushos from libLazarusOHOS_Wrapper.so; import { Wrapper } from ../common/libLazarusOHOS_Wrapper; // 导入接口 // import AbilityStage from ohos.app.ability.AbilityStage; import QAbility from ../qability/QAbility; import QChildProcess from ../process/QChildProcess; import QtUtils from ../qability/QtUtils; import Want from ohos.app.ability.Want; import common from ohos.app.ability.common; import hilog from ohos.hilog; import qpa from libqohos.so; import {APP_LIBRARY_NAME, LOG_DOMAIN, LOG_TAG} from ../common/QtAppConstants; import { AbilityStage } from kit.AbilityKit; import { fileIo } from kit.CoreFileKit; export default class QAbilityStage extends AbilityStage { // setting appArgs overrides arguments from initial Want object private static appArgs?: Arraystring; private static setupQtApplicationCalled: boolean false; private static initQtAppContextImpl(appContext: common.ApplicationContext, abilityClassName: string, uiExtensionMode: boolean): void { if (!QAbilityStage.setupQtApplicationCalled) { hilog.info(LOG_DOMAIN, LOG_TAG, ccc QAbilityStage::initQtAppContextImpl: init with uiExtensionMode uiExtensionMode); QAbilityStage.setupQtApplicationCalled true; qpa.setupQtApplication({ appContext: appContext, modules: QtUtils.getModulesMapForQt(), appName: APP_LIBRARY_NAME, appArgs: QAbilityStage.appArgs, abilityClassName: abilityClassName, uiExtensionMode: uiExtensionMode, _unusedQChildProcess: new QChildProcess(), }); } else { hilog.info(LOG_DOMAIN, LOG_TAG, ccc QAbilityStage::initQtAppContextImpl: already initialized); } } public static initQtAppContextIfNeeded(appContext: common.ApplicationContext): void { QAbilityStage.initQtAppContextImpl(appContext, QAbility.name, false); } public static initQtAppContextInUiExtensionMode(appContext: common.ApplicationContext, abilityClassName: string): void { QAbilityStage.initQtAppContextImpl(appContext, abilityClassName, true); } // 直接使用 fileIo.copyDirSync适用于层级少、文件小的场景 // public static copyDirSimple(srcPath: string, destPath: string): void { // // 检查目标目录是否已存在 // let destExists: boolean fileIo.accessSync(destPath, fileIo.AccessModeType.EXIST); // if (destExists) { // console.info(目标目录已存在跳过复制: ${destPath}); // return; // } // // 直接复制整个目录 // fileIo.copyDirSync(srcPath, destPath); // } onCreate(): void { hilog.info(LOG_DOMAIN, LOG_TAG, QAbilityStage::onCreate()); qpa.handleAbilityStageOnCreate(this); // 获取 AbilityStageContext let context: common.AbilityStageContext this.context; // 初始化 wrapper 的路径缓存必须在 wrapper.main 执行之前 try { // 直接通过 as 断言调用杜绝 any 类型 let initResult: boolean (lazarushos as Wrapper).OHOS_InitPaths(context); console.info(ccc [QAbilityStage] OHOS_InitPaths result: ${initResult}); } catch (e) { console.error(ccc [QAbilityStage] OHOS_InitPaths failed: ${e}); } // 获取 resfile 资源目录只读和 filesDir 沙箱目录可读写 let resourceDir: string context.resourceDir; let filesDir: string context.filesDir; console.info(ccc resourceDir: ${resourceDir}); console.info(ccc filesDir: ${filesDir}); } onNewProcessRequest(want: Want): string { hilog.info(LOG_DOMAIN, LOG_TAG, QAbilityStage::onNewProcessRequest: want.parameters: JSON.stringify(want.parameters)); QAbilityStage.initQtAppContextIfNeeded(this.context.getApplicationContext()); let processKey: string qpa.handleAbilityStageOnNewProcessRequest(this, want); hilog.info(LOG_DOMAIN, LOG_TAG, ccc QAbilityStage::onNewProcessRequest: processKey: processKey ); return processKey; } onAcceptWant(want: Want): string { hilog.info(LOG_DOMAIN, LOG_TAG, ccc QAbilityStage::onAcceptWant: want.parameters: JSON.stringify(want.parameters)); QAbilityStage.initQtAppContextIfNeeded(this.context.getApplicationContext()); let instanceKey: string qpa.handleAbilityStageOnAcceptWant(this, want); hilog.info(LOG_DOMAIN, LOG_TAG, ccc QAbilityStage::onAcceptWant: instanceKey: instanceKey ); return instanceKey; } onDestroy() { hilog.info(LOG_DOMAIN, LOG_TAG, ccc QAbilityStage::onDestroy()); qpa.handleAbilityStageOnDestroy(this); } }8 lazarus 程序增加一个单元 OHOSPathsunit OHOSPaths; interface uses SysUtils; //function OHOS_GetFilesDir: PChar; cdecl; external libLazarusOHOS_Wrapper.so; //function OHOS_GetCacheDir: PChar; cdecl; external libLazarusOHOS_Wrapper.so; //function OHOS_GetBundleDir: PChar; cdecl; external libLazarusOHOS_Wrapper.so; function OHOS_GetFilesDir: PChar; cdecl; external libLazarusOHOS_Wrapper.so; function OHOS_GetCacheDir: PChar; cdecl; external libLazarusOHOS_Wrapper.so; function OHOS_GetResourceDir: PChar; cdecl; external libLazarusOHOS_Wrapper.so; //function GetOHOSFilesPath: string; //function GetOHOSCachePath: string; //function GetOHOSBundlePath: string; function GetOHOSFilesPath: string; function GetOHOSResourcePath: string; function GetOHOSCachePath: string; implementation //function SafeStr(P: PChar): string; inline; //begin // if P nil then Result : else Result : StrPas(P); //end; // //function GetOHOSFilesPath: string; //begin // Result : SafeStr(OHOS_GetFilesDir); // if Result then Result : IncludeTrailingPathDelimiter(Result); //end; // //function GetOHOSCachePath: string; //begin // Result : SafeStr(OHOS_GetCacheDir); // if Result then Result : IncludeTrailingPathDelimiter(Result); //end; // //function GetOHOSBundlePath: string; //begin // Result : SafeStr(OHOS_GetBundleDir); // if Result then Result : IncludeTrailingPathDelimiter(Result); //end; function GetOHOSFilesPath: string; begin Result : string(AnsiString(OHOS_GetFilesDir)); end; function GetOHOSCachePath: string; begin Result : string(AnsiString(OHOS_GetCacheDir)); end; function GetOHOSResourcePath: string; begin Result : string(AnsiString(OHOS_GetResourceDir)); end; end.9 修改Lazarus程序主窗体代码uses OHOSPaths; ...... showmessage(format(GetOHOSFilesPath: %s, GetOHOSResourcePath: %s, [GetOHOSFilesPath, GetOHOSResourcePath])); ......10 运行结果DevEco模拟器中Lazarus程序弹出窗口

相关新闻

SPI协议深度解析:从核心原理到实战调试全攻略

SPI协议深度解析:从核心原理到实战调试全攻略

1. 项目概述:深入理解SPI协议搞嵌入式开发,尤其是和各类传感器、存储芯片、显示屏打交道,SPI(Serial Peripheral Interface)协议绝对是你绕不开的一道坎。它不像UART那样简单直接,也不像I2C那样需要复杂的地…

2026/8/10 7:10:00 阅读更多 →
从 Embedding 召回到 Reranker 精排:Qwen3 检索微调实战

从 Embedding 召回到 Reranker 精排:Qwen3 检索微调实战

当候选文档从百万级缩小到 Top 100 后,为什么还需要第二个模型? 因为第一阶段解决的是“快速找出可能相关的文档”,第二阶段解决的是“在有限候选里进行更充分的语义交互”。Embedding 适合对海量文档做离线编码和近似最近邻检索&#xff1b…

2026/8/5 23:25:48 阅读更多 →
基于大规模血清蛋白组的 ARDS 三类炎症表型多中心前瞻性队列研究完整解析

基于大规模血清蛋白组的 ARDS 三类炎症表型多中心前瞻性队列研究完整解析

一、文献基础背景该研究论文于2026 年发表于国际呼吸领域顶刊《EUROPEAN RESPIRATORY JOURNAL》(欧洲呼吸杂志)。研究题目:Large-scale proteomic profiling identifies distinct inflammatory phenotypes in acute respiratory distress syn…

2026/8/9 23:02:04 阅读更多 →

最新新闻

ZLibrary反爬机制解析与突破实战

ZLibrary反爬机制解析与突破实战

1. 项目背景与核心挑战去年帮朋友处理一个文献检索项目时,第一次正面遭遇了ZLibrary的反爬系统。当时简单的requestsBeautifulSoup组合完全失效,返回的不是429就是各种验证页面。这种级别的防护在普通电商网站上很少见到,让我意识到文献类平台…

2026/8/10 7:10:32 阅读更多 →
从舞立方官谱到Obsidian知识库:音游谱面数据转换与自动化管理实践

从舞立方官谱到Obsidian知识库:音游谱面数据转换与自动化管理实践

在实际音游自制谱领域,将官方谱面数据转换为特定编辑器(如 Obsidian)可用的格式,是一个兼具技术探索和创意实现的过程。本文将以“舞立方”官谱为例,探讨如何利用 Obsidian 的灵活性和插件生态,构建一套从数…

2026/8/10 7:10:32 阅读更多 →
Codex本地部署指南:从环境准备到API调用与批量任务处理

Codex本地部署指南:从环境准备到API调用与批量任务处理

这次我们来看一个近期在开发者社区中讨论度较高的工具——Codex。如果你正在寻找一个能够简化AI模型本地部署、提供便捷API接口、支持批量任务处理,并且对硬件要求相对友好的解决方案,那么这篇文章值得你花几分钟读完。Codex并非一个单一的模型&#xff…

2026/8/10 7:10:32 阅读更多 →
Flux 3与深度图ControlNet实战:从AI抽卡到精准控制的进阶指南

Flux 3与深度图ControlNet实战:从AI抽卡到精准控制的进阶指南

1. 先搞清楚 Flux 3、Krea 2 和深度图洗图到底能做什么如果你最近在玩 AI 图像生成,尤其是 Stable Diffusion 这类工具,那你大概率被 Flux 3、Krea 2 和“深度图洗图”这几个词刷过屏。很多人一上来就找模型、下提示词,但折腾半天发现要么跑不…

2026/8/10 7:10:32 阅读更多 →
VSG控制MMC并网逆变器Simulink仿真实践

VSG控制MMC并网逆变器Simulink仿真实践

1. 项目概述:VSG控制的MMC并网逆变器仿真在新能源发电系统中,并网逆变器的控制策略直接影响着电网的稳定性和电能质量。虚拟同步发电机(VSG)技术通过模拟同步发电机的运行特性,为逆变器提供了惯性和阻尼特性&#xff0…

2026/8/10 7:10:32 阅读更多 →
七年实践:高效学习总结的系统方法与工具链

七年实践:高效学习总结的系统方法与工具链

1. 学习总结的价值与意义每天记录学习总结这个习惯,我已经坚持了整整七年。从最初简单的流水账,到现在系统化的知识管理,这个看似简单的动作彻底改变了我的学习效率和工作方式。学习总结不是简单的记录,而是一个完整的认知加工过程…

2026/8/10 7:09:31 阅读更多 →

日新闻

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南

GraphQL-CSS API全解析:useGqlCSS、GqlCSS组件与getStyles实用指南 【免费下载链接】graphql-css A blazing fast CSS-in-GQL™ library. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-css GraphQL-CSS是一个基于GraphQL的CSS-in-GQL™库&#xff0…

2026/8/10 0:00:02 阅读更多 →
告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南

告别语言障碍:KISS Translator 双语翻译插件终极指南 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.com/…

2026/8/10 0:00:02 阅读更多 →
BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案

BepInEx配置管理器:游戏插件配置的终极可视化解决方案 【免费下载链接】BepInEx.ConfigurationManager Plugin configuration manager for BepInEx 项目地址: https://gitcode.com/gh_mirrors/be/BepInEx.ConfigurationManager 你是否曾经因为游戏插件的复杂…

2026/8/10 0:00:02 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/10 1:05:29 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/10 1:05:29 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/10 1:05:29 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/9 17:05:02 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/10 1:05:29 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/9 17:05:02 阅读更多 →