【问题标题】:How to prevent the running of auto macros when starting ms word in c++ automationc++自动化中启动ms word时如何防止自动宏的运行
【发布时间】:2016-03-18 10:54:02
【问题描述】:

我正在使用 C++ 为办公文件生成缩略图。我使用类似于此的自动化打开并保存文件:https://support.microsoft.com/en-us/kb/179494。由于文件很多,这需要很多时间,程序应该运行一整夜。

一切正常,除非文件包含一个甚至不存在的自动启动宏。

Sub AutoOpen()
    Application.Run ("stupidMacroWhichDoesntExist")
End Sub

在这种情况下,循环停止,并出现一条错误消息,指出无法执行宏。

当然,我已将信任中心中的宏设置设置为 -> 在不通知的情况下禁用所有宏

错误信息仍然出现

在 Excel 中,我可以通过以下方式防止这种情况:

objExcelApp.SetEnableEvents(false);

不幸的是,c++ 中的 application 这个词没有 SetEnableEvents 方法。我用谷歌搜索了很多,发现了很多 VB 代码来防止这种情况。主要是这样的:

objWord.WordBasic.DisableAutoMacros 1

但我在 c++ 中没有找到任何东西

非常感谢您的帮助。

【问题讨论】:

    标签: c++ visual-c++ ms-word


    【解决方案1】:

    我相信您正在寻找:

    WordApplication.AutomationSecurity = msoAutomationSecurityForceDisable
    

    信任中心设置不适用于使用自动化打开的文档。此属性及其 MsoAutomationSecurity 枚举对应于对象模型中的设置。

    FWIW WordBasic 方法也应该可以使用 C++。我不知道 C++ 语法,但对于 C#,我需要使用 PInvoke (GetType().InvokeMember) 直接与 IDispatch 通信(我认为这是正确的术语)。

    【讨论】:

    • 谢谢,但在 c++ 中,WordApplication 没有名为“AutomationSecurity”的成员。顺便说一句,我正在使用“msword8”IDispatch 包装类。
    • 为什么会有这么老的类型库?这真的老了,像 20 年。 AutomationSecurity 比这晚了十年。如果那是你必须去的地方,那么你别无选择,只能走 WordBasic 路线。
    • 整个程序的代码,几十万行,回溯到Windows 3.11甚至DOS。如果我更改为更新的库,则会导致对程序的其余部分进行重大更改和测试。
    • 那你别无选择......不幸的是,除了 C#,我对任何 C 语言一无所知。 C# 中的 PInvoke 示例代码对您有帮助吗? (下次您会记得在提问时提及您使用的是哪个库,对吧:-)?没有人喜欢浪费时间解决问题,却发现缺少关键信息!)
    【解决方案2】:

    我已经解决了。我正在备份实际的宏(word 文件夹中的 vbaData.xml 和 vbaProject.bin),将一个虚拟宏放入 word 文件中,通过自动化打开它并保存以生成缩略图。之后,我将备份的宏放回word文件中。 由于虚拟宏什么都不做,所以我可以放心,无论在原始宏中编程什么,我都不会执行任何操作。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2010-09-10
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多