SHBrowseForFolder и предопределенный путь при открытии
От: mumg  
Дата: 09.08.10 12:53
Оценка:
Добрый день,

Как сделать так, чтобы SHBrowseForFolder указывал бы на какой либо каталог отличный от Мои Документы при открытии.
Например c:\My Folder

Спасибо

09.08.10 17:06: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re: SHBrowseForFolder и предопределенный путь при открытии
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 09.08.10 13:05
Оценка:
Здравствуйте, 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.: Винодельческие провинции — это есть рулез!
Re: SHBrowseForFolder и предопределенный путь при открытии
От: CEMb  
Дата: 09.08.10 15:49
Оценка:
"давно тут сидим"

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///  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;
}
Re: SHBrowseForFolder и предопределенный путь при открытии
От: Warturtle  
Дата: 09.08.10 16:09
Оценка:
Здравствуйте, 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);
Re[2]: SHBrowseForFolder и предопределенный путь при открыти
От: Юрий Жмеренецкий ICQ 380412032
Дата: 09.08.10 20:46
Оценка:
Здравствуйте, 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.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.