惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Latest news
Latest news
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
B
Blog
T
Threat Research - Cisco Blogs
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
P
Palo Alto Networks Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
T
Tor Project blog
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
Martin Fowler
Martin Fowler
酷 壳 – CoolShell
酷 壳 – CoolShell
Recorded Future
Recorded Future
D
DataBreaches.Net
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
B
Blog RSS Feed
Scott Helme
Scott Helme
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
AWS News Blog
AWS News Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
N
Netflix TechBlog - Medium
L
LangChain Blog
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
W
WeLiveSecurity

博客园 - talenth

windows下简单使用webrtc nvm配置nodejs windows编译pp-shitu webdriver windows下不同cpu架构PE文件区别 vs中/EHa、/EHs、/EHsc的区别 主窗口,子窗口,拥有窗口关闭消息顺序 windows下注册一个打开特定扩展名的文件 yara规则学习 usb3.0+mvme固态安装win7 驱动程序获取内核版本号 提取shell32.dll中的字符串 常见编码 修理鼠标微动开关 InfinityHook原理 段描述符 tls1.3报文 签名证书 windows内核同步机制
ATL开发office插件
talenth · 2025-01-15 · via 博客园 - talenth

一 参考网站:

1 简书 l2m2博主写的 "C++编写PowerPoint插件" (一) ~(五) https://www.jianshu.com/p/4a5b3076511e

2 https://blog.csdn.net/asd467672767/article/details/51742410

3 https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2010/ee691833(v=office.14)

4 https://learn.microsoft.com/el-gr/openspecs/office_standards/ms-customui/e662c001-3558-4511-a565-07a3e32021e3

5 https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.word._application?view=word-pia

6 https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.excel._application?view=excel-pia

7 https://blog.csdn.net/ohoneybaby/article/details/129989860 

8 https://open.wps.cn/previous/docs/client/wpsLoad

9 https://kdocs.cn/l/c7jl7x76T

二 编译工具

vs2022

三 实际开发过程

1 在ppt上方(即ribbon区域)添加按钮等

安装参考网站1进行开发即可, 不过会遇到编译不过的问题, 仔细对比发现vs生成的CConnect中, 

OnConnection第二个参数的类型以及OnDisconnection第一个参数的类型是long,

而对应的基类_IDTExtensibility2(在MSADDNDR.tlh文件中)中的对应函数参数类型其实是个枚举值, 将其改为相同的类型后, 即可编译通过

2 在右键菜单中添加菜单项

这个说起来很简单, 但是由于微软目前主推c#, 以及js这些开发语言, 所以C++的文档在网上几乎没有, 不过好在手头上有个C#的右键菜单dll, 反编译了一下, 连蒙带猜, 给解决了

就是在上面的"GetCustomUI" 返回一个右键菜单格式的xml就可以了, 例子如下

<?xml version="1.0" encoding="utf-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="OnLoad">
    <contextMenus>
        <contextMenu idMso="ContextMenuTextEdit">
            <button id="buttonAssist" label="TEST" insertBeforeMso="Copy" onAction="OnAction" />
        </contextMenu>
    </contextMenus>
</customUI>

其他的跟1类似

四 开发过程中遇到的问题

1 xml里面的回调函数签名

在参考网站3最下边, 注意, 函数签名里面的"IRibbonControl" 这些派生类须用"IDispatch" 代替, 然后再在实际函数里边强转回去使用, 否则idl文件会编不过, 可能是添加个头文件就可以了, 网上找了一顿, 没有找到

参考网站4 是动态右键菜单回调函数使用说明

2 一个dll里面既添加ribbon区域按钮, 又添加右键菜单按钮

在同一个项目里面添加两个ATL对象, 分别返回两个不同的xml, 同时注册表里写两份信息, 就是ppt里会看到两个加载项, 其实是一个dll, 不知道有没有更好的方案

3 取消编译完成自动注册到系统

就是项目属性-> 链接器-> 注册输出: 改成"否", 就行了, 图如 参考网站2

4  获取具体的ppt信息, 比如选中的文字是啥等等

在"OnConnection" 函数中, 将第一个参数强转成对应的application对象保存使用

CComPtr<msppt::_Application> app_ =CComQIPtr<msppt::_Application>(Application);

前提是要导入对应的类型库, 以下是网上搜集的, 可能有错误

//MSWORD.OLB
//#import "libid:00020905-0000-0000-C000-000000000046" auto_rename auto_search raw_interfaces_only rename_namespace("msword")

//MSPPT.OLB
#import "libid:91493440-5A91-11CF-8700-00AA0060263B" auto_rename auto_search raw_interfaces_only rename_namespace("msppt")//MSOUTL.OLB
//#import "libid:00062FFF-0000-0000-C000-000000000046" auto_rename auto_search raw_interfaces_only rename_namespace("msoutlook")

// excel类型库 excel.exe
//#import "libid:00020813-0000-0000-C000-000000000046" auto_rename auto_search raw_interfaces_only rename_namespace("msexcel")

参考网站5是word对应的application对象说明文档

6是excel对应的文档

5 类型库

类型库对应的guid可以到HKEY_CLASSES_ROOT\TypeLib目录下查找

 注意, 使用guid导入的类型库, 同类型的可以有多个, 如果存在多个则会选用最高版本的对应平台版本, 如果没有则会报错找不到.

比如同时安装office 365, 跟wps, 编译x64版本的插件就会遇到找不到错误, 前几个2.几的都是office安装的, 其中最新的是2.8, 里面有win64版本的mso.dll,

而安装了wps后, wps加了一个63.1的注册表项, 但是只有win32的类型库, 就报错了, 此时处理方案就是把63.1改的比2.8小就行了

7 wps复用office的插件

按照参考网站7, 可以加载, 以及简单使用, 但是跟msppt强相关的比如上面的CComPtr<msppt::_Application> app_就不好用了, 暂不确定是x64版本的wps支持问题还是什么问题

8 wps原生office插件

参考网站8, 里面有个gitee上的例子, 例子的说明里面有个 com插件的例子链接, 下载参考, 发现基本上还是开发一个office插件, 然后用上面7里面的方法使用