C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50429] Re:How to display local machine's storage drive only using BRWOSEINFO
imsome1 [] 1641 읽음    2007-08-31 15:27
* only using BRWOSEINFO
* Helped by Google + idea
* include shlwapi.lib in "c:\Program Files\Borland\CBuilder6\Lib\Psdk\"

<header>
// IMyFolderFilter
class IMyFolderFilter : public IFolderFilter
{
public:
    IMyFolderFilter( VOID );
public: // IUnknown implementation
    STDMETHOD( QueryInterface )( IN REFIID /*riid*/, IN OUT LPVOID* /*ppvObj*/ );
    STDMETHOD_( ULONG, AddRef )( VOID );
    STDMETHOD_( ULONG, Release )( VOID );
public: // IFolderFilter implementation
    STDMETHOD( ShouldShow )( IN IShellFolder* /*pIShellFolder*/, IN LPCITEMIDLIST /*pidlFolder*/, IN LPCITEMIDLIST IN /*pidlItem*/ );
    STDMETHOD( GetEnumFlags )( IN IShellFolder* /*pIShellFolder*/, IN LPCITEMIDLIST /*pidlFolder*/, IN HWND* /*phWnd*/, OUT LPDWORD /*pdwFlags*/ );
protected:
    ULONG    m_ulRef;
public:
    LPCTSTR        m_pszFilter;
};

<Cpp>
//---------------------------------------------------------------------------
#define   NO_WIN32_LEAN_AND_MEAN
#include   "shlobj.h"
#include   "shlwapi.h"
#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TGUID  TIID_IFolderFilterSite = {0xC0A651F5,0xB48B,0x11d2,{0xb5,0xed,0x00,0x60,0x97,0xc6,0x86,0xf6}};
TGUID  TIID_IFolderFilter = {0x9CC22886,0xDC8e,0x11d2,{0xb1,0xd0,0x00,0xc0,0x4f,0x8e,0xeb,0x3e}};
IMyFolderFilter    *m_pIMyFolderFilter = NULL;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
int __stdcall BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    Form1->Memo1->Lines->Add((int)hwnd);

    switch(uMsg)
    {
        case BFFM_INITIALIZED:
            break;
        case BFFM_IUNKNOWN:
            {
                if(m_pIMyFolderFilter) break;
                m_pIMyFolderFilter = new IMyFolderFilter;
                IUnknown* MyUnknown;
                IFolderFilterSite* pIFolderFilterSite = NULL;
                MyUnknown = (IUnknown*)lParam;
                MyUnknown->QueryInterface( TIID_IFolderFilterSite, (LPVOID*)&pIFolderFilterSite );
                pIFolderFilterSite->SetFilter((IUnknown*)m_pIMyFolderFilter);
            }
            break;
    }
    return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    BROWSEINFO BI;
    ZeroMemory((void *)&BI,sizeof(BI));
    char Displayname[256];

    BI.hwndOwner = Application->Handle;
    BI.pszDisplayName = Displayname;
    BI.lpszTitle  = "Browse";
    BI.ulFlags =  BIF_NEWDIALOGSTYLE
    BI.lpfn = BrowseCallbackProc;
    SHBrowseForFolder(&BI);
}

//---------------------------------------------------------------------------
// IMyFolderFilter
IMyFolderFilter::IMyFolderFilter( VOID )
               : m_ulRef( 0 )
               , m_pszFilter( NULL )
{
}
//---------------------------------------------------------------------------
STDMETHODIMP IMyFolderFilter::QueryInterface( IN     REFIID  riid,                                             IN OUT LPVOID* ppvObj )
{
    if( !ppvObj )
        return ( E_FAIL );

    HRESULT hResult = ( E_NOINTERFACE );
    *ppvObj = NULL;

    if( IsEqualIID( riid, IID_IUnknown ) )
        *ppvObj =  static_cast< IUnknown* >( this );
    else if( IsEqualIID( riid, TIID_IFolderFilter ) )
        *ppvObj =  static_cast< IFolderFilter* >( this );
   
    if( *ppvObj )
    {
        reinterpret_cast< IUnknown* >( *ppvObj )->AddRef();
        hResult = ( S_OK );
    }

    return ( hResult );
}
//---------------------------------------------------------------------------
STDMETHODIMP_( ULONG ) IMyFolderFilter::AddRef( VOID )
{
    return ::InterlockedIncrement( (PLONG)&m_ulRef );
}
//---------------------------------------------------------------------------
STDMETHODIMP_( ULONG ) IMyFolderFilter::Release( VOID )
{
    ULONG ulNewRef = ::InterlockedDecrement( (PLONG)&m_ulRef );
    if( ulNewRef == 0 )
    {
        delete this;
        m_pIMyFolderFilter = NULL;
        return ( 0 );
    }

    return ( ulNewRef );
}
//---------------------------------------------------------------------------
STDMETHODIMP IMyFolderFilter::ShouldShow( IN IShellFolder* pIShellFolder,
                                                                         IN LPCITEMIDLIST /*pidlFolder*/,
                                                                         LPCITEMIDLIST pidlItem )
{
    LPCITEMIDLIST pidl[ 1 ] = { pidlItem };
    SFGAOF          ulAttr    = SFGAO_FOLDER  ;
    pIShellFolder->GetAttributesOf( 1, pidl, &ulAttr );

    if ( ( ulAttr & SFGAO_FOLDER   ) ==  SFGAO_FOLDER)     //SFGAO_FOLDER
    {
        STRRET  strRet  = { 0 };
        HRESULT hResult = pIShellFolder->GetDisplayNameOf(
            pidlItem, SHGDN_NORMAL | SHGDN_FORPARSING, &strRet);

        LPTSTR pszDisplayName = NULL;
        hResult = ::StrRetToStr( &strRet, pidlItem, &pszDisplayName );
        if(strcmp(pszDisplayName,"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}") == 0 || //My computer clsid
           GetDriveType(pszDisplayName)==DRIVE_FIXED)
        {
            Form1->Memo1->Lines->Add(pszDisplayName); //for test
            return ( S_OK );
        }
    }
    return S_FALSE;

}
//---------------------------------------------------------------------------
STDMETHODIMP IMyFolderFilter::GetEnumFlags( IN  IShellFolder*    /*pIShellFolder*/,       
                                                                            IN  LPCITEMIDLIST    /*pidlFolder*/,       
                                                                            IN  HWND*            /*phWnd*/,   
                                                                            OUT LPDWORD  pdwFlags )
{
    *pdwFlags = (DWORD)( SHCONTF_FOLDERS | SHCONTF_NONFOLDERS ); 
    return ( S_OK );
}

+ -

관련 글 리스트
50416 How to display local machine's storage drive only using BRWOSEINFO alex 1787 2007/08/30
50429     Re:How to display local machine's storage drive only using BRWOSEINFO imsome1 1641 2007/08/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.