Главная / FAQ по Builder'у / 58 При использовании функции...

58 При использовании функции SHBrowseForFolder не могу подключить shlobj.h как include. Что делать?


1-й способ


/*ShellHelper.h*/
#ifndef SHELL_HELPRER_H
#define SHELL_HELPRER_H
#include <windows.h>
#ifdef __DLL__
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

BOOL EXPORT GetFolder(
    LPCTSTR szTitle,
    LPTSTR szPath,
    LPCTSTR szRoot=NULL,
    HWND hWndOwner=NULL);
#endif
/*ShellHelper.h end*/
//--------------------------------------------------------------------------
---------------------------------------
/*ShellHelper.cpp */
#include <windows.h>
#include <atl\atlbase.h>
#include <shlobj.h>
#include "ShellHelper.h"
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 GetFolder (LPCTSTR szTitle, LPTSTR szPath, LPCTSTR 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.lParam    = LPARAM(szPath);

        // установка корневого каталога
        if (szRoot != NULL) {
            IShellFolder *pDF;
            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;
}
/*ShellHelper.cpp end*/
Пример.
#include "ShellHelper.h"
.......
char path[MAXPATH];
if ( GetFolder("Type here text for display in
caption",path,"",this->Handle ) ) {
    // code here
}
Igor Azarny

2-й способ

Продифайнить для проекта NO_WIN32_LEAN_AND_MEAN
Vladimir Ulchenko
----
*Примечание сост.: "продифайнить" значит #define NO_WIN32_LEAN_AND_MEAN

3-й способ

Подключить так:
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
#include <vcl.h>
Maksim Pozdeyev 2:5090/67.6

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz