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