188 lines
5.7 KiB
C
188 lines
5.7 KiB
C
/*
|
|
* Copyright 2011 Jacek Caban for CodeWeavers
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#define COBJMACROS
|
|
#define CONST_VTABLE
|
|
|
|
#include <initguid.h>
|
|
#include <ole2.h>
|
|
#include <dispex.h>
|
|
|
|
#include "wshom.h"
|
|
#include "wine/test.h"
|
|
|
|
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
|
|
|
|
#define EXPECT_HR(hr,hr_exp) \
|
|
ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
|
|
|
|
static void test_wshshell(void)
|
|
{
|
|
static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0};
|
|
static const WCHAR lnk1W[] = {'f','i','l','e','.','l','n','k',0};
|
|
static const WCHAR pathW[] = {'%','P','A','T','H','%',0};
|
|
static const WCHAR sysW[] = {'S','Y','S','T','E','M',0};
|
|
static const WCHAR path2W[] = {'P','A','T','H',0};
|
|
IWshEnvironment *env;
|
|
IWshShell3 *sh3;
|
|
IDispatchEx *dispex;
|
|
IWshCollection *coll;
|
|
IDispatch *disp, *shortcut;
|
|
IUnknown *shell;
|
|
IFolderCollection *folders;
|
|
IWshShortcut *shcut;
|
|
ITypeInfo *ti;
|
|
HRESULT hr;
|
|
TYPEATTR *tattr;
|
|
DISPPARAMS dp;
|
|
EXCEPINFO ei;
|
|
VARIANT arg, res;
|
|
BSTR str, ret;
|
|
UINT err;
|
|
|
|
hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
|
|
&IID_IDispatch, (void**)&disp);
|
|
if(FAILED(hr)) {
|
|
win_skip("Could not create WshShell object: %08x\n", hr);
|
|
return;
|
|
}
|
|
|
|
hr = IDispatch_QueryInterface(disp, &IID_IWshShell3, (void**)&shell);
|
|
EXPECT_HR(hr, S_OK);
|
|
IDispatch_Release(disp);
|
|
|
|
hr = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
|
|
EXPECT_HR(hr, E_NOINTERFACE);
|
|
|
|
hr = IUnknown_QueryInterface(shell, &IID_IWshShell3, (void**)&sh3);
|
|
EXPECT_HR(hr, S_OK);
|
|
|
|
hr = IWshShell3_get_SpecialFolders(sh3, &coll);
|
|
EXPECT_HR(hr, S_OK);
|
|
|
|
hr = IWshCollection_QueryInterface(coll, &IID_IFolderCollection, (void**)&folders);
|
|
EXPECT_HR(hr, E_NOINTERFACE);
|
|
|
|
hr = IWshCollection_QueryInterface(coll, &IID_IDispatch, (void**)&disp);
|
|
EXPECT_HR(hr, S_OK);
|
|
|
|
hr = IDispatch_GetTypeInfo(disp, 0, 0, &ti);
|
|
EXPECT_HR(hr, S_OK);
|
|
|
|
hr = ITypeInfo_GetTypeAttr(ti, &tattr);
|
|
EXPECT_HR(hr, S_OK);
|
|
ok(IsEqualIID(&tattr->guid, &IID_IWshCollection), "got wrong type guid\n");
|
|
ITypeInfo_ReleaseTypeAttr(ti, tattr);
|
|
|
|
/* try to call Item() with normal IDispatch procedure */
|
|
str = SysAllocString(desktopW);
|
|
V_VT(&arg) = VT_BSTR;
|
|
V_BSTR(&arg) = str;
|
|
dp.rgvarg = &arg;
|
|
dp.rgdispidNamedArgs = NULL;
|
|
dp.cArgs = 1;
|
|
dp.cNamedArgs = 0;
|
|
hr = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 1033, DISPATCH_PROPERTYGET, &dp, &res, &ei, &err);
|
|
EXPECT_HR(hr, DISP_E_MEMBERNOTFOUND);
|
|
|
|
/* try Item() directly, it returns directory path apparently */
|
|
V_VT(&res) = VT_EMPTY;
|
|
hr = IWshCollection_Item(coll, &arg, &res);
|
|
EXPECT_HR(hr, S_OK);
|
|
ok(V_VT(&res) == VT_BSTR, "got res type %d\n", V_VT(&res));
|
|
SysFreeString(str);
|
|
VariantClear(&res);
|
|
|
|
/* CreateShortcut() */
|
|
str = SysAllocString(lnk1W);
|
|
hr = IWshShell3_CreateShortcut(sh3, str, &shortcut);
|
|
EXPECT_HR(hr, S_OK);
|
|
SysFreeString(str);
|
|
hr = IDispatch_QueryInterface(shortcut, &IID_IWshShortcut, (void**)&shcut);
|
|
EXPECT_HR(hr, S_OK);
|
|
|
|
hr = IWshShortcut_get_Arguments(shcut, NULL);
|
|
ok(hr == E_POINTER, "got 0x%08x\n", hr);
|
|
|
|
hr = IWshShortcut_get_IconLocation(shcut, NULL);
|
|
ok(hr == E_POINTER, "got 0x%08x\n", hr);
|
|
|
|
IWshShortcut_Release(shcut);
|
|
IDispatch_Release(shortcut);
|
|
|
|
/* ExpandEnvironmentStrings */
|
|
hr = IWshShell3_ExpandEnvironmentStrings(sh3, NULL, NULL);
|
|
ok(hr == E_POINTER, "got 0x%08x\n", hr);
|
|
|
|
str = SysAllocString(pathW);
|
|
hr = IWshShell3_ExpandEnvironmentStrings(sh3, str, NULL);
|
|
ok(hr == E_POINTER, "got 0x%08x\n", hr);
|
|
SysFreeString(str);
|
|
|
|
V_VT(&arg) = VT_BSTR;
|
|
V_BSTR(&arg) = SysAllocString(sysW);
|
|
hr = IWshShell3_get_Environment(sh3, &arg, &env);
|
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
|
VariantClear(&arg);
|
|
|
|
hr = IWshEnvironment_get_Item(env, NULL, NULL);
|
|
ok(hr == E_POINTER, "got 0x%08x\n", hr);
|
|
|
|
ret = (BSTR)0x1;
|
|
hr = IWshEnvironment_get_Item(env, NULL, &ret);
|
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
|
ok(ret && !*ret, "got %p\n", ret);
|
|
SysFreeString(ret);
|
|
|
|
/* invalid var name */
|
|
str = SysAllocString(lnk1W);
|
|
hr = IWshEnvironment_get_Item(env, str, NULL);
|
|
ok(hr == E_POINTER, "got 0x%08x\n", hr);
|
|
|
|
ret = NULL;
|
|
hr = IWshEnvironment_get_Item(env, str, &ret);
|
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
|
ok(ret && *ret == 0, "got %s\n", wine_dbgstr_w(ret));
|
|
SysFreeString(ret);
|
|
SysFreeString(str);
|
|
|
|
/* valid name */
|
|
str = SysAllocString(path2W);
|
|
hr = IWshEnvironment_get_Item(env, str, &ret);
|
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
|
ok(ret && *ret != 0, "got %s\n", wine_dbgstr_w(ret));
|
|
SysFreeString(ret);
|
|
SysFreeString(str);
|
|
|
|
IWshEnvironment_Release(env);
|
|
|
|
IWshCollection_Release(coll);
|
|
IDispatch_Release(disp);
|
|
IWshShell3_Release(sh3);
|
|
IUnknown_Release(shell);
|
|
}
|
|
|
|
START_TEST(wshom)
|
|
{
|
|
CoInitialize(NULL);
|
|
|
|
test_wshshell();
|
|
|
|
CoUninitialize();
|
|
}
|