LboxShellUI


  EnumFolder



  
// *********************************************************
// リストビューに指定したフォルダのアイテム一覧を表示
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::EnumFolder(
	LboxListview *Lview, LboxString *LFolder )
{
	return LboxShellUI::EnumFolder(
		Lview,
		LFolder->szLboxString
	);
}
BOOL LboxShellUI::EnumFolder( LboxListview *Lview, LPTSTR lpFolder )
{
	HRESULT			hr;
	IShellFolder	*pDesktop;
	IShellFolder	*pFolder;
	IEnumIDList 	*pEnum;
	ULONG			pceltFetched;
	LPITEMIDLIST	pidlItem;
	LPITEMIDLIST	pidlFolder;
	STRRET			str;
    LPMALLOC		pMalloc;
	_bstr_t			Bstr;
	_bstr_t			Folder;
	Folder.operator = (lpFolder);

	Lview->Initialize();
	Lview->AddColumn( "" );
	Lview->AddColumn( "表示用名称" );
	Lview->AddColumn( "処理用名称" );

	// エラーメッセージクリア
	this->ErrMessage.SetChar( 0, 0 );

	if ( FAILED( SHGetMalloc( &pMalloc ) ) ) {
		this->ErrMessage.operator = (
			"メモリ処理のインターフェイス"
			"を取得できませんでした"
		);
		return false;
	}

	if ( lpFolder == NULL || *lpFolder == 0x00 ) {
		// デスクトップ取得
		hr = SHGetDesktopFolder( &pFolder );
		if ( FAILED( hr ) ) {
			pMalloc->Release();
			this->ErrMessage.operator = (
				"テスクトップオブジェクトを取得できませんでした"
			);
			return false;
		}
	}
	else {
		// デスクトップ取得
		hr = SHGetDesktopFolder( &pDesktop );
		if ( FAILED( hr ) ) {
			pMalloc->Release();
			this->ErrMessage.operator = (
				"テスクトップオブジェクトを取得できませんでした"
			);
			return false;
		}

		// フォルダの ITEMIDLIST
		pidlFolder = NULL;
		hr = pDesktop->ParseDisplayName(
			NULL,
			NULL,
			Folder,
			NULL,
			&pidlFolder,
			NULL
		);
		if ( pidlFolder == NULL ) {
			pDesktop->Release();
			pMalloc->Release();
			this->ErrMessage.operator = (
				"フォルダオブジェクトを取得できませんでした"
			);
			return false;
		}

		// フォルダオブジェクト
		hr = pDesktop->BindToObject(
					pidlFolder,
					NULL,
					IID_IShellFolder,
					(LPVOID*)&pFolder
				);
		if( FAILED( hr ) ) {
			pMalloc->Free( pidlFolder );
			pDesktop->Release();
			pMalloc->Release();
			this->ErrMessage.operator = (
				"フォルダオブジェクトを取得できませんでした"
			);
			return false;
		}

		pMalloc->Free( pidlFolder );
		pDesktop->Release();

	}

	// 列挙オブジェクト取得
	hr = pFolder->EnumObjects(
		NULL,
		SHCONTF_FOLDERS | 
		SHCONTF_NONFOLDERS |
		SHCONTF_INCLUDEHIDDEN,
		&pEnum
	);
	if( FAILED( hr ) ) {
		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 = pFolder->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 = pFolder->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();
	pFolder->Release();
	pMalloc->Release();

	Lview->Fit();

	return true;
}
  










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





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

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ