2 * Copyright 2011 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define WIN32_NO_STATUS
29 #include <wine/test.h>
31 DEFINE_GUID(GUID_NULL
,0,0,0,0,0,0,0,0,0,0,0);
33 #define EXPECT_HR(hr,hr_exp) \
34 ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
36 static void test_wshshell(void)
38 static const WCHAR desktopW
[] = {'D','e','s','k','t','o','p',0};
39 static const WCHAR lnk1W
[] = {'f','i','l','e','.','l','n','k',0};
40 static const WCHAR pathW
[] = {'%','P','A','T','H','%',0};
41 static const WCHAR sysW
[] = {'S','Y','S','T','E','M',0};
42 static const WCHAR path2W
[] = {'P','A','T','H',0};
47 IDispatch
*disp
, *shortcut
;
49 IFolderCollection
*folders
;
60 hr
= CoCreateInstance(&CLSID_WshShell
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
61 &IID_IDispatch
, (void**)&disp
);
63 win_skip("Could not create WshShell object: %08x\n", hr
);
67 hr
= IDispatch_QueryInterface(disp
, &IID_IWshShell3
, (void**)&shell
);
69 IDispatch_Release(disp
);
71 hr
= IDispatch_QueryInterface(disp
, &IID_IDispatchEx
, (void**)&dispex
);
72 EXPECT_HR(hr
, E_NOINTERFACE
);
74 hr
= IUnknown_QueryInterface(shell
, &IID_IWshShell3
, (void**)&sh3
);
77 hr
= IWshShell3_get_SpecialFolders(sh3
, &coll
);
80 hr
= IWshCollection_QueryInterface(coll
, &IID_IFolderCollection
, (void**)&folders
);
81 EXPECT_HR(hr
, E_NOINTERFACE
);
83 hr
= IWshCollection_QueryInterface(coll
, &IID_IDispatch
, (void**)&disp
);
86 hr
= IDispatch_GetTypeInfo(disp
, 0, 0, &ti
);
89 hr
= ITypeInfo_GetTypeAttr(ti
, &tattr
);
91 ok(IsEqualIID(&tattr
->guid
, &IID_IWshCollection
), "got wrong type guid\n");
92 ITypeInfo_ReleaseTypeAttr(ti
, tattr
);
94 /* try to call Item() with normal IDispatch procedure */
95 str
= SysAllocString(desktopW
);
99 dp
.rgdispidNamedArgs
= NULL
;
102 hr
= IDispatch_Invoke(disp
, DISPID_VALUE
, &IID_NULL
, 1033, DISPATCH_PROPERTYGET
, &dp
, &res
, &ei
, &err
);
103 EXPECT_HR(hr
, DISP_E_MEMBERNOTFOUND
);
105 /* try Item() directly, it returns directory path apparently */
106 V_VT(&res
) = VT_EMPTY
;
107 hr
= IWshCollection_Item(coll
, &arg
, &res
);
109 ok(V_VT(&res
) == VT_BSTR
, "got res type %d\n", V_VT(&res
));
113 /* CreateShortcut() */
114 str
= SysAllocString(lnk1W
);
115 hr
= IWshShell3_CreateShortcut(sh3
, str
, &shortcut
);
118 hr
= IDispatch_QueryInterface(shortcut
, &IID_IWshShortcut
, (void**)&shcut
);
121 hr
= IWshShortcut_get_Arguments(shcut
, NULL
);
122 ok(hr
== E_POINTER
, "got 0x%08x\n", hr
);
124 hr
= IWshShortcut_get_IconLocation(shcut
, NULL
);
125 ok(hr
== E_POINTER
, "got 0x%08x\n", hr
);
127 IWshShortcut_Release(shcut
);
128 IDispatch_Release(shortcut
);
130 /* ExpandEnvironmentStrings */
131 hr
= IWshShell3_ExpandEnvironmentStrings(sh3
, NULL
, NULL
);
132 ok(hr
== E_POINTER
, "got 0x%08x\n", hr
);
134 str
= SysAllocString(pathW
);
135 hr
= IWshShell3_ExpandEnvironmentStrings(sh3
, str
, NULL
);
136 ok(hr
== E_POINTER
, "got 0x%08x\n", hr
);
139 V_VT(&arg
) = VT_BSTR
;
140 V_BSTR(&arg
) = SysAllocString(sysW
);
141 hr
= IWshShell3_get_Environment(sh3
, &arg
, &env
);
142 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
145 hr
= IWshEnvironment_get_Item(env
, NULL
, NULL
);
146 ok(hr
== E_POINTER
, "got 0x%08x\n", hr
);
149 hr
= IWshEnvironment_get_Item(env
, NULL
, &ret
);
150 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
151 ok(ret
&& !*ret
, "got %p\n", ret
);
154 /* invalid var name */
155 str
= SysAllocString(lnk1W
);
156 hr
= IWshEnvironment_get_Item(env
, str
, NULL
);
157 ok(hr
== E_POINTER
, "got 0x%08x\n", hr
);
160 hr
= IWshEnvironment_get_Item(env
, str
, &ret
);
161 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
162 ok(ret
&& *ret
== 0, "got %s\n", wine_dbgstr_w(ret
));
167 str
= SysAllocString(path2W
);
168 hr
= IWshEnvironment_get_Item(env
, str
, &ret
);
169 ok(hr
== S_OK
, "got 0x%08x\n", hr
);
170 ok(ret
&& *ret
!= 0, "got %s\n", wine_dbgstr_w(ret
));
174 IWshEnvironment_Release(env
);
176 IWshCollection_Release(coll
);
177 IDispatch_Release(disp
);
178 IWshShell3_Release(sh3
);
179 IUnknown_Release(shell
);