IFileOpenDialog и IFileSaveDialog из VBA - PullRequest
       21

IFileOpenDialog и IFileSaveDialog из VBA

3 голосов
/ 15 декабря 2009

Как вы вызываете IFileOpenDialog и IFileSaveDialog из VBA?

Согласно Microsoft, приложения, написанные для Windows 7 и более поздних версий, должны использовать вызовы API IFileOpenDialog / IFileSaveDialog вместо GetOpenFileName / GetSaveFileName (см. Использование диалога общего файла ). Это особенно важно для полной поддержки библиотеки.

1 Ответ

5 голосов
/ 21 декабря 2009

Краткий ответ: это, вероятно, не стоит усилий.

Более длинный ответ: интерфейсы CFD не расширяют IDispatch, что делает невозможным вызов через позднюю привязку из VBA. Это не означает, что они не могут быть вызваны из VBA, но это означает, что им требуется typelib для описания «формы» основанных на IUnknown интерфейсов CFD. К сожалению, Microsoft не предоставляет определения интерфейса CFD в библиотеке типов. Вы можете свернуть свою собственную библиотеку типов, перепроектировав файлы заголовков (или попытаться найти исходный IDL в SDK), но затем вам нужно будет зарегистрировать эту библиотеку типов на каждой машине, на которой вы хотите ее использовать (инструменты, для которых не поставляются на машине, в отличие от regsvr32 для COM вещи). Предполагая, что вы сделали все это, вы можете ссылаться на typelib из VBA и условно вызывать его в Vista или более поздних ОС. Вы также можете просмотреть небольшую сборку .NET, которая создаст тип, производный от System.Windows.Forms.FileDialog, и перенаправит результаты обратно в VBA, что будет намного проще, но все же более или менее требует регистрации. сборка на каждой машине (или использование C ++ / CLI или других хаков для экспорта управляемой функции DLL), и для этого требуется, чтобы вы взяли зависимость .NET.

Они, конечно, не сделали это легко ... :) Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...