開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 ShellFolder
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

シェルエクステンションの勉強。

参考
フォルダの列挙
フォルダ内の情報の取得
ITEMIDLISTについての適当なまとめ

ShellFolder.cpp
#pragma comment(lib, "shlwapi.lib")
 
#include <tchar.h>
#include <Windows.h>
#include <ShlObj.h>
#include <Shlwapi.h>
 
// 関数プロトタイプ宣言
void Trace(LPCTSTR ptcFormat, ...);
 
// グローバル変数
 
//==============================================================================
int APIENTRY _tWinMain(
	HINSTANCE	hInstance,
	HINSTANCE	hPrevInstance,
	LPTSTR		lpCmdLine,
	int		nCmdShow)
{
	TCHAR			szDisplayName[256];
	IShellFolder		*pDesktopFolder;
	IShellFolder		*pShellFolder = NULL;
	IEnumIDList		*pEnumIdList = NULL;
	PIDLIST_RELATIVE	pidl = NULL;
	PITEMID_CHILD		pidlChild;
	STRRET			strret;
	ULONG			chEaten;
	HRESULT			hr;
 
	CoInitialize(NULL);
 
	// pDesktopFolder
	SHGetDesktopFolder(&pDesktopFolder);
 
	// pidl
	hr = pDesktopFolder->ParseDisplayName(NULL, NULL,
		_T("C:\\tmp"), &chEaten, &pidl, NULL);
	if (FAILED(hr)) {
		goto Exit;
	}
 
	// pShellFolder
	hr = pDesktopFolder->BindToObject(pidl, NULL, IID_PPV_ARGS(&pShellFolder));
	if (FAILED(hr)) {
		goto Exit;
	}
 
	// pEnumIdList
	if (pShellFolder->EnumObjects(NULL, SHCONTF_NONFOLDERS, &pEnumIdList) != S_OK) {
		goto Exit;
	}
	while (pEnumIdList->Next(1, &pidlChild, NULL) == S_OK) {
		pShellFolder->GetDisplayNameOf(pidlChild, SHGDN_NORMAL, &strret);
		StrRetToBuf(&strret, pidlChild, szDisplayName, _countof(szDisplayName));
		Trace(_T("%s\n"), szDisplayName);
		CoTaskMemFree(pidlChild);
	}
 
Exit:
	if (pEnumIdList) {
		pEnumIdList->Release();
	}
	if (pShellFolder) {
		pShellFolder->Release();
	}
	CoTaskMemFree(pidl);
	pDesktopFolder->Release();
	CoUninitialize();
	return 0;
}
 
void Trace(LPCTSTR ptcFormat, ...)
{
	va_list	args;
	TCHAR	atcBuf[512];
	int	iRet;
 
	va_start(args, ptcFormat);
	iRet = _vstprintf_s(atcBuf, ptcFormat, args);
	if (0 < iRet) {
		OutputDebugString(atcBuf);
	}
	va_end(args);
}
 
最終更新:2012年09月01日 16:45