#include <Shlobj.h> #include <Shlwapi.h> int main() { HRESULT result = NULL; result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (result != S_OK) return 1; IShellFolder *pShellFolder; SHGetDesktopFolder(&pShellFolder); IShellFolder2 *pShellFolder2; result = pShellFolder->QueryInterface(IID_PPV_ARGS(&pShellFolder2)); if (result != S_OK) return 1; for (int i = 0;; i++) { SHELLDETAILS details; result = pShellFolder2->GetDetailsOf(NULL, i, &details); if (result != S_OK) break; TCHAR header[256]; StrRetToBuf(&details.str, NULL, header, sizeof(header) / sizeof(TCHAR)); wprintf(L"%d:%s\n", i, header); } pShellFolder2->Release(); pShellFolder->Release(); CoUninitialize(); return 0; }
HRESULT GetDetailsOf( [in] PCUITEMID_CHILD pidl, [in] UINT iColumn, // 取得対象の情報フィールドのインデックス [out] SHELLDETAILS *psd );IShellFolder2::GetDetailsOf method (Windows) | MSDN
iColumnのインデックス番号は、エクスプローラの詳細表示での表示順に対応します。このうちシステム フォルダは下表の項目に加え、基本的な項目を持ちます。
インデックス | 名前 |
---|---|
0 | Name |
1 | Size |
2 | Type |
3 | Date Modified |
一方仮想フォルダは、それぞれ独自の項目を持ちます。
STRRETからLPTSTRへの変換は、StrRetToBuf()で行えます。
HRESULT StrRetToBuf( _Inout_ STRRET *pstr, _In_ PCUITEMID_CHILD pidl, _Out_ LPTSTR pszBuf, _In_ UINT cchBuf );StrRetToBuf function (Windows) | MSDN
#import "shell32.dll" \ rename("ShellExecute", "__ShellExecute") int main() { HRESULT result = NULL; result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); if (result != S_OK) return 1; LPCTSTR path = L"C:\\sample"; Shell32::IShellDispatchPtr pShell; result = pShell.CreateInstance(__uuidof(Shell32::Shell)); if (result != S_OK) return 1; Shell32::FolderPtr pFolder = pShell->NameSpace(path); int headersCount = 0; for (;; headersCount++) { BSTR header = pFolder->GetDetailsOf(NULL, headersCount); if (*header == NULL) break; wprintf(L"%s\n", header); } Shell32::FolderItemsPtr pItems = pFolder->Items(); for (int i = 0; i<pItems->Count; i++) { const _variant_t vIndex((short)i); Shell32::FolderItemPtr pItem = pItems->Item(vIndex); for (int k = 0; k < headersCount; k++) { const _variant_t vItem((IDispatch*)pItem); BSTR property = pFolder->GetDetailsOf(vItem, k); wprintf(L"%d:%s\n", k, property); } pItem.Release(); } pItems.Release(); pFolder.Release(); pShell.Release(); CoUninitialize(); return 0; }
HRESULT CreateInstance( const CLSID& rclsid, IUnknown* pOuter=NULL, DWORD dwClsContext = CLSCTX_ALL ) throw( );_com_ptr_t::CreateInstance | MSDN