FC2ブログ

ホーム > シェルインターフェース > ゴミ箱に捨てたファイルの復元

ゴミ箱に捨てたファイルの復元



シェルインターフェースを使用してゴミ箱に捨てたファイルに対して、コンテキストメニューのコマンド内容(以下の4つ)を実現する方法を解説します。


  1. ”undelete”(ファイルの復元)
  2. ”cut”(ファイルの切り取り)
  3. ”delete”(ファイルの削除)
  4. ”properties”(ファイルプロパティの表示)





それぞれのメニューコマンドを呼び出す関数です。

//ゴミ箱からファイルを復元します。
BOOL __stdcall _RestoreFromRecycleBin(HWND hWnd,LPCTSTR lpszPathName)
{
return _InvokeCommandInRecycleBin(hWnd,lpszPathName,_T("undelete"));
}

//ゴミ箱からファイルを切り取ります。
BOOL __stdcall _CutFromRecycleBin(HWND hWnd,LPCTSTR lpszPathName)
{
return _InvokeCommandInRecycleBin(hWnd,lpszPathName,_T("cut"));
}

//ゴミ箱からファイルを削除します。
BOOL __stdcall _DeleteFromRecycleBin(HWND hWnd,LPCTSTR lpszPathName)
{
return _InvokeCommandInRecycleBin(hWnd,lpszPathName,_T("delete"));
}

//ゴミ箱のファイルのプロパティを表示します。
BOOL __stdcall _FilePropertyInRecycleBin(HWND hWnd,LPCTSTR lpszPathName)
{
return _InvokeCommandInRecycleBin(hWnd,lpszPathName,_T("properties"));
}


コンテキストメニューを呼び出してゴミ箱に捨てたファイルに、引数のメニューコマンドを処理する関数です。

typedef IShellFolder2 FAR* LPSHELLFOLDER2;

//指定ファイル名にコンテキストメニューコマンドを実行します。
BOOL __stdcall _InvokeCommandInRecycleBin(HWND hWnd,LPCTSTR lpszPathName,LPCTSTR lpszCommand)
{
OleInitialize(NULL);

LPMALLOC pMalloc=NULL;
::SHGetMalloc(&pMalloc);

//SHELLFOLDER2ポインタの取得
LPSHELLFOLDER pDesktop =NULL;
LPITEMIDLIST pidlRecycleBin =NULL;
LPSHELLFOLDER2 pShellFolder2 =NULL;
BOOL bResult =FALSE;

if ((SUCCEEDED(::SHGetDesktopFolder(&pDesktop))) &&
(SUCCEEDED(::SHGetSpecialFolderLocation(hWnd,CSIDL_BITBUCKET,&pidlRecycleBin)))&&
(SUCCEEDED(pDesktop->BindToObject(pidlRecycleBin,NULL,IID_IShellFolder2,
(LPVOID*)&pShellFolder2))))
{
bResult=TRUE;
}

if (pidlRecycleBin) pMalloc->Free(pidlRecycleBin);
if (pDesktop) pDesktop->Release();
if (!bResult){
pMalloc->Release();
return FALSE;
}

//引数パス名ファイルのITEMIDLISTを取得して、
//ゴミ箱に存在するか検索します。

LPENUMIDLIST penumFiles;
LPITEMIDLIST pidl=NULL;
BOOL bFindItem=FALSE;
CStringA strPathNameA;

#ifdef _UNICODE
CStringW strW=lpszPathName;
strPathNameA=strW;
#else
strPathNameA=lpszPathName;
#endif _UNICODE

if (SUCCEEDED(pShellFolder2->EnumObjects(hWnd,
SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN,&penumFiles)))
{
while ((!bFindItem)&&(penumFiles->Next(1,&pidl,NULL)!=S_FALSE)){
int iSubItem=0;
BOOL bFindPath=FALSE;
BOOL bFindName=FALSE;
SHELLDETAILS sd={0};
CStringA strA;
CStringW strW;
while((!bFindPath)||(!bFindName))
{
if (FAILED(pShellFolder2->GetDetailsOf(pidl,iSubItem++,&sd))) break;
switch (sd.str.uType)
{
case STRRET_CSTR:
strA=(LPCSTR)sd.str.cStr;
break;
case STRRET_OFFSET:
strA=(LPCSTR)(((char*)pidl)+sd.str.uOffset);
break;
case STRRET_WSTR:
strW=sd.str.pOleStr;
strA=strW;
pMalloc->Free(sd.str.pOleStr);
break;
}
//ファイル名が一致した場合。
if ((!bFindName)&&(strA==::PathFindFileNameA(strPathNameA))) bFindName=TRUE;
//パス名が一致した場合。
if ((!bFindPath)&&(strA==strPathNameA.Left(strA.GetLength()))) bFindPath=TRUE;
}
if ((bFindPath)&&(bFindName)) bFindItem=TRUE;
else pMalloc->Free(pidl);
}
if (penumFiles) penumFiles->Release();
}
if (!bFindItem){
pMalloc->Release();
pShellFolder2->Release();
return FALSE;
}

//コンテキストメニュー内に、引数コマンド文字列が存在するかどうか確かめます。
bResult=FALSE;
LPCONTEXTMENU pCtxMenu = NULL;
if (SUCCEEDED(pShellFolder2->GetUIObjectOf(hWnd,1,(LPCITEMIDLIST *)&pidl,
IID_IContextMenu,NULL,(LPVOID*)&pCtxMenu)))
{
UINT uiCommand = 0;

HMENU hmenuCtx=::CreatePopupMenu();
pCtxMenu->QueryContextMenu(hmenuCtx,0,1,0x7FFF,CMF_NORMAL);

int iMenuMax=::GetMenuItemCount(hmenuCtx);

for (int iMenuPos=0;iMenuPos<iMenuMax;iMenuPos++)
{
TCHAR szMenuItem[128];
::GetMenuString(hmenuCtx,iMenuPos,szMenuItem,sizeof(szMenuItem),MF_BYPOSITION) ;

UINT uiID=::GetMenuItemID(hmenuCtx,iMenuPos);
if ((uiID==-1)||(uiID==0)){}
else{
char verb[MAX_PATH] ;
if (FAILED(pCtxMenu->GetCommandString(uiID-1,GCS_VERBA,NULL,verb,sizeof(verb))))
verb[0]=TCHAR('\0');
else if (::_tcsicmp(verb,lpszCommand)==0) uiCommand=uiID-1;
}
}

//引数コマンド文字列がメニューに存在する場合は、
//そのコマンドを実行します。

if ((UINT)-1 != uiCommand)
{
CMINVOKECOMMANDINFO cmi;
ZeroMemory(&cmi,sizeof(CMINVOKECOMMANDINFO));
cmi.cbSize =sizeof(CMINVOKECOMMANDINFO);
cmi.fMask =CMIC_MASK_FLAG_NO_UI;
cmi.hwnd =hWnd;
cmi.lpParameters =NULL;
cmi.lpDirectory =NULL;
cmi.lpVerb =MAKEINTRESOURCE(uiCommand);
cmi.nShow =SW_SHOWNORMAL;
cmi.dwHotKey =NULL;
cmi.hIcon =NULL;
if (SUCCEEDED(pCtxMenu->InvokeCommand(&cmi))) bResult=TRUE;
}
::DestroyMenu(hmenuCtx);
pCtxMenu->Release();
}
pShellFolder2->Release();
pMalloc->Free(pidl);
pMalloc->Release();

return bResult;
}



スポンサーサイト



コメント: 0

この記事へのコメント
ブログ著者にのみ知らせます。

Trackback+Pingback: 0

TrackBack URL for this entry
http://hiroshi0945.blog75.fc2.com/tb.php/66-e3cf1082
Listed below are links to weblogs that reference
ゴミ箱に捨てたファイルの復元 from マルチメディアファイルフォーマット

Home > シェルインターフェース > ゴミ箱に捨てたファイルの復元

タグクラウド
ブロとも申請フォーム

この人とブロともになる

ブロとも一覧

このページの先頭へ戻る