Добрый день,
Как сделать так, чтобы SHBrowseForFolder указывал бы на какой либо каталог отличный от Мои Документы при открытии.
Например c:\My Folder
Спасибо
09.08.10 17:06: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, mumg, Вы писали:
M>Добрый день,
M>Как сделать так, чтобы SHBrowseForFolder указывал бы на какой либо каталог отличный от Мои Документы при открытии.
M>Например c:\My Folder
M>Спасибо
Посмотри описание структуры BROWSEINFO:
pidlRoot
A pointer to an item identifier list (PIDL) specifying the location of the root folder from which to start browsing. Only the specified folder and any subfolders that are beneath it in the namespace hierarchy will appear in the dialog box. This member can be NULL; in that case, the namespace root (the desktop folder) is used.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
"давно тут сидим"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// callbak for folder_browser
INT CALLBACK BrowsePathProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
{ TCHAR szDir[MAX_PATH];
static HWND hTitle;
switch(uMsg)
{
case BFFM_INITIALIZED:
if(((TCHAR*)pData)[strlen((char*)pData)-1]=='\\')
_tcsrchr((TCHAR*)pData,'\\')[0]=0;
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
break;
case BFFM_SELCHANGED:
if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir))
{
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);
}
break;
}
return 0;
}
BOOL BrowseForFolder(TCHAR *pszPath, HWND hWnd, TCHAR *pszTitle)
{
BROWSEINFO bi;
LPITEMIDLIST pil;
bi.hwndOwner = hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = pszPath;
bi.lpszTitle = pszTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowsePathProc;
bi.iImage = 0;
bi.lParam = (long)pszPath;
pil = SHBrowseForFolder(&bi);
if(pil)
{
SHGetPathFromIDList(pil, pszPath);
return TRUE;
}
return FALSE;
}
Здравствуйте, mumg, Вы писали:
M>Добрый день,
M>Как сделать так, чтобы SHBrowseForFolder указывал бы на какой либо каталог отличный от Мои Документы при открытии.
M>Например c:\My Folder
M>Спасибо
int CALLBACK Browse4FolderInitPathProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED) {
LPCTSTR pszInitialPath = reinterpret_cast< LPCTSTR >(lpData);
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, reinterpret_cast< LPARAM >(pszInitialPath));
}
return 0;
}
//...
BROWSEINFO bi;
bi.lpfn = &Browse4FolderInitPathProc;
bi.lParam = "C:\\MyFolder";
::SHBrowseForFolder(&bi);
Здравствуйте, CEMb, Вы писали:
CEM>"давно тут сидим"
CEM>
CEM>BOOL BrowseForFolder(TCHAR *pszPath, HWND hWnd, TCHAR *pszTitle)
CEM>{
...
CEM> pil = SHBrowseForFolder(&bi);
CEM> if(pil)
CEM> {
CEM> SHGetPathFromIDList(pil, pszPath);
CEM> return TRUE;
CEM> }
CEM> return FALSE;
CEM>}
CEM>
В этом коде есть memory leak:
SHBrowseForFolder
...
It is the responsibility of the calling application to call CoTaskMemFree to free the IDList returned by SHBrowseForFolder when it is no longer needed.