ファイルやフォルダのプロパティを表示する

test93.gif

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();
}

プロジェクトファイルをダウンロード


カテゴリー「ファイル・フォルダ」 のエントリー