在C ++ MFC中使用Word自动化通过使用Typelib向导中的添加类创建的机器生成的IDispatch包装类,我可以使用
启动WordCApplication 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号 - 这应该是最简单的,但似乎也是记录最差的。
(这是MSWord 2010和Visual Studio 2013)
答案 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 ++相关的边缘人物