LboxShellUI

  コンストラクタ



このクラスを使用する場合は、アプリケーションの開始処理に CoInitialize( NULL ) を実行し、
アプリケーションの終了処理に CoUninitialize( ) を実行して下さい

  
// *********************************************************
// コンストラクタ
// *********************************************************
#import "C:\WINDOWS\system32\SHELL32.dll"
Shell32::IShellDispatchPtr pShell = NULL;
LboxShellUI::LboxShellUI()
{
	this->MyComputer =
		"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}";
	this->MyNetwork =
		"::{208D2C60-3AEA-1069-A2D7-08002B30309D}";
	this->RecycleBin =
		"::{645FF040-5081-101B-9F08-00AA002F954E}";
	this->Printer =
		"::{2227A280-3AEA-1069-A2DE-08002B30309D}";
	this->ControlPanel =
		"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
		"\\"
		"::{21EC2020-3AEA-1069-A2DD-08002B30309D}";

	this->bError = false;

	try {
		if ( pShell == NULL ) {
			pShell.CreateInstance(L"Shell.Application");
		}
	}
	catch (_com_error &e)
	{
		this->ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
		this->ErrMessage.operator = (
			"Shell オブジェクトの作成に失敗しました"
		);
	}
}
// *********************************************************
// デストラクタ
// *********************************************************
LboxShellUI::~LboxShellUI()
{
	try {
		if ( pShell != NULL ) {
			pShell.Release();
			pShell = NULL;
		}
	}
	catch (_com_error &e)
	{
	}

}
  



  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;
}
  



  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;
}
  



  OpenItem

  
// *********************************************************
// アイテムを開く
// 引数に渡すのは処理用名称
// 稀に親ディレクトリの処理用名称を結合する必要がある
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::OpenItem( LboxString *LFolderItem )
{
	return LboxShellUI::OpenItem(
		LFolderItem->szLboxString
	);
}
BOOL LboxShellUI::OpenItem( LPTSTR lpFolderItem )
{
	HRESULT			hr;
	IShellFolder	*pDesktop;
	LPITEMIDLIST	pidlFolderItem;
    LPMALLOC		pMalloc;
	_bstr_t			FolderItem;

	if ( lpFolderItem == NULL || *lpFolderItem == 0x00 ) {
		_variant_t vDir;
		vDir.operator = ((short)0);
		this->bError = false;
		try {
			if ( pShell != NULL ) {
				pShell->Open(&vDir);
			}
		}
		catch (_com_error &e)
		{
			ComError.operator = ( (char *)(e.ErrorMessage()) );
			this->bError = true;
		}
		return !(this->bError);
	}

	FolderItem.operator = (lpFolderItem);

	// エラーメッセージクリア
	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;
	}

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

	pDesktop->Release();

	SHELLEXECUTEINFO	sei;
 
	// 呼び出しに必要な値のセット
	ZeroMemory(&sei, sizeof(sei));
	sei.cbSize     = sizeof(SHELLEXECUTEINFO);
	sei.fMask      = SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI;
	sei.lpIDList   = pidlFolderItem;
	sei.nShow      = SW_SHOWDEFAULT;
 
	ShellExecuteEx( &sei );

	pMalloc->Free( pidlFolderItem );
	pMalloc->Release();
	return true;

}
  



  OpenShellUI

たくさんありすぎて実装する時間がありません。
とりあえず、これだけ

  
#define LBOX_SHELLUI_DISPLAY_SCREENSAVER 1
#define LBOX_SHELLUI_DISPLAY_BACKGROUND 2
#define LBOX_SHELLUI_DISPLAY_SETTINGS 3
#define LBOX_SHELLUI_SYSTEM_GENERAL 11
#define LBOX_SHELLUI_ODBC 1001
// *********************************************************
// 目的別 RunDll の呼び出し
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::OpenShellUI( HWND hOwner, DWORD nType )
{
	switch( nType ) {
		case LBOX_SHELLUI_DISPLAY_SCREENSAVER:
			return LboxCallRundll(
				hOwner, "shell32.dll", "Control_RunDLL",
				"desk.cpl,,1"
			);
			break;
		case LBOX_SHELLUI_DISPLAY_BACKGROUND:
			return LboxCallRundll(
				hOwner, "shell32.dll", "Control_RunDLL",
				"desk.cpl,,0"
			);
			break;
		case LBOX_SHELLUI_DISPLAY_SETTINGS:
			return LboxCallRundll(
				hOwner, "shell32.dll", "Control_RunDLL",
				"desk.cpl,,3"
			);
			break;
		case LBOX_SHELLUI_SYSTEM_GENERAL:
			return LboxCallRundll(
				hOwner, "shell32.dll", "Control_RunDLL",
				"sysdm.cpl,,0"
			);
			break;
		case LBOX_SHELLUI_ODBC:
			return LboxCallRundll(
				hOwner, "shell32.dll", "Control_RunDLL",
				"odbccp32.cpl"
			);
			break;
	}

	this->ErrMessage.operator = (
		"パラメータが不正です"
	);
	return false;
}
  



  Shell32FileRun

  
// *********************************************************
// ファイル名を指定して実行ダイアログの呼び出し
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32FileRun( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->FileRun();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32FindComputer

  
// *********************************************************
// Find Computer Dialog
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32FindComputer( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->FindComputer();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32FindFiles

  
// *********************************************************
// ファイルの検索ダイアログ
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32FindFiles( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->FindFiles();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32Help

  
// *********************************************************
// ヘルプダイアログ
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32Help( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->Help();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32MinimizeAll

  
// *********************************************************
// デスクトップを表示
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32MinimizeAll( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->MinimizeAll();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32UndoMinimizeALL

  
// *********************************************************
// デスクトップを表示を元に戻す
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32UndoMinimizeALL( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->UndoMinimizeALL();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32ShutdownDialog

  
// *********************************************************
// シャットダウンダイアログを表示
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32ShutdownDialog( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->ShutdownWindows();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32TaskbarProperties

  
// *********************************************************
// タスクバーのプロパティダイアログを表示
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32TaskbarProperties( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->TrayProperties();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  



  Shell32SetTime

  
// *********************************************************
// 日付と時刻プロパティダイアログを表示
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxShellUI::Shell32SetTime( void )
{
	this->bError = false;

	try {
		if ( pShell != NULL ) {
			pShell->SetTime();
		}
	}
	catch (_com_error &e)
	{
		ComError.operator = ( (char *)(e.ErrorMessage()) );
		this->bError = true;
	}

	return !(this->bError);
}
  










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





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

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ