Vistaでは、従来のGetOpenFileName/GetSaveFileNameに代わってFile Dialogというものが導入されています。せっかくなので試してみました。
#console
Function GetSaveFileDialog() As String
Dim fd As IFileDialog
Dim hr = CoCreateInstance(
CLSID_FileSaveDialog, 0, CLSCTX_ALL,
IID_IFileDialog, fd)
If FAILED(hr) Then Exit Function
Try
hr = fd.Show(0)
If FAILED(hr) Then Exit Function
Dim si As IShellItem
hr = fd.GetResult(si)
If FAILED(hr) Then Exit Function
Dim psz As PWSTR
hr = si.GetDisplayName(SIGDN_FILESYSPATH, psz)
If FAILED(hr) Then Exit Function
GetSaveFileDialog = New String(psz)
Finally
fd.Release()
End Try
End Function
CoInitialize(0)
Print GetSaveFileDialog()
System.Console.ReadLine()
CoUninitialize()
とりあえず名前を付けて保存ダイアログを表示し、入力されたファイル名をコンソールにPrintしているだけです。
さて、ここで1つ重要なお知らせがあります。ABプログラムでは、通常IFileDialogを使う必要はありません。GetOpenFileName/GetSaveFileNameを直接呼ぶので、そのままでFile Dialogと同じ外観になります。なお、OFN_ENABLEHOOKを使うとだめになるので、そのときがやっとIFileDialogの出番です。
もしかしたら、そのうちGetOpenFileName/GetSaveFileNameをラップしたクラスを作るかもしれませんが、その際もVistaで新スタイルになるよう留意して製作します。もしダメだったら、Vistaではファイルダイアログを使うというコードを書きますけどね。
最後にこれに必要な宣言類を置いておきます。
Dim CLSID_FileSaveDialog = [&hC0B4E2F3, &hBA21, &h4773, [&h8D, &hBA, &h33, &h5E, &hC9, &h46, &hEB, &h8B]] As CLSID
Dim IID_IFileDialog = [&h42F85136, &hDB7E, &h439C, [&h85, &hF1, &hE4, &h07, &h5D, &h13, &h5F, &hC8]] As IID
Const Enum SIGDN
SIGDN_NORMALDISPLAY = 0
SIGDN_PARENTRELATIVEPARSING = &h80018001
SIGDN_DESKTOPABSOLUTEPARSING = &h80028000
SIGDN_PARENTRELATIVEEDITING = &h80031001
SIGDN_DESKTOPABSOLUTEEDITING = &h8004c000
SIGDN_FILESYSPATH = &h80058000
SIGDN_URL = &h80068000
SIGDN_PARENTRELATIVEFORADDRESSBAR = &h8007c001
SIGDN_PARENTRELATIVE = &h80080001
End Enum
TypeDef SFGAOF = DWord
TypeDef SICHINTF = DWord
Interface IShellItem
Inherits IUnknown
Function BindToHandler(
/* [unique][in] */ pbc As IBindCtx,
/* [in] */ ByRef bhid As GUID,
/* [in] */ ByRef riid As GUID,
/* [iid_is][out] */ ByRef ppv As Any) As HRESULT
Function GetParent(
/* [out] */ ByRef si As IShellItem) As HRESULT
Function GetDisplayName(
/* [in] */ sigdnName As SIGDN,
/* [string][out] */ ByRef pszName As LPWSTR) As HRESULT
Function GetAttributes(
/* [in] */ sfgaoMask As SFGAOF,
/* [out] */ ByRef sfgaoAttribs As SFGAOF) As HRESULT
Function Compare(
/* [in] */ si As IShellItem,
/* [in] */ hint As SICHINTF,
/* [out] */ ByRef iOrder As Long) As HRESULT
End Interface
Interface IModalWindow
Inherits IUnknown
Function Show(
/* [in] */ hwndParent As HWND) As HRESULT
End Interface
TypeDef COMDLG_FILTERSPEC = DWord
TypeDef FDAP = DWord
Interface IFileDialog
Inherits IModalWindow
Function SetFileTypes(
/* [in] */ cFileTypes As DWord,
/* [size_is][in] */ rgFilterSpec As * /*const*/ COMDLG_FILTERSPEC) As HRESULT
Function SetFileTypeIndex(
/* [in] */ iFileType As DWord) As HRESULT
Function GetFileTypeIndex(
/* [out] */ ByRef iFileType As DWord) As HRESULT
Function Advise(
/* [in] */ fde As IUnknown /*IFileDialogEvents*/,
/* [out] */ ByRef dwCookie As DWord) As HRESULT
Function Unadvise(
/* [in] */ dwCookie As DWord) As HRESULT
Function SetOptions(
/* [in] */ fos As DWord) As HRESULT
Function GetOptions(
/* [out] */ ByRef fos As DWord) As HRESULT
Function SetDefaultFolder(
/* [in] */ si As IShellItem) As HRESULT
Function SetFolder(
/* [in] */ si As IShellItem) As HRESULT
Function GetFolder(
/* [out] */ ByRef si As IShellItem) As HRESULT
Function GetCurrentSelection(
/* [out] */ ByRef si As IShellItem) As HRESULT
Function SetFileName(
/* [string][in] */ pszName As LPCWSTR) As HRESULT
Function GetFileName(
/* [string][out] */ ByRef pszName As LPWSTR) As HRESULT
Function SetTitle(
/* [string][in] */ pszTitle As LPCWSTR) As HRESULT
Function SetOkButtonLabel(
/* [string][in] */ pszText As LPCWSTR) As HRESULT
Function SetFileNameLabel(
/* [string][in] */ pszLabel As LPCWSTR) As HRESULT
Function GetResult(
/* [out] */ ByRef si As IShellItem) As HRESULT
Function AddPlace(
/* [in] */ si As IShellItem,
/* [in] */ fdap As FDAP) As HRESULT
Function SetDefaultExtension(
/* [string][in] */ pszDefaultExtension As LPCWSTR) As HRESULT
Function Close(
/* [in] */ hr As HRESULT) As HRESULT
Function SetClientGuid(
/* [in] */ ByRef guid As GUID) As HRESULT
Function ClearClientData() As HRESULT
Function SetFilter(
/* [in] */ Filter As IUnknown /*IShellItemFilter*/) As HRESULT
End Interface
スポンサード リンク |