gpt4 book ai didi

c++ - Word 自动化 - 另存为

转载 作者:太空狗 更新时间:2023-10-29 22:53:09 29 4
gpt4 key购买 nike

我尝试编写一个简单的 MFC - Word Automation 以每 1 分钟保存一次。我关注这篇文章:http://www.codeproject.com/KB/office/MSOfficeAuto.aspx

这就是我要实现的,我是 COM 的新手,所以我认为这里有问题:我的 VBA 是由 Word 2010 生成的:

ActiveDocument.SaveAs2 FileName:="1.docx", FileFormat:=wdFormatXMLDocument _
, LockComments:=False, Password:="", AddToRecentFiles:=True, _
WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False, CompatibilityMode:=14

我的代码实现上面的 VBA 代码:

{
COleVariant varName(L"b.docx");
COleVariant varFormat(L"wdFormatXMLDocument");
COleVariant varLockCmt((BYTE)0);
COleVariant varPass(L"");
COleVariant varReadOnly((BYTE)0);
COleVariant varEmbedFont((BYTE)0);
COleVariant varSaveNativePicFormat((BYTE)0);
COleVariant varForms((BYTE)0);
COleVariant varAOCE((BYTE)0);
VARIANT x;
x.vt = VT_I4;
x.lVal = 14;
COleVariant varCompability(&x);;

VARIANT result;
VariantInit(&result);
_hr=OLEMethod( DISPATCH_METHOD, &result, pDocApp, L"SaveAs2",10,
varName.Detach(),varFormat.Detach(),varLockCmt.Detach(),varPass.Detach(),varReadOnly.Detach(),
varEmbedFont.Detach(),varSaveNativePicFormat.Detach(),varForms.Detach(),varAOCE.Detach(),varCompability.Detach()
);
}

我没有从这个中得到任何错误,但它不起作用。

最佳答案

VBA 语法使用命名参数,其中参数的顺序和数量无关紧要。但是,当从 C++ 调用时,您需要以正确的顺序传递所需数量的参数。

SaveAs2 定义为:

void SaveAs2(
ref Object FileName,
ref Object FileFormat,
ref Object LockComments,
ref Object Password,
ref Object AddToRecentFiles,
ref Object WritePassword,
ref Object ReadOnlyRecommended,
ref Object EmbedTrueTypeFonts,
ref Object SaveNativePictureFormat,
ref Object SaveFormsData,
ref Object SaveAsAOCELetter,
ref Object Encoding,
ref Object InsertLineBreaks,
ref Object AllowSubstitutions,
ref Object LineEnding,
ref Object AddBiDiMarks,
ref Object CompatibilityMode
)

因此,它有 17 个参数,这意味着如果您要传递 CompatibilityMode,则应指定所有参数,在您的示例中将其指定为第 10 个参数(对应于 SaveFormsData)。

如果不需要所有参数,或者只是为了测试,可以尝试更简单的代码:

_hr = OLEMethod(DISPATCH_METHOD, &result, pDocApp, L"SaveAs2", 2, varName.Detach(), varFormat.Detach());

如果你需要其余的参数,你需要将所有参数传递到你需要设置的参数。在那种情况下,你可以通过

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

对于你不喜欢设置的参数。

编辑 - 测试代码

这对我有用:

    CoInitialize(NULL);

CLSID clsid;
IDispatch *pWApp;
HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pWApp);

hr = OLEMethod(DISPATCH_PROPERTYPUT, NULL, pWApp, L"Visible", 1, COleVariant((long)1));

VARIANT result;
VariantInit(&result);
hr = OLEMethod(DISPATCH_PROPERTYGET, &result, pWApp, L"Documents", 0);
IDispatch *pDocs = result.pdispVal;

VARIANT result2;
VariantInit(&result2);
hr = OLEMethod(DISPATCH_METHOD, &result2, pDocs, L"Open", 1, COleVariant(L"D:\\Archive\\t1.docx"));
IDispatch *pDoc = result2.pdispVal;

VARIANT result3;
VariantInit(&result3);
hr = OLEMethod(DISPATCH_METHOD, &result3, pDoc, L"SaveAs2", 1, COleVariant(L"D:\\Archive\\t2.docx"));

CoUninitialize();

关于c++ - Word 自动化 - 另存为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2971275/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com