IShellBrowser :: BrowseObject不被调用 [英] IShellBrowser::BrowseObject isn't called
问题描述
我想在我的应用程序中实现类资源管理器框架。这必须在WinXP下工作。
我在我的窗口类中实现了 IShellBrowser
IUnknown
接口。
我的类别:
IShellViewPtr m_shView;
HWND m_wndHolder;
CListViewCtrl view;
下面是 WM_CREATE
/ p>
m_hWndClient = view.Create(m_hWnd,rcDefault,NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN ,WS_EX_CLIENTEDGE); // view is not null after it
CMessageLoop * pLoop = _Module.GetMessageLoop();
pLoop-> AddMessageFilter(this);
pLoop-> AddIdleHandler(this);
IShellFolderPtr pParentFolder;
ATLVERIFY(SHGetDesktopFolder(& pParentFolder)== S_OK); // OK
FOLDERSETTINGS fs;
fs.fFlags = FVM_DETAILS;
fs.ViewMode = FVM_LIST;
ATLVERIFY(pParentFolder-> CreateViewObject(view,IID_IShellView,(void **)& m_shView)== S_OK); // OK
RECT r;
GetClientRect(& r);
ATLVERIFY(m_shView-> CreateViewWindow(NULL,& fs,static_cast< IShellBrowser *>(this),& r,& m_wndHolder)== S_OK); // OK
ATLVERIFY(m_shView-> UIActivate(SVUIA_ACTIVATE_NOFOCUS)== S_OK); // OK
应用程序启动后,我有一个类似于浏览器的框架。
我想处理双击事件,以便浏览框架中的文件夹。我希望双击我的实现 BrowseObject
将被调用,但它没有发生。而不是在系统资源管理器中打开这些文件夹。
请帮助。谢谢。
我已解决问题。
首先你必须 IServiceProvider
接口如果你的类。实现应如下所示:
QueryService(REFGUID guidService,REFIID riid,void __RPC_FAR * __ RPC_FAR * ppvObject)
{
if(IID_IShellBrowser == riid)
{
* ppvObject = static_cast< IShellBrowser *>(this);
AddRef();
return S_OK;
}
* ppvObject = NULL;
return E_NOINTERFACE;
}
此外,您必须添加 IServiceProvider $ c
STDMETHOD(QueryInterface) (REFIID riid,__RPC__deref_out void __RPC_FAR * __ RPC_FAR * ppvObject)
{
if(!ppvObject)
return E_POINTER;
* ppvObject = NULL;
if(riid == IID_IShellBrowser)
* ppvObject = static_cast< IShellBrowser *>(this);
else if(riid == IID_IUnknown)
* ppvObject = static_cast< IUnknown *>(static_cast< IShellBrowser *>(this)
else if(riid == IID_IServiceProvider)
* ppvObject = static_cast< IServiceProvider *>(this);
if(* ppvObject)
{
AddRef();
return S_OK;
}
return E_NOTIMPL;
}
继承 IServiceProvider
,你不能使用 static_cast< IUnknown *>(this)
将类转换为 IUnknown
,所以你需要像我这样写。
之后 BrowseObject
>
I'm trying to implement explorer-like frame in my application. This must work under WinXP too.
I've implemented IShellBrowser
in my window-class + i've implemented IUnknown
interface.
My class atributs:
IShellViewPtr m_shView;
HWND m_wndHolder;
CListViewCtrl view;
Here is the code of WM_CREATE
handler
m_hWndClient = view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
WS_CLIPCHILDREN, WS_EX_CLIENTEDGE); // view isn't null after it
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
IShellFolderPtr pParentFolder;
ATLVERIFY(SHGetDesktopFolder(&pParentFolder) == S_OK); // OK
FOLDERSETTINGS fs;
fs.fFlags = FVM_DETAILS;
fs.ViewMode = FVM_LIST;
ATLVERIFY(pParentFolder->CreateViewObject(view, IID_IShellView, (void**)&m_shView) == S_OK); // OK
RECT r;
GetClientRect(&r);
ATLVERIFY(m_shView->CreateViewWindow(NULL, &fs, static_cast<IShellBrowser*>(this), &r, &m_wndHolder) == S_OK); // OK
ATLVERIFY(m_shView->UIActivate(SVUIA_ACTIVATE_NOFOCUS) == S_OK); // OK
After the application is started i have explorer-like frame in it.
I want to handle double click event in order to navigate through the folders in the frame. I expect that after double-clicking my implementation of BrowseObject
will be called, but it doesn't happened. Instead of this folders are opened in system explorer.
Please help. Thank you.
I've solved the problem.
First you have to IServiceProvider
interface if your class. Implementation should look like this:
QueryService( REFGUID guidService, REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject )
{
if (IID_IShellBrowser == riid)
{
*ppvObject = static_cast<IShellBrowser*>(this);
AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
Also you have to add IServiceProvider
support in your QueryInterface
method.
STDMETHOD (QueryInterface)( REFIID riid, __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject)
{
if (!ppvObject)
return E_POINTER;
*ppvObject = NULL;
if ( riid == IID_IShellBrowser )
*ppvObject = static_cast<IShellBrowser*>(this);
else if ( riid == IID_IUnknown )
*ppvObject = static_cast<IUnknown*>(static_cast<IShellBrowser*>(this));
else if ( riid == IID_IServiceProvider )
*ppvObject = static_cast<IServiceProvider*>(this);
if (*ppvObject)
{
AddRef();
return S_OK;
}
return E_NOTIMPL;
}
After you'll inherit IServiceProvider
, you can't cast you class to IUnknown
using just static_cast<IUnknown*>(this)
, so you need to write something like i did.
After that BrowseObject
should be called fine.
这篇关于IShellBrowser :: BrowseObject不被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!