来自VBA的IFileOpenDialog和IFileSaveDialog

时间:2009-12-15 14:36:18

标签: winapi vba windows-7

如何从VBA调用IFileOpenDialog和IFileSaveDialog?

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

1 个答案:

答案 0 :(得分:5)

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

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

他们肯定没那么容易...... :)祝你好运!