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




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[cmstd]
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
24/04/20 02:53:42
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube