LboxShellUI


  EnumDesktop



  
// *********************************************************
// リストビューにデスクトップのアイテム一覧を表示
// 戻り値 : 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;
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ