|
|
// *********************************************************
// コンストラクタ
// *********************************************************
#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)
{
}
}
| |
|
|
|
|
// *********************************************************
// リストビューにデスクトップのアイテム一覧を表示
// 戻り値 : 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;
}
| |
|
|
|
|
// *********************************************************
// リストビューに指定したフォルダのアイテム一覧を表示
// 戻り値 : 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;
}
| |
|
|
|
|
// *********************************************************
// アイテムを開く
// 引数に渡すのは処理用名称
// 稀に親ディレクトリの処理用名称を結合する必要がある
// 戻り値 : 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;
}
| |
|
|
|
|
#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;
}
| |
|
|
|
|
// *********************************************************
// ファイル名を指定して実行ダイアログの呼び出し
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// 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);
}
| |
|
|
|
|
// *********************************************************
// ファイルの検索ダイアログ
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// ヘルプダイアログ
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// デスクトップを表示
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// デスクトップを表示を元に戻す
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// シャットダウンダイアログを表示
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// タスクバーのプロパティダイアログを表示
// 戻り値 : 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);
}
| |
|
|
|
|
// *********************************************************
// 日付と時刻プロパティダイアログを表示
// 戻り値 : 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);
}
| |
|
|
|