2012-04-23 79 views
0

我試圖在我的應用程序中實現類似瀏覽器的框架。這也必須在WinXP下工作。IShellBrowser :: BrowseObject不叫

我在我的窗口類中實現了IShellBrowser +我實現了IUnknown接口。

我班atributs:

IShellViewPtr m_shView; 
HWND m_wndHolder; 
CListViewCtrl view; 

這裏是WM_CREATE處理

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 

後啓動應用程序時我對此非常類似瀏覽器框架的代碼。 我想處理雙擊事件,以瀏覽框架中的文件夾。我期望在雙擊我的BrowseObject後會被調用,但它不會發生。而不是在系統資源管理器中打開這個文件夾。

請幫忙。謝謝。

回答

0

我已經解決了這個問題。

首先你要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; 
    } 

你也需要在你的QueryInterface方法添加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應該罰款。