导航

ATL开发office插件

Posted on 2025-01-15 17:40  talenth  阅读(380)  评论(0)    收藏  举报

一 参考网站:

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里面的方法使用