【问题标题】:IFileOpenDialog and IFileSaveDialog from VBAVBA 中的 IFileOpenDialog 和 IFileSaveDialog
【发布时间】:2010-12-26 20:15:24
【问题描述】:

如何从 VBA 中调用 IFileOpenDialog 和 IFileSaveDialog?

根据 Microsoft 的说法,为 Windows 7 及更高版本编写的应用程序应使用 IFileOpenDialog/IFileSaveDialog API 调用,而不是 GetOpenFileName/GetSaveFileName(请参阅Using the Common File Dialog)。这对于完整的库支持尤其重要。

【问题讨论】:

    标签: winapi vba windows-7


    【解决方案1】:

    简短的回答:这可能不值得努力。

    更长的答案:CFD 接口不扩展 IDispatch,这使得它们无法通过 VBA 的后期绑定调用。这并不意味着它们不能从 VBA 中调用,而是意味着它们需要一个类型库来描述基于 IUnknown 的 CFD 接口的“形状”。不幸的是,微软没有在类型库中提供 CFD 接口定义。您可以通过对头文件进行逆向工程来滚动您自己的类型库(或尝试在 SDK 中找到原始 IDL),但是您必须在每台要使用它的机器上注册该类型库(工具用于机器上没有发货,不像 regsvr32 用于 COM 的东西)。假设你做了所有这些,你可以从 VBA 中引用 typelib,并在 Vista 或更高版本的操作系统上有条件地调用它。您还可以填充到一个小的 .NET 程序集,该程序集将创建一个 System.Windows.Forms.FileDialog 派生类型并将结果编组回 VBA - 这会更容易,但或多或​​少需要您注册每台机器上的程序集(或使用 C++/CLI 或其他技巧来导出托管的 DLL 函数),并且它需要您采用 .NET 依赖项。

    他们确实没有让事情变得容易...... :) 祝你好运!

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2013-02-01
      • 2018-07-04
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多