방법 1)
브라우저에서 "다운로드 받은 파일 보기" 와 같은걸 사용하면 해당 폴더를 열어주고

다운로드 받은 파일을 자동으로 선택해 줍니다.


이 기능을 구현하기 위해서 사용하는 api 는 SHOpenFolderAndSelectItems 인데

2000은 안되고 xp 부터만 사용이 가능할 뿐만 아니라 PIDL 을 사용해야 되기 때문에 

사용 방법도 복잡합니다.


그런데 보니까 explorer 커맨드 라인 명령에 /select 라는게 있었네요.

http://support.microsoft.com/kb/152457



커맨드 창에 아래처럼 입력을 해보면 setup.exe 가 자동으로 선택되어 있는걸 확인할 수 있습니다.

Code:

explorer /select,c:\down\setup.exe

예제)
예전에 사용했던 소스인데 약간 수정하였습니다.

void CEasyProcessDlg::OpenFolder(CString strPath)
{
char szWinDir[MAX_PATH]={0,}, szDrv[5]={0,}, szPath[MAX_PATH]={0,};
char szName[100], szExt[10];
CString strPath2;

strPath.TrimLeft("\\??\\");
strPath.TrimLeft("\\");

_splitpath((LPSTR)(LPCTSTR)strPath, szDrv, szPath, szName, szExt);

strPath2.Format("/select,%s", strPath);

ShellExecute(NULL, "open", "explorer.exe", strPath2, NULL, SW_SHOWNORMAL);
}


방법2)
구글링을 해도 SHOpenFolderAndSelectItems() 사용법이 제대로 나온곳이 없어서 
SHOpenFolderAndSelectItems() 를 사용하는 함수도 만들어 봤습니다. (버그가 있을찌도..)

그런데 SHOpenFolderAndSelectItems() 는 wine 에서 not implemented 에러를 토해내고 죽어 버리더군요. wine 도 고려하신다면 피해야 할듯.

Code:
ITEMIDLIST* IDListFromPath(LPCTSTR pathName)
{
   LPSHELLFOLDER   pDesktopFolder;
   HRESULT         hr = SHGetDesktopFolder(&pDesktopFolder);
   ITEMIDLIST      *pidl=NULL;

   if (FAILED(hr)) {ASSERT(0); return NULL;}

   OLECHAR olePath [MAX_PATH];

#ifdef _UNICODE
   lstrcpy(olePath, pathName);
#else
   MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszPath, -1, pathName, MAX_PATH);
#endif

   ULONG chEaten;
   ULONG dwAttributes;
   hr = pDesktopFolder->ParseDisplayName(NULL, NULL, olePath, &chEaten, &pidl, &dwAttributes);

   pDesktopFolder->Release();
   return pidl;
}

BOOL OpenFolderAndSelectItems(LPCTSTR filePathName)
{
   BOOL   ret = TRUE;

   ITEMIDLIST* pidlFile = IDListFromPath(filePathName);

   if(pidlFile==NULL || FAILED(SHOpenFolderAndSelectItems(pidlFile, 0, NULL, 0)))
   {ASSERT(0); ret = FALSE;}

   if(pidlFile) ::ILFree(pidlFile);

   return ret;
}


이렇게 사용하면 됩니다.

Code:
OpenFolderAndSelectItems(L"c:\\temp\\test.txt");

Posted by 띠깜
,