|
// *********************************************************
// アイテムを開く
// 引数に渡すのは処理用名称
// 稀に親ディレクトリの処理用名称を結合する必要がある
// 戻り値 : 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;
}
| |