来自VBA的IFileOpenDialog和IFileSaveDialog

mwo*_*e02 3 winapi vba windows-7

你如何从VBA调用IFileOpenDialog和IFileSaveDialog?

根据Microsoft的说法,为Windows 7及更高版本编写的应用程序应使用IFileOpenDialog/IFileSaveDialog API调用而不是GetOpenFileName/GetSaveFileName(请参阅使用公共文件对话框).这对于完整的图书馆支持尤为重要.

nit*_*one 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依赖项.

他们肯定不会轻松...... :)祝你好运!