一 参考网站:
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里面的方法使用
浙公网安备 33010602011771号