[SHELL32][SHELL32_WINETEST] Connect CDefViewDual to CDefView to fix crashes in the...
authorMark Jansen <mark.jansen@reactos.org>
Mon, 11 Apr 2016 18:28:31 +0000 (18:28 +0000)
committerMark Jansen <mark.jansen@reactos.org>
Mon, 11 Apr 2016 18:28:31 +0000 (18:28 +0000)
- CDefViewDual::get_Application now returns a new CDefView to fix the winetest.
- Update CFolder, CFolderItem(s), CFolderItemVerb(s), CShell to use the new IDispatchImpl
- Enable the last two skipped testcases (test_ShellFolderViewDual, test_ShellWindows)

svn path=/trunk/; revision=71144

reactos/dll/win32/shell32/CDefViewDual.cpp
reactos/dll/win32/shell32/CFolder.cpp
reactos/dll/win32/shell32/CFolder.h
reactos/dll/win32/shell32/CFolderItemVerbs.cpp
reactos/dll/win32/shell32/CFolderItemVerbs.h
reactos/dll/win32/shell32/CFolderItems.cpp
reactos/dll/win32/shell32/CFolderItems.h
reactos/dll/win32/shell32/CShell.cpp
reactos/dll/win32/shell32/CShell.h
reactos/dll/win32/shell32/wine/shell32_main.h
rostests/winetests/shell32/shelldispatch.c

index 03de2c3..bec7cf1 100644 (file)
@@ -46,9 +46,8 @@ class CDefViewDual :
         virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **app) override
         {
             if (!app) return E_INVALIDARG;
-            *app = NULL;
-            FIXME("CDefViewDual::get_Application is UNIMPLEMENTED (%p, %p)\n", this, app);
-            return E_NOTIMPL;
+
+            return CShell_Constructor(IID_IDispatch, (LPVOID*)app);
         }
 
         virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **parent) override
index 1d86b30..37f6499 100644 (file)
@@ -36,38 +36,30 @@ void CFolder::Init(LPITEMIDLIST idlist)
     m_idlist.Attach(idlist);
 }
 
-// *** IDispatch methods ***
-HRESULT STDMETHODCALLTYPE CFolder::GetTypeInfoCount(UINT *pctinfo)
+HRESULT CFolder::GetShellFolder(CComPtr<IShellFolder>& psfCurrent)
 {
-    TRACE("(%p, %p)\n", this, pctinfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolder::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
-{
-    TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
-    return E_NOTIMPL;
-}
+    CComPtr<IShellFolder> psfDesktop;
 
-HRESULT STDMETHODCALLTYPE CFolder::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
-{
-    TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
-    return E_NOTIMPL;
-}
+    HRESULT hr = SHGetDesktopFolder(&psfDesktop);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
 
-HRESULT STDMETHODCALLTYPE CFolder::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
-{
-    TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
-        pDispParams, pVarResult, pExcepInfo, puArgErr);
-    return E_NOTIMPL;
+    return psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent));
 }
 
-
 // *** Folder methods ***
 HRESULT STDMETHODCALLTYPE CFolder::get_Title(BSTR *pbs)
 {
-    TRACE("(%p, %p)\n", this, pbs);
-    return E_NOTIMPL;
+    if (!pbs)
+        return E_POINTER;
+
+    WCHAR path[MAX_PATH+2] = {0};
+    HRESULT hr = ILGetDisplayNameExW(NULL, m_idlist, path, ILGDN_INFOLDER);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    *pbs = SysAllocString(path);
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CFolder::get_Application(IDispatch **ppid)
@@ -97,15 +89,12 @@ HRESULT STDMETHODCALLTYPE CFolder::Items(FolderItems **ppid)
 HRESULT STDMETHODCALLTYPE CFolder::ParseName(BSTR bName, FolderItem **ppid)
 {
     TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid);
-
-    CComPtr<IShellFolder> psfDesktop;
-
-    HRESULT hr = SHGetDesktopFolder(&psfDesktop);
-    if (FAILED_UNEXPECTEDLY(hr))
-        return hr;
+    if (!ppid)
+        return E_POINTER;
+    *ppid = NULL;
 
     CComPtr<IShellFolder> psfCurrent;
-    hr = psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent));
+    HRESULT hr = GetShellFolder(psfCurrent);
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
index b510461..bfd5c9d 100644 (file)
 class CFolder:
     public CComCoClass<CFolder>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public Folder2
+    public IDispatchImpl<Folder2, &IID_Folder2>
 {
 private:
+    HRESULT GetShellFolder(CComPtr<IShellFolder>& psfCurrent);
+
     CComHeapPtr<ITEMIDLIST> m_idlist;
 
 public:
@@ -36,13 +38,6 @@ public:
 
     void Init(LPITEMIDLIST idlist);
 
-    // *** IDispatch methods ***
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
-    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
-    virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
-
-
     // *** Folder methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Title(BSTR *pbs);
     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid);
index 896e4de..87866fa 100644 (file)
@@ -31,35 +31,10 @@ CFolderItemVerb::~CFolderItemVerb()
 {
 }
 
-//void CFolderItemVerb::Init(LPITEMIDLIST idlist)
-//{
-//    m_idlist.Attach(idlist);
-//}
-
-// *** IDispatch methods ***
-HRESULT STDMETHODCALLTYPE CFolderItemVerb::GetTypeInfoCount(UINT *pctinfo)
-{
-    TRACE("(%p, %p)\n", this, pctinfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItemVerb::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
-{
-    TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItemVerb::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
+void CFolderItemVerb::Init(IContextMenu* menu, BSTR name)
 {
-    TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItemVerb::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
-{
-    TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
-        pDispParams, pVarResult, pExcepInfo, puArgErr);
-    return E_NOTIMPL;
+    m_contextmenu = menu;
+    m_name.m_str = name;
 }
 
 // *** FolderItemVerb methods ***
@@ -78,12 +53,10 @@ HRESULT STDMETHODCALLTYPE CFolderItemVerb::get_Parent(IDispatch **ppid)
 
 HRESULT STDMETHODCALLTYPE CFolderItemVerb::get_Name(BSTR *pbs)
 {
-    TRACE("(%p, %p)\n", this, pbs);
     if (!pbs)
         return E_POINTER;
-    // Terminating item:
-    *pbs = SysAllocString(L"");
-    return E_NOTIMPL;
+    *pbs = SysAllocString(m_name);
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CFolderItemVerb::DoIt()
@@ -98,52 +71,45 @@ HRESULT STDMETHODCALLTYPE CFolderItemVerb::DoIt()
 
 
 CFolderItemVerbs::CFolderItemVerbs()
+    :m_menu(NULL)
+    ,m_count(0)
 {
 }
 
 CFolderItemVerbs::~CFolderItemVerbs()
 {
+    DestroyMenu(m_menu);
 }
 
-//void CFolderItemVerbs::Init(LPITEMIDLIST idlist)
-//{
-//    m_idlist.Attach(idlist);
-//}
-
-// *** IDispatch methods ***
-HRESULT STDMETHODCALLTYPE CFolderItemVerbs::GetTypeInfoCount(UINT *pctinfo)
+HRESULT CFolderItemVerbs::Init(LPITEMIDLIST idlist)
 {
-    TRACE("(%p, %p)\n", this, pctinfo);
-    return E_NOTIMPL;
-}
+    CComPtr<IShellFolder> folder;
+    LPCITEMIDLIST child;
+    HRESULT hr = SHBindToParent(idlist, IID_PPV_ARG(IShellFolder, &folder), &child);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
 
-HRESULT STDMETHODCALLTYPE CFolderItemVerbs::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
-{
-    TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
-    return E_NOTIMPL;
-}
+    hr = folder->GetUIObjectOf(NULL, 1, &child, IID_IContextMenu, NULL, (PVOID*)&m_contextmenu);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
 
-HRESULT STDMETHODCALLTYPE CFolderItemVerbs::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
-{
-    TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
-    return E_NOTIMPL;
-}
+    m_menu = CreatePopupMenu();
+    hr = m_contextmenu->QueryContextMenu(m_menu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
+    if (!SUCCEEDED(hr))
+        return hr;
 
-HRESULT STDMETHODCALLTYPE CFolderItemVerbs::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
-{
-    TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
-        pDispParams, pVarResult, pExcepInfo, puArgErr);
-    return E_NOTIMPL;
+    m_count = GetMenuItemCount(m_menu);
+    return hr;
 }
 
+
 // *** FolderItemVerbs methods ***
 HRESULT STDMETHODCALLTYPE CFolderItemVerbs::get_Count(LONG *plCount)
 {
-    TRACE("(%p, %p)\n", this, plCount);
     if (!plCount)
         return E_POINTER;
-    *plCount = 0;
-    return E_NOTIMPL;
+    *plCount = m_count;
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CFolderItemVerbs::get_Application(IDispatch **ppid)
@@ -158,18 +124,51 @@ HRESULT STDMETHODCALLTYPE CFolderItemVerbs::get_Parent(IDispatch **ppid)
     return E_NOTIMPL;
 }
 
-HRESULT STDMETHODCALLTYPE CFolderItemVerbs::Item(VARIANT index, FolderItemVerb **ppid)
+HRESULT STDMETHODCALLTYPE CFolderItemVerbs::Item(VARIANT indexVar, FolderItemVerb **ppid)
 {
-    TRACE("(%p, %s, %p)\n", this, wine_dbgstr_variant(&index), ppid);
     if (!ppid)
         return E_POINTER;
 
-    /* FIXME! */
+    CComVariant var;
+    VariantCopyInd(&var, &indexVar);
+
+    HRESULT hr = VariantChangeType(&var, &var, 0, VT_I4);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return E_INVALIDARG;
+
+    int index = V_I4(&var);
+
+    if (index > m_count)
+        return S_OK;
+
+    BSTR name = NULL;
+
+    if(index == m_count)
+        name = SysAllocStringLen(NULL, 0);
+    else
+    {
+        MENUITEMINFOW info = { sizeof(info), 0 };
+        info.fMask = MIIM_STRING;
+        if (!GetMenuItemInfoW(m_menu, index, TRUE, &info))
+            return E_FAIL;
+        name = SysAllocStringLen(NULL, info.cch);
+        if (name)
+        {
+            info.dwTypeData = name;
+            info.cch++;
+            GetMenuItemInfoW(m_menu, index, TRUE, &info);
+        }
+    }
+
+    if (!name)
+        return E_OUTOFMEMORY;
+
     CFolderItemVerb* verb = new CComObject<CFolderItemVerb>();
+    verb->Init(m_contextmenu, name);
     verb->AddRef();
     *ppid = verb;
 
-    return E_NOTIMPL;
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE CFolderItemVerbs::_NewEnum(IUnknown **ppunk)
index f398ea7..58bb89b 100644 (file)
 class CFolderItemVerb:
     public CComCoClass<CFolderItemVerb>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public FolderItemVerb
+    public IDispatchImpl<FolderItemVerb, &IID_FolderItemVerb>
 {
 private:
+    CComPtr<IContextMenu> m_contextmenu;
+    CComBSTR m_name;
 
 public:
     CFolderItemVerb();
     ~CFolderItemVerb();
 
-    //void Init(LPITEMIDLIST idlist);
-
-
-    // *** IDispatch methods ***
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
-    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
-    virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+    void Init(IContextMenu* menu, BSTR name);
 
     // *** FolderItemVerb methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid);
@@ -61,22 +56,18 @@ END_COM_MAP()
 class CFolderItemVerbs:
     public CComCoClass<CFolderItemVerbs>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public FolderItemVerbs
+    public IDispatchImpl<FolderItemVerbs, &IID_FolderItemVerbs>
 {
 private:
+    CComPtr<IContextMenu> m_contextmenu;
+    HMENU m_menu;
+    int m_count;
 
 public:
     CFolderItemVerbs();
-    ~CFolderItemVerbs();
-
-    //void Init(LPITEMIDLIST idlist);
-
+    virtual ~CFolderItemVerbs();
 
-    // *** IDispatch methods ***
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
-    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
-    virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+    HRESULT Init(LPITEMIDLIST idlist);
 
     // *** FolderItemVerbs methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Count(LONG *plCount);
index 5c5e298..95edc91 100644 (file)
@@ -36,32 +36,6 @@ void CFolderItem::Init(LPITEMIDLIST idlist)
     m_idlist.Attach(idlist);
 }
 
-// *** IDispatch methods ***
-HRESULT STDMETHODCALLTYPE CFolderItem::GetTypeInfoCount(UINT *pctinfo)
-{
-    TRACE("(%p, %p)\n", this, pctinfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItem::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
-{
-    TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItem::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
-{
-    TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItem::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
-{
-    TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
-        pDispParams, pVarResult, pExcepInfo, puArgErr);
-    return E_NOTIMPL;
-}
-
 // *** FolderItem methods ***
 HRESULT STDMETHODCALLTYPE CFolderItem::get_Application(IDispatch **ppid)
 {
@@ -165,9 +139,15 @@ HRESULT STDMETHODCALLTYPE CFolderItem::get_Type(BSTR *pbs)
 
 HRESULT STDMETHODCALLTYPE CFolderItem::Verbs(FolderItemVerbs **ppfic)
 {
-    if(!ppfic)
+    if (!ppfic)
         return E_POINTER;
     CFolderItemVerbs* verbs = new CComObject<CFolderItemVerbs>();
+    HRESULT hr = verbs->Init(m_idlist);
+    if (FAILED_UNEXPECTEDLY(hr))
+    {
+        delete verbs;
+        return hr;
+    }
     verbs->AddRef();
     *ppfic = verbs;
     return S_OK;
@@ -181,8 +161,6 @@ HRESULT STDMETHODCALLTYPE CFolderItem::InvokeVerb(VARIANT vVerb)
 
 
 
-
-
 CFolderItems::CFolderItems()
 {
 }
@@ -191,32 +169,6 @@ CFolderItems::~CFolderItems()
 {
 }
 
-// *** IDispatch methods ***
-HRESULT STDMETHODCALLTYPE CFolderItems::GetTypeInfoCount(UINT *pctinfo)
-{
-    TRACE("(%p, %p)\n", this, pctinfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItems::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
-{
-    TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItems::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
-{
-    TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CFolderItems::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
-{
-    TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
-        pDispParams, pVarResult, pExcepInfo, puArgErr);
-    return E_NOTIMPL;
-}
-
 // *** FolderItems methods ***
 HRESULT STDMETHODCALLTYPE CFolderItems::get_Count(long *plCount)
 {
index 6364f60..48858fb 100644 (file)
@@ -25,7 +25,7 @@
 class CFolderItem:
     public CComCoClass<CFolderItem>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public FolderItem
+    public IDispatchImpl<FolderItem, &IID_FolderItem>
 {
 private:
     CComHeapPtr<ITEMIDLIST> m_idlist;
@@ -37,12 +37,6 @@ public:
     void Init(LPITEMIDLIST idlist);
 
 
-    // *** IDispatch methods ***
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
-    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
-    virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
-
     // *** FolderItem methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid);
     virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppid);
@@ -75,7 +69,7 @@ END_COM_MAP()
 class CFolderItems:
     public CComCoClass<CFolderItems>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public FolderItems
+    public IDispatchImpl<FolderItems, &IID_FolderItems>
 {
 private:
 
@@ -83,12 +77,6 @@ public:
     CFolderItems();
     ~CFolderItems();
 
-    // *** IDispatch methods ***
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
-    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
-    virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
-
     // *** FolderItems methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Count(long *plCount);
     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid);
index f9e3b1c..aa3c120 100644 (file)
@@ -31,34 +31,11 @@ CShell::~CShell()
 {
 }
 
-
-// *** IDispatch methods ***
-HRESULT STDMETHODCALLTYPE CShell::GetTypeInfoCount(UINT *pctinfo)
+HRESULT CShell::Initialize()
 {
-    TRACE("(%p, %p)\n", this, pctinfo);
-    return E_NOTIMPL;
+    return S_OK;
 }
 
-HRESULT STDMETHODCALLTYPE CShell::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
-{
-    TRACE("(%p, %lu, %lu, %p)\n", this, iTInfo, lcid, ppTInfo);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CShell::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
-{
-    TRACE("(%p, %s, %p, %lu, %lu, %p)\n", this, wine_dbgstr_guid(&riid), rgszNames, cNames, lcid, rgDispId);
-    return E_NOTIMPL;
-}
-
-HRESULT STDMETHODCALLTYPE CShell::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
-{
-    TRACE("(%p, %lu, %s, %lu, %lu, %p, %p, %p, %p)\n", this, dispIdMember, wine_dbgstr_guid(&riid), lcid, (DWORD)wFlags,
-        pDispParams, pVarResult, pExcepInfo, puArgErr);
-    return E_NOTIMPL;
-}
-
-
 // *** IShellDispatch methods ***
 HRESULT STDMETHODCALLTYPE CShell::get_Application(IDispatch **ppid)
 {
@@ -341,4 +318,8 @@ HRESULT STDMETHODCALLTYPE CShell::GetSite(REFIID riid, PVOID *ppvSite)
     return E_NOTIMPL;
 }
 
+HRESULT WINAPI CShell_Constructor(REFIID riid, LPVOID * ppvOut)
+{
+    return ShellObjectCreatorInit<CShell>(riid, ppvOut);
+}
 
index 97e7ad6..6684849 100644 (file)
@@ -26,7 +26,7 @@
 class CShell:
     public CComCoClass<CShell, &CLSID_Shell>,
     public CComObjectRootEx<CComMultiThreadModelNoCS>,
-    public IShellDispatch4,
+    public IDispatchImpl<IShellDispatch4, &IID_IShellDispatch4>,
     public IObjectSafety,
     public IObjectWithSite
 {
@@ -36,11 +36,7 @@ public:
     CShell();
     ~CShell();
 
-    // *** IDispatch methods ***
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
-    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
-    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
-    virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
+    HRESULT Initialize();
 
     // *** IShellDispatch methods ***
     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppid);
index 58c949c..315d9e9 100644 (file)
@@ -72,6 +72,7 @@ IContextMenu2 *       ISvBgCm_Constructor(LPSHELLFOLDER pSFParent, BOOL bDesktop);
 HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView);
 HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut);
 HRESULT WINAPI CDefViewDual_Constructor(REFIID riid, LPVOID * ppvOut);
+HRESULT WINAPI CShell_Constructor(REFIID riid, LPVOID * ppvOut);
 
 HRESULT WINAPI IShellLink_ConstructFromFile(IUnknown * pUnkOuter, REFIID riid, LPCITEMIDLIST pidl, LPVOID * ppv);
 HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV);
index 8897e52..8d61c71 100644 (file)
@@ -880,17 +880,8 @@ START_TEST(shelldispatch)
     init_function_pointers();
     test_namespace();
     test_service();
-#ifdef __REACTOS__
-    if (!winetest_interactive)
-        skip("ROSTESTS-209: Skipping test_ShellFolderViewDual() and test_ShellWindows().\n");
-    else
-    {
-#endif
     test_ShellFolderViewDual();
     test_ShellWindows();
-#ifdef __REACTOS__
-    }
-#endif
     test_ParseName();
     test_Verbs();