After some more findings, I found the below code working for me..
.h file:
#include "afxdlgs.h"
class CDlgEventHandler : public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDlgEventHandler>,
public IFileDialogEvents,
public IFileDialogControlEvents
{
public:
CDlgEventHandler();
~CDlgEventHandler();
BEGIN_COM_MAP(CDlgEventHandler)
COM_INTERFACE_ENTRY(IFileDialogEvents)
COM_INTERFACE_ENTRY(IFileDialogControlEvents)
END_COM_MAP()
STDMETHODIMP OnFileOk(IFileDialog* pfd);
STDMETHODIMP OnFolderChanging(IFileDialog* pfd, IShellItem* psiFolder);
STDMETHODIMP OnFolderChange(IFileDialog* pfd);
STDMETHODIMP OnSelectionChange(IFileDialog* pfd);
STDMETHODIMP OnShareViolation(IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse);
STDMETHODIMP OnTypeChange(IFileDialog* pfd);
STDMETHODIMP OnOverwrite(IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse);
STDMETHODIMP OnCheckButtonToggled(IFileDialogCustomize* pfdc, DWORD dwIDCtl, BOOL bChecked);
STDMETHODIMP OnItemSelected(IFileDialogCustomize* pfdc, DWORD dwIDCtl, DWORD dwIDItem);
STDMETHODIMP OnButtonClicked(IFileDialogCustomize* pfdc, DWORD dwIDCtl);
STDMETHODIMP OnControlActivating(IFileDialogCustomize* pfdc, DWORD dwIDCtl);
};
.cpp file:
CDlgEventHandler::CDlgEventHandler()
{
}
CDlgEventHandler::~CDlgEventHandler()
{
}
STDMETHODIMP CDlgEventHandler::OnFileOk ( IFileDialog* pfd )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnFolderChanging ( IFileDialog* pfd, IShellItem* psiFolder )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnFolderChange ( IFileDialog* pfd )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnSelectionChange ( IFileDialog* pfd )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnShareViolation (
IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnTypeChange ( IFileDialog* pfd )
{
ATLTRACE(">> OnTypeChange\n");
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnOverwrite (
IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnItemSelected (
IFileDialogCustomize* pfdc, DWORD dwIDCtl, DWORD dwIDItem )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnButtonClicked (
IFileDialogCustomize* pfdc, DWORD dwIDCtl )
{
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnCheckButtonToggled (
IFileDialogCustomize* pfdc, DWORD dwIDCtl, BOOL bChecked )
{
ATLTRACE(">> OnCheckButtonToggled, button ID: %u, checked?: %d\n", dwIDCtl, bChecked);
return S_OK;
}
STDMETHODIMP CDlgEventHandler::OnControlActivating (
IFileDialogCustomize* pfdc, DWORD dwIDCtl )
{
return S_OK;
}
How to call:
//my_dlg is the object of class derived from CFileDialog
CComObjectStackEx<cdlgeventhandler> cbk;
CComQIPtr<ifiledialogevents> pEvents = cbk.GetUnknown();
DWORD dwCookie;
CComQIPtr<ifiledialog> pDlg = my_dlg.GetIFileDialogCustomizePointer();
HRESULT hr = pDlg->Advise ( pEvents, &dwCookie );
bool bAdvised = SUCCEEDED(hr);
if (my_dlg.DoModal() != IDOK)
{
// Call Unadvise() to stop listening
if ( bAdvised )
pDlg->Unadvise ( dwCookie );
my_dlg.DestroyWindow();
return;
}
Regards,
Kalyani