单词 CAddin - 设置属性与C++
Word CAddin - SetProperty with C++
通过机器生成的 IDispatch 包装器类在 MFC C++中使用 Word 自动化,使用从 Typelib Wizard添加类创建的
CApplication word;
word.CreateDispatch(_T("Word.Application")
,然后打开文档并将其另存为 PDF。
不幸的是,我需要禁用捕获保存功能并阻止我另存为 PDF 的 Word 插件。我应该能够通过将 COMAddin 对象的连接属性设置为 false 来禁用此功能。我可以看到一个返回 COMAddIns 列表的函数。
CAddIns addins = word.get_COMAddIns();
我需要逐步浏览此数组并找到正确的加载项。
CAddIn addin;
for (short i = 1; i < addins.get_Count(); i++)
{
addin = addins.Item(COleVariant((short)i));
CString name = addin.get_Name();
if (name == L"ProjectWise iDesktop Integration")
{
// set connect property ??
}
当我想设置插件的连接属性时,就会出现问题,它应该看起来像这样。
addin.SetProperty(pDisp, vtProp, propVal);
但是我不知道在 SetProperty 参数 DISPID pDisp 和 VARTYPE vtProp 中放什么,以及 propVal...
dwDispID标识要设置的属性。此值通常由类向导提供。(但我在任何地方都没有找到这个)
vtProp指定要设置的属性的类型。有关可能的值,请参阅 COLEDispatchDriver::InvokeHelper 的"备注"部分。这会VT_BOOL?
普罗普瓦尔将是错误的
欢迎任何建议。
铌。似乎有 3 种不同的方法来自动化 Word - 我尝试使用的一种是第 3 种 - 这应该是最简单的,但似乎也是记录最差的。
- 使用 #import 指令和智能指针自动执行 Word
- 使用 C++ 和 COM API 自动执行 Word
- 使用 MFC 自动执行单词
(这是MSWord 2010和Visual Studio 2013)
是的,AddIns 是一个对象。
它具有您可以使用的成员计数和项目。 我想它也支持 IEnumerable,这意味着您可以枚举加载项。
但是,根据 Count 成员(可能是 C++ 中的 get_Count())和 Item (可能是 get_Item(),您应该能够访问所需的加载项。
要启用/禁用插件,您应该使用 Connect 属性,您是否没有接收 BOOL 的put_Connect?
这里的问题是我有错误的Addin对象 - Word库中有一个卡丁(MSWORD。OLB )和 Office Library (MSO.DLL) 中的 CCOMaddin,正如 João 指出的那样,我需要第二个。
请注意,当通过 Typelib Wizard(从 Typelib 向导添加类)获取对象时,您必须注释掉每个 .h 文件顶部的 #import 行,否则会导致数百个编译错误。
// #import "C:\Program Files (x86)\Microsoft Office\Office14\MSWORD.OLB" no_namespace
以下代码将启动 word,禁用特定加载项,打开 Word 文件并将其另存为 pdf,然后重新启用加载项并关闭文件和 Word。
#include "CApplication.h"
#include "CDocuments.h"
#include "CDocument0.h"
#include "CCOMAddin.h"
#include "CCOMAddins.h"
// START WORD
CApplication word;
if (!word.CreateDispatch(_T("Word.Application")))
{
return 1;
}
word.put_Visible(true);
// disable PW i Word to allows us to save to PDF
CCOMAddIns addins = word.get_COMAddIns();
CCOMAddIn addin;
for (short i = 1; i < addins.get_Count(); i++)
{
addin = addins.Item(COleVariant((short)i));
CString name = addin.get_Description(); // changed from get_name
if (name == L"ProjectWise iDesktop Integration")
{
// We found our addin - switch it off
addin.put_Connect (false);
break;
}
}
// get the document list.
CDocuments docs(word.get_Documents());
COleVariant varOPt(DISP_E_PARAMNOTFOUND, VT_ERROR); // unused param
// Open a Word doc
CComVariant Filename = _T("C:\TEMP\PW_PDF_TEST.DOC");
// OPEN the file
CDocument0 doc = docs.Open(&Filename, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt);
CComVariant PDFname = _T("C:\TEMP\PW_PDF_TEST.PDF");
CComVariant PDFformat = 17;
// Save as PDF
doc.SaveAs(&PDFname, &PDFformat, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt, varOPt);
// reenable the addin
addin.put_Connect(true);
addins.DetachDispatch(); // - release objects
addin.DetachDispatch(); // - I don't know if this is necessary
// Close Document
doc.Close(varOPt, varOPt, varOPt);
// Exit Word
word.Quit(varOPt, varOPt, varOPt);
我试图理解 Word 自动化变得更加困难,因为至少有三种不同的方法可以做到这一点,而且我的搜索不断返回相关但不相关的信息。
免責聲明。我和C++只有一点点
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 使用内存地址访问结构的属性值
- C++调用具有 *this 属性的单个帮助程序函数
- C++ 在堆栈中包含多态属性的类对象存储
- C++ 命名参数习惯用语 - 未设置字符串属性
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?