SHMultiFilePropertiesはエクスプローラなどでファイルやフォルダのプロパティを表示するためのAPIで、複数のファイルなどを選択した状態でも利用できるものだ。
ここではこのSHMultiFilePropertiesを利用して1つのファイルやフォルダのプロパティを表示した。複数選択時のプロパティの表示方法は...よくわからなかったので現在調査中。
#include "atlstr.h"
#include "shlobj.h"
//
// ファイルのプロパティを表示する
//
bool ShowPropertyDialog(LPCTSTR pszPath)
{
LPITEMIDLIST pItemIdList;
IShellFolder* pIShellFolder;
IDataObject* pIDataObject;
HRESULT hr;
ULONG nAttribute;
hr = ::SHGetDesktopFolder(&pIShellFolder);
if(FAILED(hr))
return false;
nAttribute = ::PathIsDirectory(pszPath) ? SFGAO_FOLDER : 0;
pItemIdList = NULL;
#ifdef UNICODE
hr = pIShellFolder->ParseDisplayName(NULL,NULL,pszPath,NULL,&pItemIdList,NULL);
#else
{
CAtlStringW ustrPath;
//簡単にUnicode変換
ustrPath = pszPath;
hr = pIShellFolder->ParseDisplayName(NULL,NULL,ustrPath.GetBuffer(0),NULL,&pItemIdList,&nAttribute);
}
#endif
if(SUCCEEDED(hr))
hr = pIShellFolder->GetUIObjectOf(NULL,1,(LPCITEMIDLIST*)&pItemIdList,IID_IDataObject,NULL,(void**)&pIDataObject);
if(SUCCEEDED(hr))
{
//この関数を複数のファイルのプロパティを表示できるように改造する場合は
//以下のコメントアウト処理をSHMultiFilePropertiesの前に実行する(KB330040)
//{
// LPITEMIDLIST pItemIdList;
// IDataObject* pIDataObject;
//
// hr = ::SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&pItemIdList);
// if(SUCCEEDED(hr))
// {
// hr = pIShellFolder->GetUIObjectOf(NULL,1,(LPCITEMIDLIST*)&pItemIdList,IID_IDataObject,NULL,(void**)&pIDataObject);
// ::ILFree(pItemIdList);
// }
// pIDataObject->Release();
//}
hr = ::SHMultiFileProperties(pIDataObject,0);
pIDataObject->Release();
}
pIShellFolder->Release();
if(pItemIdList)
::ILFree(pItemIdList);
return SUCCEEDED(hr) ? true : false;
}
void Test(void)
{
::CoInitialize(NULL);
ShowPropertyDialog(_T("c:\\autoexec.bat"));
::MessageBox(NULL,_T("ダミーメッセージボックス"),_T(""),MB_OK);
::CoUninitialize();
}
