출처 : http://www.indidev.net/forum/viewtopic.php?f=5&t=76

압축프로그램 만들때 꼭 만들어야 하는 기능이 "새 폴더" 만들기 기능입니다.

이 기능을 만드려고 (나를 포함한) 얼마나 많은 프로그래머들이 피눈물을 흘렸는지 ㅠ.ㅠ


인터넷에서 암만 "새 폴더 만들기" 로 검색해도 안나오는 이 기능을 어떻게 만드는지 간단히 소개하자면..


1. shell context 메뉴를 만들기 위해서 dll 만들어서 IContextMenu::QueryContextMenu() 구현하는건 잘 찾아 보면 많으니까 그거 보시면 되고,

2. 사용자가 "새 폴더" 만들기를 선택했을때 InvokeCommand() 에서 커맨드 받아서 처리하는 함수의 소스는 다음과 같습니다.


Code:
BOOL _CreateNewFolder(CString lpszPath, HWND hWndView, IShellView* pisv)
{
   if ( NULL == hWndView || NULL == pisv )
      return FALSE;

   LPITEMIDLIST pidlNew;
   LPITEMIDLIST pidlNewFolder;

   DWORD dwError = SHCreateDirectoryEx( hWndView, lpszPath, NULL );
   if ( ERROR_SUCCESS != dwError )
      return FALSE;

   pidlNew = ILCreateFromPath( lpszPath );
   if ( NULL == pidlNew )
      return FALSE;

   pidlNewFolder = ILFindLastID( pidlNew );
   if ( NULL == pidlNew )
   {
      ILFree( pidlNew );
      return FALSE;
   }

   SHChangeNotify(SHCNE_MKDIR, SHCNF_FLUSH, pidlNew, NULL);

   pisv->SelectItem( pidlNewFolder, SVSI_EDIT | SVSI_SELECT );

   ILFree( pidlNew );

   return TRUE;
}

IShellView 는 IObjectWithSite::SetSite() 에서 넘겨받은 포인터를 이용해서 구할 수 있습니다.


Posted by 띠깜
,