文章目录
DSOFramer
dsoframer是微软提供一款开源的用于在线编辑、调用Word、 Excel 、PowerPoint等的ActiveX控件。
1.官方有Dsoframer 1.3,支持Office2003和2007,也有远程保存的方法,但这个远程保存方法要求远程服务器的 HTTP 支持 Microsoft FrontPage Server Extensions (FPSE) 或 Web 分发创作和版本控制 (WebDAV) 协议扩展,有点不现实。
2.网上广为流传的还有Dsoframer 2.2.1.2,该控件支持HttpPost远程保存,但不支持Office 2007.
3.Dsoframer 2.3.0.0,这个是网上改的2.2.1.2版使其支持Office 2007。
注册使用
1、下载dsoframer.ocx文件。
2、在32位Windows操作系统中,将dsoframer.ocx组件复制到C:\Windows\System32目录,并使用regsvr32命令注册(命令行要以管理员身份运行,否则会报0x80070005错误)。
3、在64位Windows操作系统中,将dsoframer.ocx组件复制到C:\Windows\SysWOW64目录,并使用regsvr32命令注册(同上)。
regsvr32 C:\Windows\SysWOW64\dsoframer.ocx
4、在Visual Studio中,将调用DSOFramer组件项目的编译选项中的目标CPU设置为x86。
Dsoframer控件的下载及注册
ActiveX控件dsoFramer的使用(word、excel、PPT)
https://github.com/stone0090/OfficeTools.OnlineEditWord
Dumpcpp + Word
F:\Qt\Qt5.12.9\5.12.9\msvc2017_64\bin路径中打开CMD:
dumpcpp.exe "\WebOffice\WebOffice\ocx\WebOffice.ocx" -o DWebOffice
dumpcpp.exe "F:\Program Files\LibreOffice\program\so_activex.dll" -o DLibreOffice
dumpcpp.exe {F1924D0C-9B35-4A46-BCDE-CFEF2CE67A17}
dumpcpp.exe无法处理64位程序的CLSID。需找到dumpcpp源码\Src\qtactiveqt\tools\dumpcpp
,修改源码,填写参数后,再编译运行生成.cpp、.h。
利用Qt调用ocx插件接口,并使用dumpcpp生成.h和.cpp接口文件
Micorsoft WORD CLSID查看
- 使用工具RegDllView.exe(或oleview.exe)。
- 找到WINWORD.EXE中Word.Document即可找到对应的GUID。
C++\QT & Word
Microsoft: Bookmarks object (Word)
Word 解决方案
Microsoft.Office.Interop.Word 命名空间
-
在QT项目中包含ActiveQt模块,使用ActiveQt框架中的QAxContainer模块:
QT += axcontainer
。
1.1 QAxContainer模块允许我们使用COM对象并且可以在Qt应用程序中嵌入QActive控件。
1.2 QAxServer模块允许我们导出使用Qt编写的自定义的COM对象和Active控件。 -
在项目在头文件中包含QAxWidget和QAxObject。
QAxBase
:抽象类,提供初始化及访问com对象的接口(相关的附加依赖项 Qt5AxContainer.lib Qt5AxServer.lib Qt5AxBase.lib)。
QAxObject
与QAxWidget
是QAxBase的子类。
QAxObject
:是包含com对象的QObject。可以用来操作Word\Excel等。
QAxWidget
:是包含ActiveX控件的QWidget。 -
QT ui中添加QAxWidget控件。
-
右键点击拖放的QAxWidget控件,选择“设置控件”。
-
打开word文档
QAxObject* officeDocument = new QAxObject("DSOFramer.DsoFramerControl", this);
officeDocument->setControl("Word.Document");
officeDocument->dynamicCall("SetApplication(const QString&)", "Microsoft Word"); // 指定打开Word文档时使用的应用程序
officeDocument->dynamicCall("Open(const QString&)", "your_file_path");
// 将dsoframer控件添加到窗口中
QWidget* widget = QWidget::createWindowContainer(officeDocument, this);
setCentralWidget(widget);
// 自动打开
officeDocument->dynamicCall("Activate");
- 获取exception
QAxObject *m_pApp;
connect(m_pApp, SIGNAL(exception(int, QString, QString, QString)), this, SLOT(slots_exception(int, QString, QString, QString)));
void DWorldImp2010::slots_exception(int code, const QString &source, const QString &desc, const QString &help)
{
QString strError = QString("Error[%1]: %2 %3 %4").arg(source).arg(code).arg(desc).arg(help);
qDebug() << strError;
}
Qt 使用QAxObject 访问 Word 异常问题 — 持续更新中
Problem
QAxObject无法识别
1.在.pro文件添加QT += axcontainer
2.在.cpp文件下加载#include <ActiveQt/QAxObject>
3.点击扩展->QT VS Tool-> Qt Project Settings -> Qt Model,勾选ActiveQt container模块即可
VS2019:无法打开源文件 ‘QAxObject‘“的错误解决办法
close()报错:此方法或属性无效,因为 此文档在另一应用程序中
Word开发工具
打开word【开发工具】选项卡
录制宏(获取函数)
API文档生成
// QAxObject* word = new QAxObject("Word.Application", 0);
QAxObject* word = new QAxObject("Word.Document");
QFile file("C:\\fff.html");
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out << word->generateDocumentation();
file.close();
COM组件
COM:Component Object Modal,组件对象模型。
作用
COM的最大特点:复用。
在WINDOWS中,把DLL放置在一些公共位置(WINDOWS下的SYSTEM32中)也能达到复用,但是,如果把DLL放置在应用文件夹中,则可以被优先使用,容易导致问题。
COM注册:通过注册,定义COM对象的统一入口(通常是一个GUID),所有的应用里使用这个COM的时候,其实都是使用这个GUID的。
COM的GUID:并非是唯一的,只是说,提供的服务接口是唯一的,因为的COM不同版本可能会有不同的GUID,此时,这个COM的服务GUID就用于指明具体实现COM的GUID(或DLL/OCX文件)。
COM注册的行为:登记COM的GUID信息,同时指明这个COM的GUID指向的实际的模块(DLL/OCX)文件或版本GUID。
COM编程(COM组件生成、运行)
ActiveX控件以exe形式发布可以不需要注册,在启动时加上-activex参数告诉它以提供COM服务的形式启动。
windows com指针
如何:创建和使用 CComPtr 和 CComQIPtr 实例
其它参考
QAxWidget 打开word、pdf、excel、ppt
Qt学习笔记:清除用QAxObject创建的Office进程
QT在子线程中使用QAxWidget需要初始化COM的问题
C++/Qt 和 Word,Excel,PDF 交互总结
Using ActiveX controls and COM in Qt
Category:Developing with Qt
dsoframer
DSO(dsoframer)的接口文档
DSOFramer 控件修改
DSOframer 微软官方API的查阅方法
C#: Use dsoframer.ocx control to achieve embedded office effect (detailed explanation)
C#:使用dsoframer.ocx控件实现内嵌office效果(详解)
原生ActiveX控件
m_pReportAxWnd = new DReportAxWnd(this);
ui.gridLayout_report->addWidget(m_pReportAxWnd);
// DReportAxWnd.cpp
QGridLayout *layout = new QGridLayout(this);
m_pReportAxWidget = new QAxWidget("Word.Application");
layout->addWidget(m_pReportAxWidget);
m_pReportAxWidget->setControl("E://11111.doc");
// 失败
QGridLayout *layout = new QGridLayout(this);
m_pReportAxWidget = new QAxWidget("Word.Application", this);
m_pReportAxWidget->dynamicCall("Documents.Open(const QString&)", m_strReportPath);
layout->addWidget(m_pReportAxWidget);
其它方案
WebOffice
webbrowser
Office OCX
间接嵌入浏览器
通过进程打开后,嵌入QT
LibOffice \ OpenOffice
Disphelper进行OpenOffice自动化
NTKO
IWebOffice
SOAOffice
Microsoft.Office.Interop
有谁知道类似pageoffice的 集成office控件?
WEB网站类型系统中使用的OFFICE控件-破解Ntko-Office