- Joined
- Mar 15, 2006
- Messages
- 451
- Reaction score
- 285
PHP:
#include <windows.h>
#include <atlbase.h>
#include <shlobj.h>
#pragma comment(lib,"shell32")
BOOL GetFolderW(LPCWSTR szTitle,LPWSTR szPath,LPWSTR szRoot=0,HWND hWndOwner=0);
void GetDirFileListW(const wchar_t *wszDir, const wchar_t *wszMask, vector<wstring>& rFileList);
//BOOL GetFolderW(LPCWSTR szTitle, LPWSTR szPath, LPWSTR szRoot=0, HWND hWndOwner=0);
static int CALLBACK
BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
TCHAR szPath[_MAX_PATH];
switch (uMsg)
{
case BFFM_INITIALIZED:
if (lpData)
SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData);
break;
case BFFM_SELCHANGED:
SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath);
SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath));
break;
}
return 0;
}
BOOL GetFolderW(LPCWSTR szTitle, LPWSTR szPath, LPWSTR szRoot, HWND hWndOwner)
{
if (szPath == NULL)
return false;
bool result = false;
LPMALLOC pMalloc;
if (::SHGetMalloc(&pMalloc) == NOERROR)
{
BROWSEINFO bi;
::ZeroMemory(&bi,sizeof bi);
bi.ulFlags = BIF_RETURNONLYFSDIRS;
// дескриптор окна-владельца диалога
bi.hwndOwner = hWndOwner;
// добавление заголовка к диалогу
bi.lpszTitle = szTitle;
// отображение текущего каталога
bi.lpfn = BrowseCallbackProc;
bi.ulFlags |= BIF_STATUSTEXT;
bi.ulFlags |= BIF_USENEWUI;//BIF_NEWDIALOGSTYLE;
// установка каталога по умолчанию
bi.lParam = LPARAM(szPath);
// установка корневого каталога
if (szRoot != NULL)
{
IShellFolder *pDF;
CoInitialize(NULL);
if (SHGetDesktopFolder(&pDF) == NOERROR)
{
LPITEMIDLIST pIdl = NULL;
ULONG chEaten;
ULONG dwAttributes;
USES_CONVERSION;
LPOLESTR oleStr = T2OLE(szRoot);
pDF->ParseDisplayName(NULL,NULL,oleStr,&chEaten,&pIdl,&dwAttributes);
pDF->Release();
bi.pidlRoot = pIdl;
}
}
LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);
if (pidl != NULL)
{
if (::SHGetPathFromIDList(pidl,szPath))
result = true;
pMalloc->Free(pidl);
}
if (bi.pidlRoot != NULL)
pMalloc->Free((void *)bi.pidlRoot);
pMalloc->Release();
}
return result;
}
void GetDirFileListW(const wchar_t *wszDir, const wchar_t *wszMask, vector<wstring>& rFileList)
{
WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
wchar_t DirSpec[MAX_PATH];
wsprintfW(DirSpec, L"%s\\%s", wszDir, wszMask);
hFind = FindFirstFile(DirSpec, &ffd);
if (hFind == INVALID_HANDLE_VALUE)
return;
do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
continue;
//if(strcmp(ffd.cFileName,".") == 0)
// continue;
//if(strcmp(ffd.cFileName,"..") == 0)
// continue;
//char NewDir[MAX_PATH];
//sprintf(NewDir, "%s\\%s", szDir, ffd.cFileName);
//ListFilesInDir(NewDir);
//continue;
}
wchar_t File[MAX_PATH];
wsprintfW(File, L"%s\\%s", wszDir, ffd.cFileName);
// dwFileCnt++;
rFileList.push_back(File);
}
while (FindNextFile(hFind, &ffd) != 0);
FindClose(hFind);
}