2 * Copyright 2015 Hans Leidekker 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
26 #include "wine/test.h"
28 DEFINE_GUID(CLSID_WINMGMTS
,0x172bddf8,0xceea,0x11d1,0x8b,0x05,0x00,0x60,0x08,0x06,0xd9,0xb6);
29 DEFINE_GUID(GUID_NULL
,0,0,0,0,0,0,0,0,0,0,0);
31 static void test_ParseDisplayName(void)
33 static const WCHAR biosW
[] = {'W','i','n','3','2','_','B','i','o','s',0};
34 static const WCHAR manufacturerW
[] = {'M','a','n','u','f','a','c','t','u','r','e','r',0};
35 static const WCHAR versionW
[] = {'v','e','r','s','i','o','n',0};
36 static const WCHAR nosuchW
[] = {'N','o','S','u','c','h',0};
37 static const WCHAR name1
[] =
38 {'w','i','n','m','g','m','t','s',':',0};
39 static const WCHAR name2
[] =
40 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',0};
41 static const WCHAR name3
[] =
42 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':',
43 'W','i','n','3','2','_','L','o','g','i','c','a','l','D','i','s','k','.',
44 'D','e','v','i','c','e','I','D','=','\'','C',':','\'',0};
45 static const WCHAR name4
[] =
46 {'w','i','n','m','g','m','t','s',':','\\','\\','.','\\','r','o','o','t','\\','c','i','m','v','2',':',
47 'W','i','n','3','2','_','S','e','r','v','i','c','e',0};
56 { name1
, S_OK
, &IID_ISWbemServices
, sizeof(name1
)/sizeof(name1
[0]) - 1 },
57 { name2
, S_OK
, &IID_ISWbemServices
, sizeof(name2
)/sizeof(name2
[0]) - 1 },
58 { name3
, S_OK
, &IID_ISWbemObject
, sizeof(name3
)/sizeof(name3
[0]) - 1 },
59 { name4
, S_OK
, &IID_ISWbemObject
, sizeof(name4
)/sizeof(name4
[0]) - 1 }
61 LCID english
= MAKELCID(MAKELANGID(LANG_ENGLISH
,SUBLANG_ENGLISH_US
),SORT_DEFAULT
);
62 IParseDisplayName
*displayname
;
67 ULONG i
, eaten
, count
;
70 hr
= CoCreateInstance( &CLSID_WINMGMTS
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IParseDisplayName
, (void **)&displayname
);
73 win_skip( "can't create instance of WINMGMTS\n" );
77 hr
= CreateBindCtx( 0, &ctx
);
78 ok( hr
== S_OK
, "got %x\n", hr
);
80 for (i
=0; i
< sizeof(tests
)/sizeof(tests
[0]); i
++)
82 str
= SysAllocString( tests
[i
].name
);
85 hr
= IParseDisplayName_ParseDisplayName( displayname
, NULL
, str
, &eaten
, &moniker
);
87 ok( hr
== tests
[i
].hr
, "%u: got %x\n", i
, hr
);
88 ok( eaten
== tests
[i
].eaten
, "%u: got %u\n", i
, eaten
);
92 hr
= IMoniker_BindToObject( moniker
, ctx
, NULL
, tests
[i
].iid
, (void **)&obj
);
93 ok( hr
== S_OK
, "%u: got %x\n", i
, hr
);
94 if (obj
) IUnknown_Release( obj
);
95 IMoniker_Release( moniker
);
99 str
= SysAllocString( name1
);
102 hr
= IParseDisplayName_ParseDisplayName( displayname
, NULL
, str
, &eaten
, &moniker
);
103 SysFreeString( str
);
104 ok( hr
== S_OK
, "got %x\n", hr
);
105 ok( eaten
== lstrlenW(name1
), "got %u\n", eaten
);
108 ISWbemServices
*services
= NULL
;
110 hr
= IMoniker_BindToObject( moniker
, ctx
, NULL
, &IID_IUnknown
, (void **)&services
);
111 ok( hr
== S_OK
, "got %x\n", hr
);
114 ISWbemObjectSet
*objectset
= NULL
;
116 str
= SysAllocString( biosW
);
117 hr
= ISWbemServices_InstancesOf( services
, str
, 0, NULL
, &objectset
);
118 SysFreeString( str
);
119 ok( hr
== S_OK
, "got %x\n", hr
);
122 hr
= ISWbemObjectSet_get__NewEnum( objectset
, &obj
);
123 ok( hr
== S_OK
, "got %x\n", hr
);
126 IEnumVARIANT
*enumvar
= NULL
;
128 hr
= IUnknown_QueryInterface( obj
, &IID_IEnumVARIANT
, (void **)&enumvar
);
129 ok( hr
== S_OK
, "got %x\n", hr
);
135 IDispatch
*dispatch
= NULL
;
140 fetched
= 0xdeadbeef;
141 hr
= IEnumVARIANT_Next( enumvar
, 0, &var
, &fetched
);
142 ok( hr
== S_OK
, "got %x\n", hr
);
143 ok( !fetched
, "got %u\n", fetched
);
145 fetched
= 0xdeadbeef;
146 V_VT( &var
) = VT_ERROR
;
147 V_ERROR( &var
) = 0xdeadbeef;
148 hr
= IEnumVARIANT_Next( enumvar
, 1, &var
, &fetched
);
149 ok( hr
== S_OK
, "got %x\n", hr
);
150 ok( fetched
== 1, "got %u\n", fetched
);
151 ok( V_VT( &var
) == VT_DISPATCH
, "got %u\n", V_VT( &var
) );
152 ok( V_DISPATCH( &var
) != (IDispatch
*)0xdeadbeef, "got %u\n", V_VT( &var
) );
154 dispatch
= V_DISPATCH( &var
);
156 hr
= IDispatch_GetTypeInfoCount( dispatch
, &count
);
157 ok( hr
== S_OK
, "got %x\n", hr
);
158 ok( count
== 1, "got %u\n", count
);
160 str
= SysAllocString( manufacturerW
);
162 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
163 SysFreeString( str
);
164 ok( hr
== S_OK
, "got %x\n", hr
);
165 ok( dispid
== 0x1800001 || dispid
== 0x10b /* win2k */, "got %x\n", dispid
);
167 str
= SysAllocString( versionW
);
169 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
170 SysFreeString( str
);
171 ok( hr
== S_OK
, "got %x\n", hr
);
172 ok( dispid
== 0x1800002 || dispid
== 0x119 /* win2k */, "got %x\n", dispid
);
174 str
= SysAllocString( nosuchW
);
176 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
177 SysFreeString( str
);
178 ok( hr
== DISP_E_UNKNOWNNAME
, "got %x\n", hr
);
179 ok( dispid
== DISPID_UNKNOWN
, "got %x\n", dispid
);
181 str
= SysAllocString( manufacturerW
);
183 hr
= IDispatch_GetIDsOfNames( dispatch
, &IID_NULL
, &str
, 1, english
, &dispid
);
184 SysFreeString( str
);
185 ok( hr
== S_OK
, "got %x\n", hr
);
186 ok( dispid
== 0x1800001 || dispid
== 0x10b /* win2k */, "got %x\n", dispid
);
188 if (dispid
== 0x1800001) /* crashes on win2k */
190 V_VT( &res
) = VT_ERROR
;
191 V_BSTR( &res
) = (BSTR
)0xdeadbeef;
192 params
.rgvarg
= (VARIANTARG
*)0xdeadbeef;
193 params
.rgdispidNamedArgs
= (DISPID
*)0xdeadbeef;
194 params
.cArgs
= params
.cNamedArgs
= 0xdeadbeef;
195 arg_err
= 0xdeadbeef;
196 hr
= IDispatch_Invoke( dispatch
, DISPID_UNKNOWN
, &IID_NULL
, english
,
197 DISPATCH_METHOD
|DISPATCH_PROPERTYGET
,
198 ¶ms
, &res
, NULL
, &arg_err
);
199 ok( hr
== DISP_E_MEMBERNOTFOUND
|| hr
== S_OK
/* winxp */, "got %x\n", hr
);
200 ok( params
.rgvarg
== (VARIANTARG
*)0xdeadbeef, "got %p\n", params
.rgvarg
);
201 ok( params
.rgdispidNamedArgs
== (DISPID
*)0xdeadbeef, "got %p\n", params
.rgdispidNamedArgs
);
202 ok( params
.cArgs
== 0xdeadbeef, "got %u\n", params
.cArgs
);
203 ok( params
.cNamedArgs
== 0xdeadbeef, "got %u\n", params
.cNamedArgs
);
204 ok( V_VT( &res
) == VT_ERROR
, "got %u\n", V_VT( &res
) );
205 ok( V_ERROR( &res
) == 0xdeadbeef, "got %u\n", V_VT( &res
) );
206 ok( arg_err
== 0xdeadbeef, "got %u\n", arg_err
);
207 if (hr
== S_OK
) VariantClear( &res
);
210 V_VT( &res
) = VT_ERROR
;
211 V_BSTR( &res
) = (BSTR
)0xdeadbeef;
212 memset( ¶ms
, 0, sizeof(params
) );
213 hr
= IDispatch_Invoke( dispatch
, dispid
, &IID_NULL
, english
,
214 DISPATCH_METHOD
|DISPATCH_PROPERTYGET
,
215 ¶ms
, &res
, NULL
, NULL
);
216 ok( hr
== S_OK
, "got %x\n", hr
);
217 ok( params
.rgvarg
== NULL
, "got %p\n", params
.rgvarg
);
218 ok( params
.rgdispidNamedArgs
== NULL
, "got %p\n", params
.rgdispidNamedArgs
);
219 ok( !params
.cArgs
, "got %u\n", params
.cArgs
);
220 ok( !params
.cNamedArgs
, "got %u\n", params
.cNamedArgs
);
221 ok( V_VT( &res
) == VT_BSTR
, "got %u\n", V_VT( &res
) );
222 ok( V_BSTR( &res
) != (BSTR
)0xdeadbeef, "got %u\n", V_VT( &res
) );
223 VariantClear( &res
);
224 VariantClear( &var
);
226 fetched
= 0xdeadbeef;
227 hr
= IEnumVARIANT_Next( enumvar
, 1, &var
, &fetched
);
228 ok( hr
== S_FALSE
, "got %x\n", hr
);
229 ok( !fetched
, "got %u\n", fetched
);
231 IEnumVARIANT_Release( enumvar
);
233 IUnknown_Release( obj
);
235 ISWbemObjectSet_Release( objectset
);
237 IUnknown_Release( services
);
239 IMoniker_Release( moniker
);
242 IBindCtx_Release( ctx
);
243 IParseDisplayName_Release( displayname
);
248 CoInitialize( NULL
);
249 test_ParseDisplayName();