Word CAddin - 使用C ++的SetProperty

时间:2015-03-09 15:20:37

标签: c++ mfc ms-word automation

在C ++ MFC中使用Word自动化通过使用Typelib向导中的添加类创建的机器生成的IDispatch包装类,我可以使用

启动Word
CApplication word;
word.CreateDispatch(_T("Word.Application")

并打开文档并将其另存为PDF。

不幸的是,我需要禁用捕获Save功能的Word插件,并阻止我保存为PDF。我应该能够通过将COMAddin对象的Connect属性设置为false来禁用它。我可以看到一个返回COMAddIns列表的函数。

CAddIns addins = word.get_COMAddIns();

我需要单步执行此数组并找到正确的Addin。

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 标识要设置的属性。该值通常由ClassWizard提供。 (但我没有在任何地方找到这个)

vtProp 指定要设置的属性的类型。有关可能的值,请参阅COleDispatchDriver :: InvokeHelper的“备注”部分。这将是VT_BOOL?

PROPVAL 会是假的

欢迎任何建议。

NB。自动化Word似乎有3种不同的方式 - 我试图使用的是3号 - 这应该是最简单的,但似乎也是记录最差的。

  1. 使用#import指令和智能指针自动化Word
  2. 使用C ++和COM API自动化Word
  3. 使用MFC自动化Word
  4. (这是MSWord 2010和Visual Studio 2013)

3 个答案:

答案 0 :(得分:0)

是的,AddIns是一个对象。

它具有您可以使用的成员Count和Item。我想它也支持IEnumerable,这意味着你可以枚举AddIns。

但是,基于Count成员,可能是C ++中的get_Count()和Item,可能是get_Item(),你应该可以进入你想要的AddIn。

答案 1 :(得分:0)

要启用/禁用插件,您应该使用Connect属性,难道您没有接收BOOL的put_Connect吗?

答案 2 :(得分:0)

这里的问题是我有错误的Addin对象 - 在Word库中有一个Caddin(MSWORD.OLB)和在Office库中有一个CCOMaddin(MSO.DLL),我需要第二个,因为João指出。

请注意,当从Typelib向导通过Add Class获取对象时,您必须在每个.h文件的顶部注释掉#import行,否则会导致数百个编译错误。

// #import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace

以下代码将启动单词,禁用特定插件,打开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 ++相关的边缘人物