開発環境 |
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