单词 CAddin - 设置属性与C++

Word CAddin - SetProperty with C++

本文关键字:C++ 属性 设置 CAddin 单词      更新时间:2023-10-16

通过机器生成的 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 种 - 这应该是最简单的,但似乎也是记录最差的。

  1. 使用 #import 指令和智能指针自动执行 Word
  2. 使用 C++ 和 COM API 自动执行 Word
  3. 使用 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++只有一点点