* 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 );
}
|