|
// *********************************************************
// リストビューにデスクトップのアイテム一覧を表示
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::EnumDesktop( LboxListview *Lview )
{
HRESULT hr;
IShellFolder *pDesktop;
IEnumIDList *pEnum;
ULONG pceltFetched;
LPITEMIDLIST pidlItem;
STRRET str;
LPMALLOC pMalloc;
_bstr_t Bstr;
Lview->Initialize();
Lview->AddColumn( "" );
Lview->AddColumn( "表示用名称" );
Lview->AddColumn( "処理用名称" );
// エラーメッセージクリア
this->ErrMessage.SetChar( 0, 0 );
if ( FAILED( SHGetMalloc( &pMalloc ) ) ) {
this->ErrMessage.operator = (
"メモリ処理のインターフェイス"
"を取得できませんでした"
);
return false;
}
// デスクトップ取得
hr = SHGetDesktopFolder( &pDesktop );
if ( FAILED( hr ) ) {
pMalloc->Release();
this->ErrMessage.operator = (
"テスクトップオブジェクトを取得できませんでした"
);
return false;
}
// 列挙オブジェクト取得
hr = pDesktop->EnumObjects(
NULL,
SHCONTF_FOLDERS |
SHCONTF_NONFOLDERS |
SHCONTF_INCLUDEHIDDEN,
&pEnum
);
if( FAILED( hr ) ) {
pMalloc->Release();
pDesktop->Release();
this->ErrMessage.operator = (
"列挙オブジェクトを取得できませんでした"
);
return false;
}
LboxString LName;
int nCount;
pidlItem = NULL;
nCount = 1;
LName.Resize( MAX_PATH );
while( 1 ) {
hr = pEnum->Next( 1, &pidlItem, &pceltFetched );
if( FAILED( hr ) ) {
break;
}
if ( pceltFetched == 0 ) {
break;
}
hr = pDesktop->GetDisplayNameOf(
pidlItem,
SHGDN_NORMAL,
&str
);
if( FAILED( hr ) ) {
pMalloc->Free( pidlItem );
pidlItem = NULL;
continue;
}
// 行を追加
Lview->AddRow();
Lview->SetColumnPrintf( 0, "%d", nCount );
nCount++;
switch( str.uType ) {
case STRRET_WSTR:
Bstr.operator = (str.pOleStr);
LName.operator = ((LPTSTR)Bstr);
pMalloc->Free( str.pOleStr );
break;
case STRRET_CSTR:
lstrcpyn(
LName.szLboxString,
str.cStr,
MAX_PATH
);
break;
default:
lstrcpyn(
LName.szLboxString,
(LPTSTR)pidlItem + str.uOffset,
MAX_PATH
);
break;
}
// 名称1をセット
Lview->SetColumnText( 1, &LName );
hr = pDesktop->GetDisplayNameOf(
pidlItem,
SHGDN_FORPARSING,
&str
);
if( FAILED( hr ) ) {
pMalloc->Free( pidlItem );
pidlItem = NULL;
continue;
}
switch( str.uType ) {
case STRRET_WSTR:
Bstr.operator = (str.pOleStr);
LName.operator = ((LPTSTR)Bstr);
pMalloc->Free( str.pOleStr );
break;
case STRRET_CSTR:
lstrcpyn(
LName.szLboxString,
str.cStr,
MAX_PATH
);
break;
default:
lstrcpyn(
LName.szLboxString,
(LPTSTR)pidlItem + str.uOffset,
MAX_PATH
);
break;
}
// 名称2をセット
Lview->SetColumnText( 2, &LName );
pMalloc->Free( pidlItem );
pidlItem = NULL;
}
pEnum->Release();
pDesktop->Release();
pMalloc->Release();
Lview->Fit();
return true;
}
| |