永中Office二次开发技术详解与实战指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:永中Office是一款兼容Microsoft Office格式的国产办公软件,提供强大的二次开发能力,支持通过API和SDK实现功能扩展与深度集成。本文档系统介绍了二次开发的核心技术,涵盖开发环境搭建、对象模型使用、API调用、事件处理机制及调试部署等关键环节,并结合示例解析帮助开发者快速掌握自定义菜单、插件集成、数据交互等实际应用场景。适用于希望提升办公自动化水平、满足个性化业务需求的开发者。

永中Office二次开发实战指南:从零搭建高可用插件体系

在信创浪潮席卷政府、金融与央企的今天,办公软件自主可控已不再是“可选项”,而是“必答题”。面对WPS、永中Office等国产套件的大规模部署,企业IT部门最常遇到的问题是:“如何让这些新工具无缝融入已有业务流程?”——报表自动生成?文档水印统一?公文流转合规审查?这些看似简单的诉求,背后其实都指向同一个技术支点: 二次开发能力

而在这其中,永中Office凭借其对UOF国家标准的深度支持、COM组件的高度兼容性以及丰富的SDK接口,在政务文书处理领域占据了独特地位。但现实往往是残酷的:不少开发者拿着官方文档一头扎进去,结果却被“注册失败”、“找不到DLL”、“权限不足”等问题反复折磨。究其原因,并非API本身复杂,而是缺乏一套 系统化、可复用、抗踩坑 的工程实践路径。

本文将带你彻底摆脱“照着示例走不通”的窘境,以一名资深集成工程师的视角,手把手构建一个稳定、高效且易于维护的永中Office二次开发环境。我们不堆术语,不讲虚话,只聚焦一件事: 让你的第一个插件不仅能跑起来,还能长期跑得稳


开发环境搭建的艺术:别再让“依赖缺失”毁掉你的周末

很多人以为装个IDE、解压SDK就万事大吉了,殊不知真正的挑战才刚刚开始。操作系统配置不当、运行时库版本冲突、环境变量设置错误……任何一个细节出问题,都会导致后续编译或运行时报出令人抓狂的错误码。

所以,咱们先来一次“外科手术式”的环境准备,把所有潜在雷区一次性排干净。

Windows平台:选对起点,事半功倍 🖥️

首先明确一点: 别用家庭版!别用32位系统!

永中Office及其SDK面向的是企业级应用场景,必须运行在具备完整COM支持和权限管理机制的操作系统上。推荐组合如下:

  • Windows 10 专业版 / Windows 11 专业版(64位)
  • Windows Server 2016/2019/2022

为什么这么讲究?因为像 .NET Framework 、VC++运行库、Windows SDK这些底层依赖,家庭版默认可能没开全,服务器版则天生为多用户、高稳定性设计,更适合插件调试与部署。

核心依赖清单 ✅
组件 推荐版本 安装建议
.NET Framework 4.8+ 使用在线安装包自动补全
Visual C++ Redistributable 2015–2022 x64 下载独立安装包逐个装
MSBuild 工具链 16.0+(VS2022自带) 随Visual Studio安装
Windows SDK 10.0.19041.0+ 开发者模式下启用
DirectX 运行库 最新版 微软官网下载

⚠️ 小贴士:如果你在启动插件时报错“无法加载模块 yzcore.dll ”,八成是因为VC++运行库缺失。可以用 Dependency Walker 打开该DLL查看具体缺哪个DLL。

PowerShell一键初始化脚本 💡

与其手动点击安装,不如写个小脚本来自动化处理基础配置:

# 启用旧版.NET Framework 3.5(用于COM互操作兼容)
dism /online /enable-feature /featurename:NetFx3 /all /source:D:\sources\sxs /limitaccess

# 开启开发者模式,允许非签名应用调试
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /v AllowDevelopmentWithoutDevLicense /t REG_DWORD /d 1 /f

Write-Host "✅ 基础环境配置完成!请重启计算机使更改生效。"

这段代码干了两件事:
1. 通过DISM命令激活 .NET Framework 3.5 ,这对某些老版本COM桥接至关重要;
2. 修改注册表开启“开发者模式”,避免每次调试都要弹窗确认。

执行完记得 重启电脑 ,否则部分策略不会生效哦!


IDE怎么选?根据语言定乾坤 🔧

不同的开发语言,对应的IDE也不同。别一股脑全上Visual Studio,那样只会让自己陷入混乱。

C++ / .NET 开发者 → 用 Visual Studio 2022

这是目前对COM开发支持最好的IDE之一。建议安装以下工作负载:

  • ✅ 桌面开发用C++
  • ✅ .NET桌面开发

初始化项目时注意几个关键设置:

设置项 推荐值 说明
平台工具集 v143 对应VS2022,默认即可
输出目录 $(SolutionDir)bin\$(Configuration)\ 统一输出路径便于管理
多进程编译 /MP 显著提升大型项目构建速度

顺便提一句:如果你发现编译时报 LNK2019 未解析外部符号,大概率是你忘了链接 ole32.lib 。解决办法很简单,在头文件里加一行:

#pragma comment(lib, "ole32.lib")
Java开发者 → 用 Eclipse IDE for Java Developers (2023-12)

Java不能直接调用COM组件,必须通过JNI做一层封装。这时候Eclipse配合CDT插件就是最佳选择。

你需要做的三件事:

  1. 安装 Eclipse CDT(C/C++ Development Tooling)
  2. 配置外部构建器为 nmake msbuild
  3. 添加JNI头文件路径

例如,在 .classpath 中加入:

<classpathentry kind="lib" path="C:/Program Files/Java/jdk-17/include"/>
<classpathentry kind="lib" path="C:/Program Files/Java/jdk-17/include/win32"/>

如果编译时提示 jni.h: No such file or directory ,那一定是路径写错了。检查 JAVA_HOME 是否正确指向JDK根目录!

跨语言团队协作建议 🤝

如果是多人协作、涉及多种语言的项目,强烈建议采用如下目录结构:

/project-root
├── /cpp-plugin        # C++原生插件源码
├── /dotnet-wrapper     # .NET封装层
├── /java-jni           # JNI桥接代码
├── /shared-headers     # 共享IDL接口定义
└── build-scripts/

这种分层架构不仅利于CI/CD自动化,还能有效隔离变更影响范围。比如升级SDK时,只需改 shared-headers 里的 .idl 文件,其他模块自动感知。


环境变量:被忽视的关键拼图 🔗

很多“明明路径都对却加载失败”的问题,根源就在环境变量没配好。

以下是必须设置的核心变量:

变量名 示例值 作用
YONGYOU_OFFICE_HOME C:\Program Files\Yozio\YonYouOffice 指向主程序安装目录
SDK_ROOT $(YONGYOU_OFFICE_HOME)\SDK 快速定位SDK资源
PATH 增量 $(YONGYOU_OFFICE_HOME)\bin;$(SDK_ROOT)\lib 让系统能找到 yzcore.dll

可以用PowerShell批量设置并持久化到机器级别:

$officePath = "C:\Program Files\Yozio\YonYouOffice"
[Environment]::SetEnvironmentVariable("YONGYOU_OFFICE_HOME", $officePath, "Machine")
[Environment]::SetEnvironmentVariable("SDK_ROOT", "$officePath\SDK", "Machine")

$currentPath = [Environment]::GetEnvironmentVariable("PATH", "Machine")
$newPath = "$currentPath;$officePath\bin;$officePath\SDK\lib"
[Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine")

Write-Host "🎉 环境变量已更新,请关闭终端重新打开以生效。"

⚠️ 注意:修改后一定要 重启命令行窗口 ,否则读取的还是旧的 PATH 缓存。


多版本共存怎么办?动态加载才是王道 🔄

现实中经常遇到一台机器同时装了永中Office 2020和2024的情况,这时候如果不小心加载了错误版本的 yzcore.dll ,轻则功能异常,重则直接崩溃。

解决方案有三个层次:

第一层:命名空间隔离

不同版本使用不同的ProgID进行区分:

// v2020
CLSID clsid_v20 = CLSID_Application;
// v2024
CLSID clsid_v24 = CLSID_Application_V24;

注册表中也会体现为两个独立入口:

HKEY_CLASSES_ROOT
 └── Yozio.Application.2020
 └── Yozio.Application.2024
第二层:运行时动态加载DLL

绕过全局注册,按需加载指定路径的DLL:

HMODULE hDll = LoadLibraryEx(
    L"C:\\Program Files\\Yozio\\YO2024\\bin\\yzcore.dll",
    NULL,
    LOAD_WITH_ALTERED_SEARCH_PATH
);

if (hDll) {
    typedef HRESULT (*CreateAppFunc)(IApplication**);
    CreateAppFunc pFn = (CreateAppFunc)GetProcAddress(hDll, "CreateApplicationInstance");
    if (pFn) {
        pFn(&pApp); // 成功创建实例
    }
}

这种方法的优势在于完全避开注册表污染,适合需要精确控制版本的场景,比如灰度发布测试。

下面是整个启动流程的可视化逻辑:

graph TD
    A[启动应用] --> B{检查注册表InstallPath}
    B -->|存在| C[读取主安装目录]
    B -->|不存在| D[提示用户手动指定]
    C --> E[加载对应版本的yzcore.dll]
    E --> F[初始化COM组件]
    F --> G[成功启动]
    E --> H[失败 → 日志记录dll版本不匹配]
    H --> I[尝试回退至备用路径]

这套机制确保即使环境中存在多个版本,也能优雅降级而不至于直接报错退出。


SDK集成实战:不只是复制粘贴那么简单 📦

拿到SDK压缩包后,别急着往项目里扔。先搞清楚里面都有啥,才能合理利用。

典型的SDK目录结构长这样:

/YongyouOffice_SDK/
├── /include/               # C/C++头文件
│   ├── yzoffice.h          # 主接口定义
│   ├── yzapp.h             # Application对象声明
│   └── yzdoc.h             # Document相关类
├── /lib/
│   ├── yzcore.lib          # 静态链接库
│   ├── yzcore.dll          # 动态库(核心)
│   └── yzcom.tlb           # COM类型库(供.NET/Python使用)
├── /samples/
│   ├── cpp_hello/
│   ├── csharp_addin/
│   └── java_jni_demo/
├── /docs/
└── license.txt

重点说几个容易忽略的点:

  • yzcore.lib 是导入库,不含实现,仅用于链接阶段;
  • yzcore.dll 是真正在运行时起作用的模块,必须随插件一起部署;
  • yzcom.tlb 支持通过 #import 导入.NET项目,生成RCW包装类;
  • 所有示例代码都在 /samples 中,初学者务必先跑通一个再动手。

注册SDK:一步都不能少 ⚙️

永中Office基于COM架构,因此必须注册才能正常使用。

管理员权限运行以下命令:

regsvr32 "C:\Program Files\Yozio\YonYouOffice\SDK\yzcore.dll"

成功会弹窗提示:“DllRegisterServer in yzcore.dll succeeded.”

如果失败,常见原因包括:

  • ❌ 权限不够 → 用“以管理员身份运行”
  • ❌ DLL损坏 → 用 signtool verify 检查签名完整性
  • ❌ 缺VC++运行库 → 回头看前面的依赖安装

许可证激活:别让试用期卡住上线进度 🛑

没有许可证,插件只能跑30天。正式部署前必须完成激活。

手动激活方式(C++)
#include <yzlicense.h>

bool ActivateLicense() {
    ILicenseManager* pLic = nullptr;
    CoCreateInstance(CLSID_LicenseManager, NULL, CLSCTX_INPROC_SERVER,
                     IID_ILicenseManager, (void**)&pLic);

    HRESULT hr = pLic->LoadFromFile(L"C:\\licenses\\devkey.lic");
    pLic->Release();
    return SUCCEEDED(hr);
}

错误码对照表:

错误码 含义
0x8004F001 许可过期
0x8004F002 硬件指纹变更
0x8004F003 文件格式无效
自动化激活脚本(PowerShell)

适合在CI流水线中预检:

function Invoke-LicenseActivation {
    param([string]$LicensePath)
    if (-not (Test-Path $LicensePath)) {
        Write-Error "License file not found!"
        return $false
    }

    $typeLib = "C:\Program Files\Yozio\YonYouOffice\SDK\yzcom.tlb"
    $app = New-Object -ComObject Yozio.Application
    $licMgr = $app.GetType().InvokeMember("LicenseManager", 
                                          "GetProperty", $null, $app, $null)

    try {
        $result = $licMgr.LoadFromFile($LicensePath)
        return $result
    } catch {
        Write-Host "Activation failed: $_"
        return $false
    }
}

# 调用示例
Invoke-LicenseActivation -LicensePath "C:\keys\trial.lic"

这个脚本利用反射调用COM对象属性,自动处理BSTR转换,非常适合作为部署前的健康检查环节。


创建第一个插件:Hello World也能学到精髓 🌟

终于到了激动人心的时刻——写代码!

我们以C++为例,做一个简单的菜单插件,在永中Word中添加一个“Hello”按钮。

步骤一:配置项目引用

在Visual Studio中新建Win32 DLL项目,然后设置:

  • 包含目录: $(YONGYOU_OFFICE_HOME)\SDK\include
  • 库目录: $(YONGYOU_OFFICE_HOME)\SDK\lib
  • 链接库: yzcore.lib

步骤二:编写核心逻辑

class CHelloPlugin : public IDTExtensibility2 {
public:
    STDMETHOD(OnConnection)(IDispatch* Application, ext_ConnectMode Mode,
                            IDispatch* AddInInst, SAFEARRAY** custom) {
        m_spApp = Application;
        AddMenu();
        return S_OK;
    }

    void AddMenu() {
        IDispatchPtr cmdBar = GetCommandBar("Standard"); // 获取标准工具栏
        OleVariant caption = L"Hello";
        IDispatchPtr btn = cmdBar->Controls->Add(msoControlButton, Missing, Missing, 1, TRUE);
        btn->PutProperty(L"Caption", caption);
        ConnectEvent(btn, OnClick, &CHelloPlugin::HandleClick);
    }

    static void HandleClick() {
        ::MessageBox(NULL, L"Hello World!", L"Plugin", MB_OK);
    }
};

打包为 .dzx 插件后放入 AddIns 目录即可自动加载。

是不是很简单?但这里面藏着几个关键知识点:

  • IDTExtensibility2 是插件生命周期接口, OnConnection 在Office启动时触发;
  • CommandBars 控制UI布局,支持动态增删按钮;
  • ConnectEvent 实现事件绑定,避免内存泄漏。

常见编译错误急救手册 🚑

别笑,这真的是每个开发者都会经历的阶段。下面这张表我愿称之为“保命指南”:

错误信息 原因 解决方案
unresolved external symbol _CoCreateInstance@... 未链接 ole32.lib #pragma comment(lib, "ole32.lib")
Class not registered yzcore.dll 未注册 执行 regsvr32 yzcore.dll
Access is denied UAC阻止注册表写入 以管理员身份运行IDE或CMD

还有一个隐藏陷阱: 架构不匹配

如果你在x64系统上编译了x86版本的插件,加载时会出现 BadImageFormatException 。记住一句话: 宿主是什么架构,你就编什么架构


API架构全景图:对象模型 vs 命令接口 🧩

掌握了环境搭建,下一步就是深入理解永中Office的API体系。它主要分为两类:

1. 对象模型接口:细粒度操控一切

这是最强大的方式,可以访问应用程序、文档、段落、单元格等每一个元素。

IApplication app = new ApplicationClass();
IDocument doc = app.Documents.Add();
ISheet sheet = doc.Worksheets[0];
sheet.Cells["A1"].Value = "Hello, Yongyou Office";
doc.SaveAs("example.zet");
doc.Close();
app.Quit();

优点是控制精细,缺点是性能开销大,尤其是频繁跨进程调用时。

2. 命令接口:快捷指令直达功能

适用于触发内置操作,如保存、打印、查找替换等。

long cmdID = CMD_SAVE;
app->ExecuteCommand(cmdID, NULL);

速度快,但不可控中间过程,属于“黑盒调用”。

如何选择?
场景 推荐方式
自动生成带样式的表格 ✅ 对象模型
实现“复制”“粘贴”按钮 ✅ 命令接口
查找后修改部分内容 ✅ 先命令跳转 + 再对象编辑

事件驱动编程:让插件真正“活”起来 🎯

静态功能只是开始,真正的智能来自对用户行为的响应。

捕获文档事件

STDMETHOD(DocumentOpen)(IDispatch* Doc) {
    _bstr_t docName;
    IDispatchPtr pDoc(Doc);
    pDoc->GetProperty(L"Name", &docName);
    ::MessageBox(nullptr, (L"文档已打开:" + docName).GetBSTR(), L"通知", MB_OK);
    return S_OK;
}

你可以用它来做:
- 自动加载模板
- 记录审计日志
- 弹窗提醒敏感词

用户输入监控

public void SelectionChange()
{
    var selection = app.ActiveDocument.Selection;
    if (selection.Text.Contains("机密"))
    {
        selection.Font.Color = WdColor.wdColorRed;
        MessageBox.Show("检测到敏感词!");
    }
}

甚至可以拦截非法输入:

flowchart TD
    A[用户输入] --> B{是否包含禁用词?}
    B -- 是 --> C[清除内容]
    C --> D[弹窗警告]
    B -- 否 --> E[正常录入]
    E --> F[记录日志]

UI扩展实战:打造专属工作台 🎨

没人喜欢藏在角落的功能。给你的插件配上漂亮的菜单和图标吧!

资源文件定义UI

IDR_CUSTOM_MENU MENU
BEGIN
    POPUP "&插件工具"
    BEGIN
        MENUITEM "&生成报告", ID_PLUGIN_GENERATE_REPORT
        MENUITEM "导出为PDF(&E)...", ID_PLUGIN_EXPORT_PDF
        MENUITEM SEPARATOR
        MENUITEM "关于(&A)", ID_PLUGIN_ABOUT
    END
END

编译后嵌入DLL,再通过API加载到主界面。

图标与提示设置

HBITMAP hBitmap = (HBITMAP)LoadImage(
    GetModuleHandle(NULL),
    MAKEINTRESOURCE(IDB_TOOLBAR_ICO),
    IMAGE_BITMAP,
    16, 16,
    LR_DEFAULTCOLOR
);
btn->SetPicture(OLE_HANDLE(hBitmap));
btn->SetTooltipText(_bstr_t("一键生成合规报告"));

小尺寸图标建议用PNG+透明通道,视觉更清爽。


插件优化三板斧:快、稳、省 💨

1. 减少API调用次数

❌ 错误示范(慢):

for (int i = 1; i <= 1000; i++) {
    range = sheet.GetCell(i, 1);
    value = range.GetText();
}

✅ 正确做法(快几十倍):

object[,] data = sheet.GetRange(1, 1, 1000, 5).GetValueArray();

批量读写,能省90%以上时间!

2. 加缓存防重复查询

对于常用样式、配置项,建议加LRU缓存:

graph TD
    A[请求数据] --> B{缓存中有吗?}
    B -- 是 --> C[返回缓存]
    B -- 否 --> D[调用API获取]
    D --> E[存入缓存]
    E --> F[返回结果]

限制最多存100条,防止内存爆炸。

3. 异步处理防卡顿

耗时任务放后台线程:

std::thread([]() {
    for (int step = 0; step < totalSteps; ++step) {
        ProcessStep(step);
        PostMessage(hMainWnd, WM_PLUGIN_PROGRESS, step, totalSteps);
    }
}).detach();

主线程只负责刷新进度条,用户体验丝滑无比~


发布部署全流程:从本地到生产环境 🚀

打包工具使用

永中提供专用打包工具 YZOPackager.exe ,配置文件 package.xml 示例:

<Package>
  <Name>MyCustomPlugin</Name>
  <Version>1.2.0</Version>
  <EntryDll>bin\Release\PluginCore.dll</EntryDll>
  <Dependencies>
    <File>Newtonsoft.Json.dll</File>
  </Dependencies>
</Package>

打包命令:

YZOPackager.exe -build package.xml -output MyPlugin.yzo

数字签名必不可少 🔐

所有插件必须签名,否则会被视为不安全。

signtool sign /f mycert.pfx /p password /t http://timestamp.digicert.com PluginCore.dll

宿主端可通过 WinVerifyTrust() 自动校验签名有效性。

自动更新机制设计

伪代码实现:

def check_update():
    current_ver = read_local_version()
    latest = http_get("https://update.yozo.com/api/latest")
    if latest.version > current_ver:
        download_and_install(latest.package_url)
        restart_office()

支持静默更新,不影响用户正常办公。


结语:你写的不是插件,是生产力 🌈

当我们谈论永中Office二次开发时,本质上是在讨论 如何把重复劳动交给机器,把创造力还给人类 。一个小小的插件,可能是财务人员每月省下8小时的手工报表,可能是法务同事避免一次重大合规风险,也可能是一个团队效率跃迁的起点。

技术从来不是目的,解决问题才是。希望这篇指南不仅能帮你跑通第一个Hello World,更能点燃你用代码改变工作方式的热情。

现在,关掉这篇文章,打开你的IDE,去创造点什么吧!✨

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:永中Office是一款兼容Microsoft Office格式的国产办公软件,提供强大的二次开发能力,支持通过API和SDK实现功能扩展与深度集成。本文档系统介绍了二次开发的核心技术,涵盖开发环境搭建、对象模型使用、API调用、事件处理机制及调试部署等关键环节,并结合示例解析帮助开发者快速掌握自定义菜单、插件集成、数据交互等实际应用场景。适用于希望提升办公自动化水平、满足个性化业务需求的开发者。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)内容概要:本文围绕使用MATLAB和XBee技术实现温度传感器无线网络的连续监控展开研究,介绍了如何构建无线传感网络系统,并利用MATLAB进行数据采集、处理可视化分析。系统通过XBee模块实现传感器节点间的无线通信,实时传输温度数据至主机,MATLAB负责接收并处理数据,实现对环境温度的动态监测。文中详细阐述了硬件连接、通信协议配置、数据解析及软件编程实现过程,并提供了完整的MATLAB代码示例,便于读者复现和应用。该方案具有良好的扩展性和实用性,适用于远程环境监测场景。; 适合人群:具备一定MATLAB编程基础和无线通信基础知识的高校学生、科研人员及工程技术人员,尤其适合从事物联网、传感器网络相关项目开发的初学者中级开发者。; 使用场景及目标:①实现基于XBee的无线温度传感网络搭建;②掌握MATLAB无线模块的数据通信方法;③完成实时数据采集、处理可视化;④为环境监测、工业测控等实际应用场景提供技术参考。; 阅读建议:建议读者结合文中提供的MATLAB代码硬件连接图进行实践操作,先从简单的点对点通信入手,逐步扩展到多节点网络,同时可进一步探索数据滤波、异常检测、远程报警等功能的集成。
内容概要:本文系统讲解了边缘AI模型部署优化的完整流程,涵盖核心挑战(算力、功耗、实时性、资源限制)设计原则,详细对比主流边缘AI芯片平台(如ESP32-S3、RK3588、Jetson系列、Coral等)的性能参数适用场景,并以RK3588部署YOLOv8为例,演示从PyTorch模型导出、ONNX转换、RKNN量化到Tengine推理的全流程。文章重点介绍多维度优化策略,包括模型轻量化(结构选择、输入尺寸调整)、量化(INT8/FP16)、剪枝蒸馏、算子融合、批处理、硬件加速预处理及DVFS动态调频等,显著提升帧率并降低功耗。通过三个实战案例验证优化效果,最后提供常见问题解决方案未来技术趋势。; 适合人群:具备一定AI模型开发经验的工程师,尤其是从事边缘计算、嵌入式AI、计算机视觉应用研发的技术人员,工作年限建议1-5年;熟悉Python、C++及深度学习框架(如PyTorch、TensorFlow)者更佳。; 使用场景及目标:①在资源受限的边缘设备上高效部署AI模型;②实现高帧率低功耗的双重优化目标;③掌握从芯片选型、模型转换到系统级调优的全链路能力;④解决实际部署中的精度损失、内存溢出、NPU利用率低等问题。; 阅读建议:建议结合文中提供的代码实例工具链(如RKNN Toolkit、Tengine、TensorRT)动手实践,重点关注量化校准、模型压缩硬件协同优化环节,同时参考选型表格匹配具体应用场景,并利用功耗监测工具进行闭环调优。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值