スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

IShellFolder

随分長いこと更新を忘れていましたorz

プログラムのソースコードを載せようとすると
どうしても検証が必要で、それが億劫で更新を忘れてしまう……

なんか別のネタを考えなくては(;´-`)y-~~
(かといってセキュリティ関係とかはやっている方が多いからなあ~)



IShellFolderを使ったイメージの表示

XML をやる予定だったんですが
やる気がまったく起きなかっ(ry ので
ここからしばらく Shell Extension を扱っていこうと思います。

今回は「IShellFolder」が題材です。

こいつはファイルやフォルダを操作するインターフェイスで
比較的よく使われていると思います。
(……本当か?)

エクスプローラ周りのインターフェイスは込み入っていて
"ファイル名"ではなく"一意のID"(item identifier)よって管理されているため
ややこしく感じる人も多いとは思いますが
現在の Windows OS がほぼ COM で作られていることを考えると
慣れておいたほうが良いでしょう。

// エクスプローラ風のウインドウの作成。
// チョット改良して Shell Extension に関連付けられている
// イメージファイルをアイコンとして表示しています。
bool MainDialog::CreateThumbnailFolder(TCHAR* Path)
{
IMalloc* malloc;
IShellFolder* folder;
IShellFolder* item;
IEnumIDList* enumID;
ITEMIDLIST* object = NULL;
ITEMIDLIST* item_list = NULL;
DWORD fetch = 0;
DWORD eaten = 0;

// リストビュー内のアイテムの消去
...

// シェル用メモリ割り当て&開放
::SHGetMalloc(&malloc);
// デフォルトフォルダの取得
::SHGetDesktopFolder(&folder);
// 表示するフォルダのアイテム(item identifier)の取得
folder->ParseDisplayName(NULL, 0, Path, &eaten, &object, 0);
// IShellFolder にバインド
folder->BindToObject(object, 0, IID_IShellFolder,
reinterpret_cast<void**>(&item));
// IEnumIDList の取得
item->EnumObjects(NULL,
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
&enumID);

SIZE size = {32, 32};
// フォルダ内のアイテム(item identifier)の列挙
while(enumID->Next(1, &item_list, &fetch) == NOERROR)
{
/* Shell Extension に関連付けられたファイルのイメージを取得 */

// フルパス名の取得
TCHAR full_path[MAX_PATH + 1] = L"";
::SHGetPathFromIDList(item_list, full_path);

// IExtractImage の取得
IExtractImage* image;
HRESULT hr = item->GetUIObjectOf(NULL, 1,
const_cast<const ITEMIDLIST**>(&item_list),
IID_IExtractImage, 0,
reinterpret_cast<void**>(&image));

TCHAR path[MAX_PATH + 1] = L"";
DWORD flag = IEIFLAG_ASPECT | IEIFLAG_SCREEN;
HBITMAP hBmp = NULL;

if(hr == S_OK)
{
// ロケーションの設定
image->GetLocation(path, MAX_PATH, 0, &size, 32, &flag);

// イメージの取得
image->Extract(&hBmp);
}

if(hBmp != NULL)
{
// イメージリスト&リストビューにファイル名を追加~
...
}
else
{
/* イメージの取得が出来なかった場合、アイコンを表示 */

// IExtractIcon の取得
IExtractIcon* icon;
item->GetUIObjectOf(NULL, 1,
const_cast<const ITEMIDLIST**>(&item_list),
IID_IExtractIcon, 0,
reinterpret_cast<void**>(&icon));

// ロケーションの設定&インディックスの取得
UINT flag = 0;
int index = 0;
hr = icon->GetIconLocation(GIL_FORSHELL, path,
MAX_PATH, &index, &flag);

if(hr != S_OK) continue;

// アイコンイメージの取得(スモールアイコン使ってないけど……)
HICON icon_small = NULL, icon_large = NULL;
icon->Extract(path, index, &icon_large,
&icon_small, MAKELONG(32, 16));

if(icon_large != NULL)
{
// イメージリスト&リストビューにファイル名を追加~
...
}
// アイコンイメージの削除
::DestroyIcon(icon_small);
::DestroyIcon(icon_large);
}
// アイテム(item identifier)の開放
malloc->Free(item_list);
item_list = NULL;
}

// 後始末
malloc->Free(object);
malloc->Release();

return true;
}

さあ、例によってソースコードが長くなりました(笑)

今回はコメントを多めにしたので特に説明することもないでしょう。

せっかくなので実行可能なファイルを置きました。
http://www6.plala.or.jp/metatoron/files/ThumbnailFolder.zip
……ちなみにイメージリストの上限を255に設定しているので
それ以上のファイルが存在するフォルダを指定すると落ちます(爆)

次回は再び WMI In レジストリ編をお送りします(ぁ

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2005.12.17 | Comments(0) | Trackback(0) | プログラム

コメント

コメントの投稿


秘密にする

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。