Nikolay Sivov : shell32: Implement Application property of IShellFolderViewDual.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 6 09:29:04 CDT 2015
Module: wine
Branch: master
Commit: ce87d64ab4414e5786c6d05a1001a0a312c1284e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce87d64ab4414e5786c6d05a1001a0a312c1284e
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed May 6 08:35:47 2015 +0300
shell32: Implement Application property of IShellFolderViewDual.
---
dlls/shell32/shlview.c | 9 +++-
dlls/shell32/tests/shelldispatch.c | 87 ++++++++++++++++++++++++++------------
include/shldisp.idl | 18 +++++---
3 files changed, 78 insertions(+), 36 deletions(-)
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index 8352157..6ddb937 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -3518,8 +3518,13 @@ static HRESULT WINAPI shellfolderviewdual_get_Application(IShellFolderViewDual3
IDispatch **disp)
{
IShellViewImpl *This = impl_from_IShellFolderViewDual3(iface);
- FIXME("%p %p\n", This, disp);
- return E_NOTIMPL;
+
+ TRACE("%p %p\n", This, disp);
+
+ if (!disp)
+ return E_INVALIDARG;
+
+ return IShellDispatch_Constructor(NULL, &IID_IDispatch, (void**)disp);
}
static HRESULT WINAPI shellfolderviewdual_get_Parent(IShellFolderViewDual3 *iface, IDispatch **disp)
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index b7773ad..f034132 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -364,8 +364,42 @@ static void test_service(void)
IShellDispatch2_Release(sd);
}
+static void test_dispatch_typeinfo(IDispatch *disp, REFIID *riid)
+{
+ ITypeInfo *typeinfo;
+ TYPEATTR *typeattr;
+ UINT count;
+ HRESULT hr;
+
+ count = 10;
+ hr = IDispatch_GetTypeInfoCount(disp, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 1, "got %u\n", count);
+
+ hr = IDispatch_GetTypeInfo(disp, 0, LOCALE_SYSTEM_DEFAULT, &typeinfo);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ while (!IsEqualGUID(*riid, &IID_NULL)) {
+ if (IsEqualGUID(&typeattr->guid, *riid))
+ break;
+ riid++;
+ }
+ ok(IsEqualGUID(&typeattr->guid, *riid), "unexpected type guid %s\n", wine_dbgstr_guid(&typeattr->guid));
+
+ ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
+ ITypeInfo_Release(typeinfo);
+}
+
static void test_ShellFolderViewDual(void)
{
+ static const REFIID shelldisp_riids[] = {
+ &IID_IShellDispatch6,
+ &IID_IShellDispatch5,
+ &IID_IShellDispatch4,
+ &IID_NULL
+ };
IShellFolderViewDual *viewdual;
IShellFolder *desktop, *tmpdir;
IShellView *view, *view2;
@@ -399,6 +433,18 @@ static void test_ShellFolderViewDual(void)
hr = IShellFolderViewDual_QueryInterface(viewdual, &IID_IShellView, (void**)&view2);
ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+ /* get_Application() */
+
+if (0) /* crashes on pre-vista */ {
+ hr = IShellFolderViewDual_get_Application(viewdual, NULL);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+}
+ hr = IShellFolderViewDual_get_Application(viewdual, &disp2);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(disp2 != (IDispatch*)viewdual, "got %p, %p\n", disp2, viewdual);
+ test_dispatch_typeinfo(disp2, shelldisp_riids);
+ IDispatch_Release(disp2);
+
IShellFolderViewDual_Release(viewdual);
IDispatch_Release(disp);
@@ -510,35 +556,29 @@ todo_wine {
ok(ret == 0, "got %d\n", ret);
}
else {
+ static const REFIID browser_riids[] = {
+ &IID_IWebBrowser2,
+ &IID_NULL
+ };
+
+ static const REFIID viewdual_riids[] = {
+ &IID_IShellFolderViewDual3,
+ &IID_NULL
+ };
+
IShellFolderViewDual *view;
IShellBrowser *sb, *sb2;
IServiceProvider *sp;
IDispatch *doc, *app;
- ITypeInfo *typeinfo;
- TYPEATTR *typeattr;
IWebBrowser2 *wb;
IShellView *sv;
IUnknown *unk;
- UINT count;
ok(disp != NULL, "got %p\n", disp);
ok(ret != HandleToUlong(hwnd), "got %d\n", ret);
/* IDispatch-related tests */
- count = 10;
- hr = IDispatch_GetTypeInfoCount(disp, &count);
- ok(hr == S_OK, "got 0x%08x\n", hr);
- ok(count == 1, "got %u\n", count);
-
- hr = IDispatch_GetTypeInfo(disp, 0, LOCALE_SYSTEM_DEFAULT, &typeinfo);
- ok(hr == S_OK, "got 0x%08x\n", hr);
-
- hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr);
- ok(hr == S_OK, "got 0x%08x\n", hr);
- ok(IsEqualGUID(&typeattr->guid, &IID_IWebBrowser2), "type guid %s\n", wine_dbgstr_guid(&typeattr->guid));
-
- ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
- ITypeInfo_Release(typeinfo);
+ test_dispatch_typeinfo(disp, browser_riids);
/* IWebBrowser2 */
hr = IDispatch_QueryInterface(disp, &IID_IWebBrowser2, (void**)&wb);
@@ -556,18 +596,9 @@ todo_wine
hr = IWebBrowser2_get_Document(wb, &doc);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
-if (hr == S_OK) {
- hr = IDispatch_GetTypeInfo(doc, 0, LOCALE_SYSTEM_DEFAULT, &typeinfo);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+if (hr == S_OK)
+ test_dispatch_typeinfo(doc, viewdual_riids);
- hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr);
- ok(hr == S_OK, "got 0x%08x\n", hr);
- ok(IsEqualGUID(&typeattr->guid, &IID_IShellFolderViewDual3), "type guid %s\n", wine_dbgstr_guid(&typeattr->guid));
- IDispatch_Release(doc);
-
- ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr);
- ITypeInfo_Release(typeinfo);
-}
IWebBrowser2_Release(wb);
/* IServiceProvider */
diff --git a/include/shldisp.idl b/include/shldisp.idl
index 506c5d2..56be778 100644
--- a/include/shldisp.idl
+++ b/include/shldisp.idl
@@ -403,7 +403,6 @@ interface FolderItemVerbs : IDispatch
* IShellDispatch interface
*/
[
- object,
uuid(d8f015c0-c278-11ce-a49e-444553540000),
oleautomation,
hidden,
@@ -465,7 +464,6 @@ interface IShellDispatch : IDispatch
}
[
- object,
uuid(a4c6892c-3ba9-11d2-9dea-00c04fb16162),
oleautomation,
hidden,
@@ -486,7 +484,6 @@ interface IShellDispatch2 : IShellDispatch
}
[
- object,
uuid(177160ca-bb5a-411c-841d-bd38facdeaa0),
oleautomation,
hidden,
@@ -498,7 +495,6 @@ interface IShellDispatch3 : IShellDispatch2
}
[
- object,
uuid(efd84b2d-4bcf-4298-be25-eb542a59fbda),
oleautomation,
hidden,
@@ -513,7 +509,6 @@ interface IShellDispatch4 : IShellDispatch3
}
[
- object,
uuid(866738b9-6cf2-4de8-8767-f794ebe74f4e),
oleautomation,
hidden,
@@ -525,11 +520,22 @@ interface IShellDispatch5 : IShellDispatch4
}
[
+ uuid(286e6f1b-7113-4355-9562-96b7e9d64c54),
+ oleautomation,
+ hidden,
+ dual,
+]
+interface IShellDispatch6 : IShellDispatch5
+{
+ HRESULT SearchCommand(void);
+}
+
+[
uuid(13709620-c279-11ce-a49e-444553540000)
]
coclass Shell
{
- [default] interface IShellDispatch2;
+ [default] interface IShellDispatch6;
}
[
More information about the wine-cvs
mailing list