IShellBrowser :: BrowseObject不被调用 [英] IShellBrowser::BrowseObject isn't called

查看:222
本文介绍了IShellBrowser :: BrowseObject不被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的应用程序中实现类资源管理器框架。这必须在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

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆