ReactOS  0.4.14-dev-1233-gf5658fd
propsys.c
Go to the documentation of this file.
1 /*
2  * Unit tests for Windows property system
3  *
4  * Copyright 2006 Paul Vriens
5  * Copyright 2010 Andrew Nguyen
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21 
22 #define COBJMACROS
23 
24 #include <stdarg.h>
25 #include <stdio.h>
26 
27 #define NONAMELESSUNION
28 
29 #include "windef.h"
30 #include "winbase.h"
31 #include "objbase.h"
32 #include "initguid.h"
33 #include "propsys.h"
34 #include "propvarutil.h"
35 #include "strsafe.h"
36 #include "wine/test.h"
37 
38 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
39 DEFINE_GUID(dummy_guid, 0xdeadbeef, 0xdead, 0xbeef, 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe);
40 DEFINE_GUID(expect_guid, 0x12345678, 0x1234, 0x1234, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x90, 0x12);
41 
42 #define GUID_MEMBERS(g) {(g).Data1, (g).Data2, (g).Data3, {(g).Data4[0], (g).Data4[1], (g).Data4[2], (g).Data4[3], (g).Data4[4], (g).Data4[5], (g).Data4[6], (g).Data4[7]}}
43 
44 static const char topic[] = "wine topic";
45 static const WCHAR topicW[] = {'w','i','n','e',' ','t','o','p','i','c',0};
46 static const WCHAR emptyW[] = {0};
47 
48 static int strcmp_wa(LPCWSTR strw, const char *stra)
49 {
50  CHAR buf[512];
51  WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
52  return lstrcmpA(stra, buf);
53 }
54 
56 {
57  static const WCHAR fillerW[] = {'X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X',
58  'X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X',
59  'X','X','X','X','X','X','X','X','X','X'};
60  static const WCHAR zero_fillerW[] = {'\0','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X',
61  'X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X','X',
62  'X','X','X','X','X','X','X','X','X','X','X','X','X','X'};
63  static const WCHAR zero_truncatedW[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0',
64  '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0',
65  '0','0','0','}',' ','\0','9','X','X','X','X','X','X','X','X','X'};
66  static const WCHAR zero_truncated2W[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0',
67  '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0',
68  '0','0','0','}',' ','\0','9','2','7','6','9','4','9','2','X','X'};
69  static const WCHAR zero_truncated3W[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0',
70  '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0',
71  '0','0','0','}',' ','\0','9','2','7','6','9','4','9','2','4','X'};
72  static const WCHAR zero_truncated4W[] = {'\0','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0',
73  '0','0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0',
74  '0','0','0','}',' ','\0','7','X','X','X','X','X','X','X','X','X'};
75  static const WCHAR truncatedW[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
76  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
77  '0','}',' ','\0','9','X','X','X','X','X','X','X','X','X'};
78  static const WCHAR truncated2W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
79  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
80  '0','}',' ','\0','9','2','7','6','9','4','9','2','X','X'};
81  static const WCHAR truncated3W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
82  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
83  '0','}',' ','\0','9','2','7','6','9','4','9','2','4','X'};
84  static const WCHAR truncated4W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
85  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
86  '0','}',' ','\0','7','X','X','X','X','X','X','X','X','X'};
87  static const WCHAR expectedW[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
88  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
89  '0','}',' ','4','2','9','4','9','6','7','2','9','5',0};
90  static const WCHAR expected2W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
91  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
92  '0','}',' ','1','3','5','7','9','\0','X','X','X','X','X'};
93  static const WCHAR expected3W[] = {'{','0','0','0','0','0','0','0','0','-','0','0','0','0','-','0','0','0',
94  '0','-','0','0','0','0','-','0','0','0','0','0','0','0','0','0','0','0',
95  '0','}',' ','0','\0','X','X','X','X','X','X','X','X','X'};
96  PROPERTYKEY prop = {GUID_MEMBERS(GUID_NULL), ~0U};
97  PROPERTYKEY prop2 = {GUID_MEMBERS(GUID_NULL), 13579};
98  PROPERTYKEY prop3 = {GUID_MEMBERS(GUID_NULL), 0};
99  WCHAR out[PKEYSTR_MAX];
100  HRESULT ret;
101 
102  const struct
103  {
104  REFPROPERTYKEY pkey;
105  LPWSTR psz;
106  UINT cch;
107  HRESULT hr_expect;
108  const WCHAR *buf_expect;
109  BOOL hr_broken;
110  HRESULT hr2;
111  BOOL buf_broken;
112  const WCHAR *buf2;
113  } testcases[] =
114  {
115  {NULL, NULL, 0, E_POINTER},
116  {&prop, NULL, 0, E_POINTER},
117  {&prop, NULL, PKEYSTR_MAX, E_POINTER},
118  {NULL, out, 0, E_NOT_SUFFICIENT_BUFFER, fillerW},
119  {NULL, out, PKEYSTR_MAX, E_NOT_SUFFICIENT_BUFFER, zero_fillerW, FALSE, 0, TRUE, fillerW},
120  {&prop, out, 0, E_NOT_SUFFICIENT_BUFFER, fillerW},
121  {&prop, out, GUIDSTRING_MAX, E_NOT_SUFFICIENT_BUFFER, fillerW},
122  {&prop, out, GUIDSTRING_MAX + 1, E_NOT_SUFFICIENT_BUFFER, fillerW},
123  {&prop, out, GUIDSTRING_MAX + 2, E_NOT_SUFFICIENT_BUFFER, zero_truncatedW, TRUE, S_OK, TRUE, truncatedW},
124  {&prop, out, PKEYSTR_MAX - 2, E_NOT_SUFFICIENT_BUFFER, zero_truncated2W, TRUE, S_OK, TRUE, truncated2W},
125  {&prop, out, PKEYSTR_MAX - 1, E_NOT_SUFFICIENT_BUFFER, zero_truncated3W, TRUE, S_OK, TRUE, truncated3W},
126  {&prop, out, PKEYSTR_MAX, S_OK, expectedW},
127  {&prop2, out, GUIDSTRING_MAX + 2, E_NOT_SUFFICIENT_BUFFER, zero_truncated4W, TRUE, S_OK, TRUE, truncated4W},
128  {&prop2, out, GUIDSTRING_MAX + 6, S_OK, expected2W},
129  {&prop2, out, PKEYSTR_MAX, S_OK, expected2W},
130  {&prop3, out, GUIDSTRING_MAX + 1, E_NOT_SUFFICIENT_BUFFER, fillerW},
131  {&prop3, out, GUIDSTRING_MAX + 2, S_OK, expected3W},
132  {&prop3, out, PKEYSTR_MAX, S_OK, expected3W},
133  };
134 
135  int i;
136 
137  for (i = 0; i < ARRAY_SIZE(testcases); i++)
138  {
139  if (testcases[i].psz)
140  memcpy(testcases[i].psz, fillerW, PKEYSTR_MAX * sizeof(WCHAR));
141 
142  ret = PSStringFromPropertyKey(testcases[i].pkey,
143  testcases[i].psz,
144  testcases[i].cch);
145  ok(ret == testcases[i].hr_expect ||
146  broken(testcases[i].hr_broken && ret == testcases[i].hr2), /* Vista/Win2k8 */
147  "[%d] Expected PSStringFromPropertyKey to return 0x%08x, got 0x%08x\n",
148  i, testcases[i].hr_expect, ret);
149 
150  if (testcases[i].psz)
151  ok(!memcmp(testcases[i].psz, testcases[i].buf_expect, PKEYSTR_MAX * sizeof(WCHAR)) ||
152  broken(testcases[i].buf_broken &&
153  !memcmp(testcases[i].psz, testcases[i].buf2, PKEYSTR_MAX * sizeof(WCHAR))), /* Vista/Win2k8 */
154  "[%d] Unexpected output contents\n", i);
155  }
156 }
157 
159 {
160  static const WCHAR fmtid_clsidW[] = {'S','t','d','F','o','n','t',' ','1',0};
161  static const WCHAR fmtid_truncatedW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
162  '1','2','3','4','-',0};
163  static const WCHAR fmtid_nobracketsW[] = {'1','2','3','4','5','6','7','8','-','1','2','3','4','-',
164  '1','2','3','4','-','1','2','3','4','-',
165  '1','2','3','4','5','6','7','8','9','0','1','2',0};
166  static const WCHAR fmtid_badbracketW[] = {'X','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
167  '1','2','3','4','-','1','2','3','4','-',
168  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
169  static const WCHAR fmtid_badcharW[] = {'{','X','2','3','4','5','6','7','8','-','1','2','3','4','-',
170  '1','2','3','4','-','1','2','3','4','-',
171  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
172  static const WCHAR fmtid_badchar2W[] = {'{','1','2','3','4','5','6','7','X','-','1','2','3','4','-',
173  '1','2','3','4','-','1','2','3','4','-',
174  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
175  static const WCHAR fmtid_baddashW[] = {'{','1','2','3','4','5','6','7','8','X','1','2','3','4','-',
176  '1','2','3','4','-','1','2','3','4','-',
177  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
178  static const WCHAR fmtid_badchar3W[] = {'{','1','2','3','4','5','6','7','8','-','X','2','3','4','-',
179  '1','2','3','4','-','1','2','3','4','-',
180  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
181  static const WCHAR fmtid_badchar4W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','X','-',
182  '1','2','3','4','-','1','2','3','4','-',
183  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
184  static const WCHAR fmtid_baddash2W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','X',
185  '1','2','3','4','-','1','2','3','4','-',
186  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
187  static const WCHAR fmtid_badchar5W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
188  'X','2','3','4','-','1','2','3','4','-',
189  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
190  static const WCHAR fmtid_badchar6W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
191  '1','2','3','X','-','1','2','3','4','-',
192  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
193  static const WCHAR fmtid_baddash3W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
194  '1','2','3','4','X','1','2','3','4','-',
195  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
196  static const WCHAR fmtid_badchar7W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
197  '1','2','3','4','-','X','2','3','4','-',
198  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
199  static const WCHAR fmtid_badchar8W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
200  '1','2','3','4','-','1','2','3','X','-',
201  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
202  static const WCHAR fmtid_baddash4W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
203  '1','2','3','4','-','1','2','3','4','X',
204  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
205  static const WCHAR fmtid_badchar9W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
206  '1','2','3','4','-','1','2','3','4','-',
207  'X','2','3','4','5','6','7','8','9','0','1','2','}',0};
208  static const WCHAR fmtid_badchar9_adjW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
209  '1','2','3','4','-','1','2','3','4','-',
210  '1','X','3','4','5','6','7','8','9','0','1','2','}',0};
211  static const WCHAR fmtid_badchar10W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
212  '1','2','3','4','-','1','2','3','4','-',
213  '1','2','X','4','5','6','7','8','9','0','1','2','}',0};
214  static const WCHAR fmtid_badchar11W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
215  '1','2','3','4','-','1','2','3','4','-',
216  '1','2','3','4','X','6','7','8','9','0','1','2','}',0};
217  static const WCHAR fmtid_badchar12W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
218  '1','2','3','4','-','1','2','3','4','-',
219  '1','2','3','4','5','6','X','8','9','0','1','2','}',0};
220  static const WCHAR fmtid_badchar13W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
221  '1','2','3','4','-','1','2','3','4','-',
222  '1','2','3','4','5','6','7','8','X','0','1','2','}',0};
223  static const WCHAR fmtid_badchar14W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
224  '1','2','3','4','-','1','2','3','4','-',
225  '1','2','3','4','5','6','7','8','9','0','X','2','}',0};
226  static const WCHAR fmtid_badbracket2W[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
227  '1','2','3','4','-','1','2','3','4','-',
228  '1','2','3','4','5','6','7','8','9','0','1','2','X',0};
229  static const WCHAR fmtid_spaceW[] = {' ','{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
230  '1','2','3','4','-','1','2','3','4','-',
231  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
232  static const WCHAR fmtid_spaceendW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
233  '1','2','3','4','-','1','2','3','4','-',
234  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',0};
235  static const WCHAR fmtid_spacesendW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
236  '1','2','3','4','-','1','2','3','4','-',
237  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',' ',' ',0};
238  static const WCHAR fmtid_nopidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
239  '1','2','3','4','-','1','2','3','4','-',
240  '1','2','3','4','5','6','7','8','9','0','1','2','}',0};
241  static const WCHAR fmtid_badpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
242  '1','2','3','4','-','1','2','3','4','-',
243  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','D','E','A','D',0};
244  static const WCHAR fmtid_adjpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
245  '1','2','3','4','-','1','2','3','4','-',
246  '1','2','3','4','5','6','7','8','9','0','1','2','}','1','3','5','7','9',0};
247  static const WCHAR fmtid_spacespidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
248  '1','2','3','4','-','1','2','3','4','-',
249  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',' ',' ','1','3','5','7','9',0};
250  static const WCHAR fmtid_negpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
251  '1','2','3','4','-','1','2','3','4','-',
252  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-','1','3','5','7','9',0};
253  static const WCHAR fmtid_negnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
254  '1','2','3','4','-','1','2','3','4','-',
255  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-','-','1','3','5','7','9',0};
256  static const WCHAR fmtid_negnegnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
257  '1','2','3','4','-','1','2','3','4','-',
258  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-','-','-','1','3','5','7','9',0};
259  static const WCHAR fmtid_negspacepidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
260  '1','2','3','4','-','1','2','3','4','-',
261  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-',' ','1','3','5','7','9',0};
262  static const WCHAR fmtid_negspacenegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
263  '1','2','3','4','-','1','2','3','4','-',
264  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-',' ','-','1','3','5','7','9',0};
265  static const WCHAR fmtid_negspacespidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
266  '1','2','3','4','-','1','2','3','4','-',
267  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','-',' ','-',' ','-','1','3','5','7','9',0};
268  static const WCHAR fmtid_pospidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
269  '1','2','3','4','-','1','2','3','4','-',
270  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','+','1','3','5','7','9',0};
271  static const WCHAR fmtid_posnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
272  '1','2','3','4','-','1','2','3','4','-',
273  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','+','-','+','-','1','3','5','7','9',0};
274  static const WCHAR fmtid_symbolpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
275  '1','2','3','4','-','1','2','3','4','-',
276  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','+','/','$','-','1','3','5','7','9',0};
277  static const WCHAR fmtid_letterpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
278  '1','2','3','4','-','1','2','3','4','-',
279  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','A','B','C','D','1','3','5','7','9',0};
280  static const WCHAR fmtid_spacepadpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
281  '1','2','3','4','-','1','2','3','4','-',
282  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','3','5','7','9',' ',' ',' ',0};
283  static const WCHAR fmtid_spacemixpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
284  '1','2','3','4','-','1','2','3','4','-',
285  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1',' ','3',' ','5','7','9',' ',' ',' ',0};
286  static const WCHAR fmtid_tabpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
287  '1','2','3','4','-','1','2','3','4','-',
288  '1','2','3','4','5','6','7','8','9','0','1','2','}','\t','1','3','5','7','9',0};
289  static const WCHAR fmtid_hexpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
290  '1','2','3','4','-','1','2','3','4','-',
291  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','0','x','D','E','A','D',0};
292  static const WCHAR fmtid_mixedpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
293  '1','2','3','4','-','1','2','3','4','-',
294  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','A','9','B','5','C','3','D','1',0};
295  static const WCHAR fmtid_overflowpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
296  '1','2','3','4','-','1','2','3','4','-',
297  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','2','3','4','5','6','7','8','9','0','1',0};
298  static const WCHAR fmtid_commapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
299  '1','2','3','4','-','1','2','3','4','-',
300  '1','2','3','4','5','6','7','8','9','0','1','2','}',',','1','3','5','7','9',0};
301  static const WCHAR fmtid_commaspidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
302  '1','2','3','4','-','1','2','3','4','-',
303  '1','2','3','4','5','6','7','8','9','0','1','2','}',',',',',',','1','3','5','7','9',0};
304  static const WCHAR fmtid_commaspacepidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
305  '1','2','3','4','-','1','2','3','4','-',
306  '1','2','3','4','5','6','7','8','9','0','1','2','}',',',' ','1','3','5','7','9',0};
307  static const WCHAR fmtid_spacecommapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
308  '1','2','3','4','-','1','2','3','4','-',
309  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',','1','3','5','7','9',0};
310  static const WCHAR fmtid_spccommaspcpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
311  '1','2','3','4','-','1','2','3','4','-',
312  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ','1','3','5','7','9',0};
313  static const WCHAR fmtid_spacescommaspidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
314  '1','2','3','4','-','1','2','3','4','-',
315  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ',',','1','3','5','7','9',0};
316  static const WCHAR fmtid_commanegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
317  '1','2','3','4','-','1','2','3','4','-',
318  '1','2','3','4','5','6','7','8','9','0','1','2','}',',','-','1','3','5','7','9',0};
319  static const WCHAR fmtid_spccommanegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
320  '1','2','3','4','-','1','2','3','4','-',
321  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',','-','1','3','5','7','9',0};
322  static const WCHAR fmtid_commaspcnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
323  '1','2','3','4','-','1','2','3','4','-',
324  '1','2','3','4','5','6','7','8','9','0','1','2','}',',',' ','-','1','3','5','7','9',0};
325  static const WCHAR fmtid_spccommaspcnegpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
326  '1','2','3','4','-','1','2','3','4','-',
327  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ',',',' ','-','1','3','5','7','9',0};
328  static const WCHAR fmtid_commanegspcpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
329  '1','2','3','4','-','1','2','3','4','-',
330  '1','2','3','4','5','6','7','8','9','0','1','2','}',',','-',' ','1','3','5','7','9',0};
331  static const WCHAR fmtid_negcommapidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
332  '1','2','3','4','-','1','2','3','4','-',
333  '1','2','3','4','5','6','7','8','9','0','1','2','}','-',',','1','3','5','7','9',0};
334  static const WCHAR fmtid_normalpidW[] = {'{','1','2','3','4','5','6','7','8','-','1','2','3','4','-',
335  '1','2','3','4','-','1','2','3','4','-',
336  '1','2','3','4','5','6','7','8','9','0','1','2','}',' ','1','3','5','7','9',0};
337  PROPERTYKEY out_init = {GUID_MEMBERS(dummy_guid), 0xdeadbeef};
338  PROPERTYKEY out;
339  HRESULT ret;
340 
341  const struct
342  {
343  LPCWSTR pwzString;
344  PROPERTYKEY *pkey;
345  HRESULT hr_expect;
346  PROPERTYKEY pkey_expect;
347  } testcases[] =
348  {
349  {NULL, NULL, E_POINTER},
350  {NULL, &out, E_POINTER, {GUID_MEMBERS(out_init.fmtid), out_init.pid}},
351  {emptyW, NULL, E_POINTER},
353  {fmtid_clsidW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}},
354  {fmtid_truncatedW, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0,0,0,0,0,0,0,0}}, 0}},
355  {fmtid_nobracketsW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}},
356  {fmtid_badbracketW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}},
357  {fmtid_badcharW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}},
358  {fmtid_badchar2W, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0}},
359  {fmtid_baddashW, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}},
360  {fmtid_badchar3W, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}},
361  {fmtid_badchar4W, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}},
362  {fmtid_baddash2W, &out, E_INVALIDARG, { {0x12345678,0,0,{0,0,0,0,0,0,0,0}}, 0}},
363  {fmtid_badchar5W, &out, E_INVALIDARG, { {0x12345678,0x1234,0,{0,0,0,0,0,0,0,0}}, 0}},
364  {fmtid_badchar6W, &out, E_INVALIDARG, { {0x12345678,0x1234,0,{0,0,0,0,0,0,0,0}}, 0}},
365  {fmtid_baddash3W, &out, E_INVALIDARG, { {0x12345678,0x1234,0,{0,0,0,0,0,0,0,0}}, 0}},
366  {fmtid_badchar7W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0,0,0,0,0,0,0,0}}, 0}},
367  {fmtid_badchar8W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0,0,0,0,0,0,0}}, 0}},
368  {fmtid_baddash4W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0,0,0,0,0,0,0}}, 0}},
369  {fmtid_badchar9W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0,0,0,0,0,0}}, 0}},
370  {fmtid_badchar9_adjW, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0,0,0,0,0,0}}, 0}},
371  {fmtid_badchar10W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0,0,0,0,0}}, 0}},
372  {fmtid_badchar11W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0,0,0,0}}, 0}},
373  {fmtid_badchar12W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0,0,0}}, 0}},
374  {fmtid_badchar13W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0,0}}, 0}},
375  {fmtid_badchar14W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x90,0}}, 0}},
376  {fmtid_badbracket2W, &out, E_INVALIDARG, { {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x90,0x00}}, 0 }},
377  {fmtid_spaceW, &out, E_INVALIDARG, {GUID_MEMBERS(GUID_NULL), 0 }},
378  {fmtid_spaceendW, &out, E_INVALIDARG, {GUID_MEMBERS(expect_guid), 0}},
379  {fmtid_spacesendW, &out, E_INVALIDARG, {GUID_MEMBERS(expect_guid), 0}},
380  {fmtid_nopidW, &out, E_INVALIDARG, {GUID_MEMBERS(expect_guid), 0}},
381  {fmtid_badpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
382  {fmtid_adjpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
383  {fmtid_spacespidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
384  {fmtid_negpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
385  {fmtid_negnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}},
386  {fmtid_negnegnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
387  {fmtid_negspacepidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
388  {fmtid_negspacenegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}},
389  {fmtid_negspacespidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
390  {fmtid_pospidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
391  {fmtid_posnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
392  {fmtid_symbolpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
393  {fmtid_letterpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
394  {fmtid_spacepadpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
395  {fmtid_spacemixpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 1}},
396  {fmtid_tabpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
397  {fmtid_hexpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
398  {fmtid_mixedpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
399  {fmtid_overflowpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 3755744309U}},
400  {fmtid_commapidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
401  {fmtid_commaspidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
402  {fmtid_commaspacepidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
403  {fmtid_spacecommapidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
404  {fmtid_spccommaspcpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
405  {fmtid_spacescommaspidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
406  {fmtid_commanegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}},
407  {fmtid_spccommanegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}},
408  {fmtid_commaspcnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}},
409  {fmtid_spccommaspcnegpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 4294953717U}},
410  {fmtid_commanegspcpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0U}},
411  {fmtid_negcommapidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 0}},
412  {fmtid_normalpidW, &out, S_OK, {GUID_MEMBERS(expect_guid), 13579}},
413  };
414 
415  int i;
416 
417  for (i = 0; i < ARRAY_SIZE(testcases); i++)
418  {
419  if (testcases[i].pkey)
420  *testcases[i].pkey = out_init;
421 
422  ret = PSPropertyKeyFromString(testcases[i].pwzString, testcases[i].pkey);
423  ok(ret == testcases[i].hr_expect,
424  "[%d] Expected PSPropertyKeyFromString to return 0x%08x, got 0x%08x\n",
425  i, testcases[i].hr_expect, ret);
426 
427  if (testcases[i].pkey)
428  {
429  ok(IsEqualGUID(&testcases[i].pkey->fmtid, &testcases[i].pkey_expect.fmtid),
430  "[%d] Expected GUID %s, got %s\n",
431  i, wine_dbgstr_guid(&testcases[i].pkey_expect.fmtid), wine_dbgstr_guid(&testcases[i].pkey->fmtid));
432  ok(testcases[i].pkey->pid == testcases[i].pkey_expect.pid,
433  "[%d] Expected property ID %u, got %u\n",
434  i, testcases[i].pkey_expect.pid, testcases[i].pkey->pid);
435  }
436  }
437 }
438 
440 {
441  HRESULT ret;
442 
444  todo_wine
446  "Expected PSRefreshPropertySchema to return CO_E_NOTINITIALIZED, got 0x%08x\n", ret);
447 
449 
451  ok(ret == S_OK,
452  "Expected PSRefreshPropertySchema to return S_OK, got 0x%08x\n", ret);
453 
454  CoUninitialize();
455 }
456 
458 {
459  PROPVARIANT propvar;
460  VARIANT var;
461  HRESULT hres;
462  int i;
463 
464  const struct {
465  REFGUID guid;
466  const char *str;
467  } testcases[] = {
468  {&IID_NULL, "{00000000-0000-0000-0000-000000000000}" },
469  {&dummy_guid, "{DEADBEEF-DEAD-BEEF-DEAD-BEEFCAFEBABE}" },
470  };
471 
473  ok(hres == E_FAIL, "InitPropVariantFromGUIDAsString returned %x\n", hres);
474 
475  if(0) {
476  /* Returns strange data on Win7, crashes on older systems */
478 
479  /* Crashes on windows */
482  }
483 
484  for(i=0; i < ARRAY_SIZE(testcases); i++) {
485  memset(&propvar, 0, sizeof(PROPVARIANT));
486  hres = InitPropVariantFromGUIDAsString(testcases[i].guid, &propvar);
487  ok(hres == S_OK, "%d) InitPropVariantFromGUIDAsString returned %x\n", i, hres);
488  ok(propvar.vt == VT_LPWSTR, "%d) propvar.vt = %d\n", i, propvar.vt);
489  ok(!strcmp_wa(propvar.u.pwszVal, testcases[i].str), "%d) propvar.u.pwszVal = %s\n",
490  i, wine_dbgstr_w(propvar.u.pwszVal));
491  CoTaskMemFree(propvar.u.pwszVal);
492 
493  memset(&var, 0, sizeof(VARIANT));
494  hres = InitVariantFromGUIDAsString(testcases[i].guid, &var);
495  ok(hres == S_OK, "%d) InitVariantFromGUIDAsString returned %x\n", i, hres);
496  ok(V_VT(&var) == VT_BSTR, "%d) V_VT(&var) = %d\n", i, V_VT(&var));
497  ok(SysStringLen(V_BSTR(&var)) == 38, "SysStringLen returned %d\n",
498  SysStringLen(V_BSTR(&var)));
499  ok(!strcmp_wa(V_BSTR(&var), testcases[i].str), "%d) V_BSTR(&var) = %s\n",
500  i, wine_dbgstr_w(V_BSTR(&var)));
501  VariantClear(&var);
502  }
503 }
504 
506 {
507  static const char data_in[] = "test";
508  PROPVARIANT propvar;
509  VARIANT var;
510  HRESULT hres;
511  void *data_out;
512  LONG size;
513 
514  hres = InitPropVariantFromBuffer(NULL, 0, &propvar);
515  ok(hres == S_OK, "InitPropVariantFromBuffer returned %x\n", hres);
516  ok(propvar.vt == (VT_VECTOR|VT_UI1), "propvar.vt = %d\n", propvar.vt);
517  ok(propvar.u.caub.cElems == 0, "cElems = %d\n", propvar.u.caub.cElems == 0);
518  PropVariantClear(&propvar);
519 
520  hres = InitPropVariantFromBuffer(data_in, 4, &propvar);
521  ok(hres == S_OK, "InitPropVariantFromBuffer returned %x\n", hres);
522  ok(propvar.vt == (VT_VECTOR|VT_UI1), "propvar.vt = %d\n", propvar.vt);
523  ok(propvar.u.caub.cElems == 4, "cElems = %d\n", propvar.u.caub.cElems == 0);
524  ok(!memcmp(propvar.u.caub.pElems, data_in, 4), "Data inside array is incorrect\n");
525  PropVariantClear(&propvar);
526 
528  ok(hres == S_OK, "InitVariantFromBuffer returned %x\n", hres);
529  ok(V_VT(&var) == (VT_ARRAY|VT_UI1), "V_VT(&var) = %d\n", V_VT(&var));
531  ok(size == 1, "SafeArrayGetDim returned %d\n", size);
533  ok(hres == S_OK, "SafeArrayGetLBound returned %x\n", hres);
534  ok(size == 0, "LBound = %d\n", size);
536  ok(hres == S_OK, "SafeArrayGetUBound returned %x\n", hres);
537  ok(size == -1, "UBound = %d\n", size);
538  VariantClear(&var);
539 
540  hres = InitVariantFromBuffer(data_in, 4, &var);
541  ok(hres == S_OK, "InitVariantFromBuffer returned %x\n", hres);
542  ok(V_VT(&var) == (VT_ARRAY|VT_UI1), "V_VT(&var) = %d\n", V_VT(&var));
544  ok(size == 1, "SafeArrayGetDim returned %d\n", size);
546  ok(hres == S_OK, "SafeArrayGetLBound returned %x\n", hres);
547  ok(size == 0, "LBound = %d\n", size);
549  ok(hres == S_OK, "SafeArrayGetUBound returned %x\n", hres);
550  ok(size == 3, "UBound = %d\n", size);
551  hres = SafeArrayAccessData(V_ARRAY(&var), &data_out);
552  ok(hres == S_OK, "SafeArrayAccessData failed %x\n", hres);
553  ok(!memcmp(data_in, data_out, 4), "Data inside safe array is incorrect\n");
555  ok(hres == S_OK, "SafeArrayUnaccessData failed %x\n", hres);
556  VariantClear(&var);
557 }
558 
559 static void test_PropVariantToGUID(void)
560 {
561  PROPVARIANT propvar;
562  VARIANT var;
563  GUID guid;
564  HRESULT hres;
565 
567  ok(hres == S_OK, "InitPropVariantFromGUIDAsString failed %x\n", hres);
568 
569  hres = PropVariantToGUID(&propvar, &guid);
570  ok(hres == S_OK, "PropVariantToGUID failed %x\n", hres);
571  ok(IsEqualGUID(&IID_NULL, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
572  PropVariantClear(&propvar);
573 
574  hres = InitPropVariantFromGUIDAsString(&dummy_guid, &propvar);
575  ok(hres == S_OK, "InitPropVariantFromGUIDAsString failed %x\n", hres);
576 
577  hres = PropVariantToGUID(&propvar, &guid);
578  ok(hres == S_OK, "PropVariantToGUID failed %x\n", hres);
579  ok(IsEqualGUID(&dummy_guid, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
580 
581  ok(propvar.vt == VT_LPWSTR, "incorrect PROPVARIANT type: %d\n", propvar.vt);
582  propvar.u.pwszVal[1] = 'd';
583  propvar.u.pwszVal[2] = 'E';
584  propvar.u.pwszVal[3] = 'a';
585  hres = PropVariantToGUID(&propvar, &guid);
586  ok(hres == S_OK, "PropVariantToGUID failed %x\n", hres);
587  ok(IsEqualGUID(&dummy_guid, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
588 
589  propvar.u.pwszVal[1] = 'z';
590  hres = PropVariantToGUID(&propvar, &guid);
591  ok(hres == E_INVALIDARG, "PropVariantToGUID returned %x\n", hres);
592  PropVariantClear(&propvar);
593 
594 
596  ok(hres == S_OK, "InitVariantFromGUIDAsString failed %x\n", hres);
597 
598  hres = VariantToGUID(&var, &guid);
599  ok(hres == S_OK, "VariantToGUID failed %x\n", hres);
600  ok(IsEqualGUID(&IID_NULL, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
601  VariantClear(&var);
602 
603  hres = InitVariantFromGUIDAsString(&dummy_guid, &var);
604  ok(hres == S_OK, "InitVariantFromGUIDAsString failed %x\n", hres);
605 
606  hres = VariantToGUID(&var, &guid);
607  ok(hres == S_OK, "VariantToGUID failed %x\n", hres);
608  ok(IsEqualGUID(&dummy_guid, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
609 
610  ok(V_VT(&var) == VT_BSTR, "incorrect VARIANT type: %d\n", V_VT(&var));
611  V_BSTR(&var)[1] = 'z';
612  hres = VariantToGUID(&var, &guid);
613  ok(hres == E_FAIL, "VariantToGUID returned %x\n", hres);
614 
615  V_BSTR(&var)[1] = 'd';
616  propvar.vt = V_VT(&var);
617  propvar.u.bstrVal = V_BSTR(&var);
618  V_VT(&var) = VT_EMPTY;
619  hres = PropVariantToGUID(&propvar, &guid);
620  ok(hres == S_OK, "PropVariantToGUID failed %x\n", hres);
621  ok(IsEqualGUID(&dummy_guid, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
622  PropVariantClear(&propvar);
623 
624  memset(&guid, 0, sizeof(guid));
625  InitPropVariantFromCLSID(&dummy_guid, &propvar);
626  hres = PropVariantToGUID(&propvar, &guid);
627  ok(hres == S_OK, "PropVariantToGUID failed %x\n", hres);
628  ok(IsEqualGUID(&dummy_guid, &guid), "incorrect GUID created: %s\n", wine_dbgstr_guid(&guid));
629  PropVariantClear(&propvar);
630 }
631 
633 {
634  PROPVARIANT prop;
635  WCHAR *str;
636  HRESULT hres;
637 
638  prop.vt = VT_NULL;
639  hres = PropVariantToStringAlloc(&prop, &str);
640  ok(hres == S_OK, "returned %x\n", hres);
641  ok(!lstrcmpW(str, emptyW), "got %s\n", wine_dbgstr_w(str));
643 
644  prop.vt = VT_LPSTR;
645  prop.u.pszVal = CoTaskMemAlloc(strlen(topic)+1);
646  strcpy(prop.u.pszVal, topic);
647  hres = PropVariantToStringAlloc(&prop, &str);
648  ok(hres == S_OK, "returned %x\n", hres);
649  ok(!lstrcmpW(str, topicW), "got %s\n", wine_dbgstr_w(str));
651  PropVariantClear(&prop);
652 
653  prop.vt = VT_EMPTY;
654  hres = PropVariantToStringAlloc(&prop, &str);
655  ok(hres == S_OK, "returned %x\n", hres);
656  ok(!lstrcmpW(str, emptyW), "got %s\n", wine_dbgstr_w(str));
658 }
659 
660 static void test_PropVariantCompare(void)
661 {
662  PROPVARIANT empty, null, emptyarray, i2_0, i2_2, i4_large, i4_largeneg, i4_2, str_2, str_02, str_b;
663  PROPVARIANT clsid_null, clsid, clsid2, r4_0, r4_2, r8_0, r8_2;
664  INT res;
665  static const WCHAR str_2W[] = {'2', 0};
666  static const WCHAR str_02W[] = {'0', '2', 0};
667  static const WCHAR str_bW[] = {'b', 0};
668  SAFEARRAY emptysafearray;
669 
670  PropVariantInit(&empty);
671  PropVariantInit(&null);
672  PropVariantInit(&emptyarray);
673  PropVariantInit(&i2_0);
674  PropVariantInit(&i2_2);
675  PropVariantInit(&i4_large);
676  PropVariantInit(&i4_largeneg);
677  PropVariantInit(&i4_2);
678  PropVariantInit(&str_2);
679  PropVariantInit(&str_b);
680 
681  empty.vt = VT_EMPTY;
682  null.vt = VT_NULL;
683  emptyarray.vt = VT_ARRAY | VT_I4;
684  emptyarray.u.parray = &emptysafearray;
685  emptysafearray.cDims = 1;
686  emptysafearray.fFeatures = FADF_FIXEDSIZE;
687  emptysafearray.cbElements = 4;
688  emptysafearray.cLocks = 0;
689  emptysafearray.pvData = NULL;
690  emptysafearray.rgsabound[0].cElements = 0;
691  emptysafearray.rgsabound[0].lLbound = 0;
692  i2_0.vt = VT_I2;
693  i2_0.u.iVal = 0;
694  i2_2.vt = VT_I2;
695  i2_2.u.iVal = 2;
696  i4_large.vt = VT_I4;
697  i4_large.u.lVal = 65536;
698  i4_largeneg.vt = VT_I4;
699  i4_largeneg.u.lVal = -65536;
700  i4_2.vt = VT_I4;
701  i4_2.u.lVal = 2;
702  str_2.vt = VT_BSTR;
703  str_2.u.bstrVal = SysAllocString(str_2W);
704  str_02.vt = VT_BSTR;
705  str_02.u.bstrVal = SysAllocString(str_02W);
706  str_b.vt = VT_BSTR;
707  str_b.u.bstrVal = SysAllocString(str_bW);
708  clsid_null.vt = VT_CLSID;
709  clsid_null.u.puuid = NULL;
710  clsid.vt = VT_CLSID;
711  clsid.u.puuid = (GUID *)&dummy_guid;
712  clsid2.vt = VT_CLSID;
713  clsid2.u.puuid = (GUID *)&GUID_NULL;
714  r4_0.vt = VT_R4;
715  r4_0.u.fltVal = 0.0f;
716  r4_2.vt = VT_R4;
717  r4_2.u.fltVal = 2.0f;
718  r8_0.vt = VT_R8;
719  r8_0.u.dblVal = 0.0;
720  r8_2.vt = VT_R8;
721  r8_2.u.dblVal = 2.0;
722 
723  res = PropVariantCompareEx(&empty, &empty, 0, 0);
724  ok(res == 0, "res=%i\n", res);
725 
726  res = PropVariantCompareEx(&empty, &null, 0, 0);
727  ok(res == 0, "res=%i\n", res);
728 
729  res = PropVariantCompareEx(&null, &emptyarray, 0, 0);
730  ok(res == 0, "res=%i\n", res);
731 
732  res = PropVariantCompareEx(&null, &i2_0, 0, 0);
733  ok(res == -1, "res=%i\n", res);
734 
735  res = PropVariantCompareEx(&i2_0, &null, 0, 0);
736  ok(res == 1, "res=%i\n", res);
737 
739  ok(res == 1, "res=%i\n", res);
740 
742  ok(res == -1, "res=%i\n", res);
743 
744  res = PropVariantCompareEx(&i2_2, &i2_0, 0, 0);
745  ok(res == 1, "res=%i\n", res);
746 
747  res = PropVariantCompareEx(&i2_0, &i2_2, 0, 0);
748  ok(res == -1, "res=%i\n", res);
749 
750  /* Always return -1 if second value cannot be converted to first type */
751  res = PropVariantCompareEx(&i2_0, &i4_large, 0, 0);
752  ok(res == -1, "res=%i\n", res);
753 
754  res = PropVariantCompareEx(&i2_0, &i4_largeneg, 0, 0);
755  ok(res == -1, "res=%i\n", res);
756 
757  res = PropVariantCompareEx(&i4_large, &i2_0, 0, 0);
758  ok(res == 1, "res=%i\n", res);
759 
760  res = PropVariantCompareEx(&i4_largeneg, &i2_0, 0, 0);
761  ok(res == -1, "res=%i\n", res);
762 
763  res = PropVariantCompareEx(&i2_2, &i4_2, 0, 0);
764  ok(res == 0, "res=%i\n", res);
765 
766  res = PropVariantCompareEx(&i2_2, &str_2, 0, 0);
767  ok(res == 0, "res=%i\n", res);
768 
769  res = PropVariantCompareEx(&i2_2, &str_02, 0, 0);
770  ok(res == 0, "res=%i\n", res);
771 
772  res = PropVariantCompareEx(&str_2, &i2_2, 0, 0);
773  todo_wine ok(res == 0, "res=%i\n", res);
774 
775  res = PropVariantCompareEx(&str_02, &i2_2, 0, 0);
776  ok(res == -1, "res=%i\n", res);
777 
778  res = PropVariantCompareEx(&str_02, &str_2, 0, 0);
779  ok(res == -1, "res=%i\n", res);
780 
781  res = PropVariantCompareEx(&str_02, &str_b, 0, 0);
782  ok(res == -1, "res=%i\n", res);
783 
784  res = PropVariantCompareEx(&str_2, &str_02, 0, 0);
785  ok(res == 1, "res=%i\n", res);
786 
787  res = PropVariantCompareEx(&i4_large, &str_b, 0, 0);
788  todo_wine ok(res == -5 /* ??? */, "res=%i\n", res);
789 
790  /* VT_CLSID */
791  res = PropVariantCompareEx(&clsid_null, &clsid_null, 0, 0);
792  ok(res == 0, "res=%i\n", res);
793 
794  res = PropVariantCompareEx(&clsid_null, &clsid_null, 0, PVCF_TREATEMPTYASGREATERTHAN);
795  ok(res == 0, "res=%i\n", res);
796 
797  res = PropVariantCompareEx(&clsid, &clsid, 0, 0);
798  ok(res == 0, "res=%i\n", res);
799 
800  res = PropVariantCompareEx(&clsid, &clsid2, 0, 0);
801  ok(res == 1, "res=%i\n", res);
802 
803  res = PropVariantCompareEx(&clsid2, &clsid, 0, 0);
804  ok(res == -1, "res=%i\n", res);
805 
806  res = PropVariantCompareEx(&clsid_null, &clsid, 0, 0);
807  ok(res == -1, "res=%i\n", res);
808 
809  res = PropVariantCompareEx(&clsid, &clsid_null, 0, 0);
810  ok(res == 1, "res=%i\n", res);
811 
813  ok(res == 1, "res=%i\n", res);
814 
816  ok(res == -1, "res=%i\n", res);
817 
818  /* VT_R4/VT_R8 */
819  res = PropVariantCompareEx(&r4_0, &r8_0, 0, 0);
820 todo_wine
821  ok(res == 0, "res=%i\n", res);
822 
823  res = PropVariantCompareEx(&r4_0, &r4_0, 0, 0);
824  ok(res == 0, "res=%i\n", res);
825 
826  res = PropVariantCompareEx(&r4_0, &r4_2, 0, 0);
827  ok(res == -1, "res=%i\n", res);
828 
829  res = PropVariantCompareEx(&r4_2, &r4_0, 0, 0);
830  ok(res == 1, "res=%i\n", res);
831 
832  res = PropVariantCompareEx(&r8_0, &r8_0, 0, 0);
833  ok(res == 0, "res=%i\n", res);
834 
835  res = PropVariantCompareEx(&r8_0, &r8_2, 0, 0);
836  ok(res == -1, "res=%i\n", res);
837 
838  res = PropVariantCompareEx(&r8_2, &r8_0, 0, 0);
839  ok(res == 1, "res=%i\n", res);
840 
841  SysFreeString(str_2.u.bstrVal);
842  SysFreeString(str_02.u.bstrVal);
843  SysFreeString(str_b.u.bstrVal);
844 }
845 
846 static void test_intconversions(void)
847 {
848  PROPVARIANT propvar;
849  SHORT sval;
850  USHORT usval;
851  LONG lval;
852  ULONG ulval;
853  LONGLONG llval;
854  ULONGLONG ullval;
855  HRESULT hr;
856 
857  propvar.vt = 0xdead;
858  hr = PropVariantClear(&propvar);
859  ok (FAILED(hr), "PropVariantClear fails on invalid vt.\n");
860 
861  propvar.vt = VT_I8;
862  PropVariantClear(&propvar);
863 
864  propvar.vt = VT_I8;
865  propvar.u.hVal.QuadPart = (ULONGLONG)1 << 63;
866 
867  hr = PropVariantToInt64(&propvar, &llval);
868  ok(hr == S_OK, "hr=%x\n", hr);
869  ok(llval == (ULONGLONG)1 << 63, "got wrong value %s\n", wine_dbgstr_longlong(llval));
870 
871  hr = PropVariantToUInt64(&propvar, &ullval);
873 
874  hr = PropVariantToInt32(&propvar, &lval);
876 
877  hr = PropVariantToUInt32(&propvar, &ulval);
879 
880  hr = PropVariantToInt16(&propvar, &sval);
882 
883  hr = PropVariantToUInt16(&propvar, &usval);
885 
886  propvar.vt = VT_UI8;
887  propvar.u.uhVal.QuadPart = 5;
888 
889  hr = PropVariantToInt64(&propvar, &llval);
890  ok(hr == S_OK, "hr=%x\n", hr);
891  ok(llval == 5, "got wrong value %s\n", wine_dbgstr_longlong(llval));
892 
893  hr = PropVariantToUInt64(&propvar, &ullval);
894  ok(hr == S_OK, "hr=%x\n", hr);
895  ok(ullval == 5, "got wrong value %s\n", wine_dbgstr_longlong(ullval));
896 
897  hr = PropVariantToInt32(&propvar, &lval);
898  ok(hr == S_OK, "hr=%x\n", hr);
899  ok(lval == 5, "got wrong value %d\n", lval);
900 
901  hr = PropVariantToUInt32(&propvar, &ulval);
902  ok(hr == S_OK, "hr=%x\n", hr);
903  ok(ulval == 5, "got wrong value %d\n", ulval);
904 
905  hr = PropVariantToInt16(&propvar, &sval);
906  ok(hr == S_OK, "hr=%x\n", hr);
907  ok(sval == 5, "got wrong value %d\n", sval);
908 
909  hr = PropVariantToUInt16(&propvar, &usval);
910  ok(hr == S_OK, "hr=%x\n", hr);
911  ok(usval == 5, "got wrong value %d\n", usval);
912 
913  propvar.vt = VT_I8;
914  propvar.u.hVal.QuadPart = -5;
915 
916  hr = PropVariantToInt64(&propvar, &llval);
917  ok(hr == S_OK, "hr=%x\n", hr);
918  ok(llval == -5, "got wrong value %s\n", wine_dbgstr_longlong(llval));
919 
920  hr = PropVariantToUInt64(&propvar, &ullval);
922 
923  hr = PropVariantToInt32(&propvar, &lval);
924  ok(hr == S_OK, "hr=%x\n", hr);
925  ok(lval == -5, "got wrong value %d\n", lval);
926 
927  hr = PropVariantToUInt32(&propvar, &ulval);
929 
930  hr = PropVariantToInt16(&propvar, &sval);
931  ok(hr == S_OK, "hr=%x\n", hr);
932  ok(sval == -5, "got wrong value %d\n", sval);
933 
934  hr = PropVariantToUInt16(&propvar, &usval);
936 
937  propvar.vt = VT_UI4;
938  propvar.u.ulVal = 6;
939 
940  hr = PropVariantToInt64(&propvar, &llval);
941  ok(hr == S_OK, "hr=%x\n", hr);
942  ok(llval == 6, "got wrong value %s\n", wine_dbgstr_longlong(llval));
943 
944  propvar.vt = VT_I4;
945  propvar.u.lVal = -6;
946 
947  hr = PropVariantToInt64(&propvar, &llval);
948  ok(hr == S_OK, "hr=%x\n", hr);
949  ok(llval == -6, "got wrong value %s\n", wine_dbgstr_longlong(llval));
950 
951  propvar.vt = VT_UI2;
952  propvar.u.uiVal = 7;
953 
954  hr = PropVariantToInt64(&propvar, &llval);
955  ok(hr == S_OK, "hr=%x\n", hr);
956  ok(llval == 7, "got wrong value %s\n", wine_dbgstr_longlong(llval));
957 
958  propvar.vt = VT_I2;
959  propvar.u.iVal = -7;
960 
961  hr = PropVariantToInt64(&propvar, &llval);
962  ok(hr == S_OK, "hr=%x\n", hr);
963  ok(llval == -7, "got wrong value %s\n", wine_dbgstr_longlong(llval));
964 }
965 
966 static void test_PropVariantToBoolean(void)
967 {
968  static WCHAR str_0[] = {'0',0};
969  static WCHAR str_1[] = {'1',0};
970  static WCHAR str_7[] = {'7',0};
971  static WCHAR str_n7[] = {'-','7',0};
972  static WCHAR str_true[] = {'t','r','u','e',0};
973  static WCHAR str_true2[] = {'#','T','R','U','E','#',0};
974  static WCHAR str_true_case[] = {'t','R','U','e',0};
975  static WCHAR str_false[] = {'f','a','l','s','e',0};
976  static WCHAR str_false2[] = {'#','F','A','L','S','E','#',0};
977  static WCHAR str_true_space[] = {'t','r','u','e',' ',0};
978  static WCHAR str_yes[] = {'y','e','s',0};
979  PROPVARIANT propvar;
980  HRESULT hr;
981  BOOL val;
982 
983  /* VT_BOOL */
984  propvar.vt = VT_BOOL;
985  propvar.u.boolVal = VARIANT_FALSE;
986  val = TRUE;
987  hr = PropVariantToBoolean(&propvar, &val);
988  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
989  ok(val == FALSE, "Unexpected value %d\n", val);
990 
991  propvar.vt = VT_BOOL;
992  propvar.u.boolVal = 1;
993  val = TRUE;
994  hr = PropVariantToBoolean(&propvar, &val);
995  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
996  ok(val == FALSE, "Unexpected value %d\n", val);
997 
998  propvar.vt = VT_BOOL;
999  propvar.u.boolVal = VARIANT_TRUE;
1000  val = FALSE;
1001  hr = PropVariantToBoolean(&propvar, &val);
1002  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1003  ok(val == TRUE, "Unexpected value %d\n", val);
1004 
1005  /* VT_EMPTY */
1006  propvar.vt = VT_EMPTY;
1007  propvar.u.boolVal = VARIANT_TRUE;
1008  val = TRUE;
1009  hr = PropVariantToBoolean(&propvar, &val);
1010  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1011  ok(val == FALSE, "Unexpected value %d\n", val);
1012 
1013  /* test integer conversion */
1014  propvar.vt = VT_I4;
1015  propvar.u.lVal = 0;
1016  val = TRUE;
1017  hr = PropVariantToBoolean(&propvar, &val);
1018  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1019  ok(val == FALSE, "Unexpected value %d\n", val);
1020 
1021  propvar.vt = VT_I4;
1022  propvar.u.lVal = 1;
1023  val = FALSE;
1024  hr = PropVariantToBoolean(&propvar, &val);
1025  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1026  ok(val == TRUE, "Unexpected value %d\n", val);
1027 
1028  propvar.vt = VT_I4;
1029  propvar.u.lVal = 67;
1030  val = FALSE;
1031  hr = PropVariantToBoolean(&propvar, &val);
1032  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1033  ok(val == TRUE, "Unexpected value %d\n", val);
1034 
1035  propvar.vt = VT_I4;
1036  propvar.u.lVal = -67;
1037  val = FALSE;
1038  hr = PropVariantToBoolean(&propvar, &val);
1039  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1040  ok(val == TRUE, "Unexpected value %d\n", val);
1041 
1042  /* test string conversion */
1043  propvar.vt = VT_LPWSTR;
1044  propvar.u.pwszVal = str_0;
1045  val = TRUE;
1046  hr = PropVariantToBoolean(&propvar, &val);
1047  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1048  ok(val == FALSE, "Unexpected value %d\n", val);
1049 
1050  propvar.vt = VT_LPWSTR;
1051  propvar.u.pwszVal = str_1;
1052  val = FALSE;
1053  hr = PropVariantToBoolean(&propvar, &val);
1054  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1055  ok(val == TRUE, "Unexpected value %d\n", val);
1056 
1057  propvar.vt = VT_LPWSTR;
1058  propvar.u.pwszVal = str_7;
1059  val = FALSE;
1060  hr = PropVariantToBoolean(&propvar, &val);
1061  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1062  ok(val == TRUE, "Unexpected value %d\n", val);
1063 
1064  propvar.vt = VT_LPWSTR;
1065  propvar.u.pwszVal = str_n7;
1066  val = FALSE;
1067  hr = PropVariantToBoolean(&propvar, &val);
1068  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1069  ok(val == TRUE, "Unexpected value %d\n", val);
1070 
1071  propvar.vt = VT_LPWSTR;
1072  propvar.u.pwszVal = str_true;
1073  val = FALSE;
1074  hr = PropVariantToBoolean(&propvar, &val);
1075  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1076  ok(val == TRUE, "Unexpected value %d\n", val);
1077 
1078  propvar.vt = VT_LPWSTR;
1079  propvar.u.pwszVal = str_true_case;
1080  val = FALSE;
1081  hr = PropVariantToBoolean(&propvar, &val);
1082  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1083  ok(val == TRUE, "Unexpected value %d\n", val);
1084 
1085  propvar.vt = VT_LPWSTR;
1086  propvar.u.pwszVal = str_true2;
1087  val = FALSE;
1088  hr = PropVariantToBoolean(&propvar, &val);
1089  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1090  ok(val == TRUE, "Unexpected value %d\n", val);
1091 
1092  propvar.vt = VT_LPWSTR;
1093  propvar.u.pwszVal = str_false;
1094  val = TRUE;
1095  hr = PropVariantToBoolean(&propvar, &val);
1096  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1097  ok(val == FALSE, "Unexpected value %d\n", val);
1098 
1099  propvar.vt = VT_LPWSTR;
1100  propvar.u.pwszVal = str_false2;
1101  val = TRUE;
1102  hr = PropVariantToBoolean(&propvar, &val);
1103  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1104  ok(val == FALSE, "Unexpected value %d\n", val);
1105 
1106  propvar.vt = VT_LPWSTR;
1107  propvar.u.pwszVal = str_true_space;
1108  val = TRUE;
1109  hr = PropVariantToBoolean(&propvar, &val);
1110  ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#x.\n", hr);
1111  ok(val == FALSE, "Unexpected value %d\n", val);
1112 
1113  propvar.vt = VT_LPWSTR;
1114  propvar.u.pwszVal = str_yes;
1115  val = TRUE;
1116  hr = PropVariantToBoolean(&propvar, &val);
1117  ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#x.\n", hr);
1118  ok(val == FALSE, "Unexpected value %d\n", val);
1119 
1120  propvar.vt = VT_LPWSTR;
1121  propvar.u.pwszVal = NULL;
1122  val = TRUE;
1123  hr = PropVariantToBoolean(&propvar, &val);
1124  ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#x.\n", hr);
1125  ok(val == FALSE, "Unexpected value %d\n", val);
1126 
1127  /* VT_LPSTR */
1128  propvar.vt = VT_LPSTR;
1129  propvar.u.pszVal = (char *)"#TruE#";
1130  val = TRUE;
1131  hr = PropVariantToBoolean(&propvar, &val);
1132  ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#x.\n", hr);
1133  ok(val == FALSE, "Unexpected value %d\n", val);
1134 
1135  propvar.vt = VT_LPSTR;
1136  propvar.u.pszVal = (char *)"#TRUE#";
1137  val = FALSE;
1138  hr = PropVariantToBoolean(&propvar, &val);
1139  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1140  ok(val == TRUE, "Unexpected value %d\n", val);
1141 
1142  propvar.vt = VT_LPSTR;
1143  propvar.u.pszVal = (char *)"tRUe";
1144  val = FALSE;
1145  hr = PropVariantToBoolean(&propvar, &val);
1146  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1147  ok(val == TRUE, "Unexpected value %d\n", val);
1148 
1149  propvar.vt = VT_LPSTR;
1150  propvar.u.pszVal = (char *)"#FALSE#";
1151  val = TRUE;
1152  hr = PropVariantToBoolean(&propvar, &val);
1153  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1154  ok(val == FALSE, "Unexpected value %d\n", val);
1155 
1156  propvar.vt = VT_LPSTR;
1157  propvar.u.pszVal = (char *)"fALSe";
1158  val = TRUE;
1159  hr = PropVariantToBoolean(&propvar, &val);
1160  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1161  ok(val == FALSE, "Unexpected value %d\n", val);
1162 
1163  propvar.vt = VT_LPSTR;
1164  propvar.u.pszVal = (char *)"1";
1165  val = FALSE;
1166  hr = PropVariantToBoolean(&propvar, &val);
1167  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1168  ok(val == TRUE, "Unexpected value %d\n", val);
1169 
1170  propvar.vt = VT_LPSTR;
1171  propvar.u.pszVal = (char *)"-1";
1172  hr = PropVariantToBoolean(&propvar, &val);
1173  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1174  ok(val == TRUE, "Unexpected value %d\n", val);
1175 }
1176 
1178 {
1179  PROPVARIANT propvar;
1180  static WCHAR default_value[] = {'t', 'e', 's', 't', 0};
1181  static WCHAR wstr_test2[] = {'t', 'e', 's', 't', '2', 0};
1182  static WCHAR wstr_empty[] = {0};
1183  static WCHAR wstr_space[] = {' ', 0};
1184  static CHAR str_test2[] = "test2";
1185  static CHAR str_empty[] = "";
1186  static CHAR str_space[] = " ";
1187  LPCWSTR result;
1188 
1189  propvar.vt = VT_EMPTY;
1190  result = PropVariantToStringWithDefault(&propvar, default_value);
1191  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1192 
1193  propvar.vt = VT_NULL;
1194  result = PropVariantToStringWithDefault(&propvar, default_value);
1195  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1196 
1197  propvar.vt = VT_BOOL;
1198  propvar.u.boolVal = VARIANT_TRUE;
1199  result = PropVariantToStringWithDefault(&propvar, default_value);
1200  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1201 
1202  propvar.vt = VT_I4;
1203  propvar.u.lVal = 15;
1204  result = PropVariantToStringWithDefault(&propvar, default_value);
1205  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1206 
1207  /* VT_LPWSTR */
1208 
1209  propvar.vt = VT_LPWSTR;
1210  propvar.u.pwszVal = NULL;
1211  result = PropVariantToStringWithDefault(&propvar, default_value);
1212  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1213 
1214  propvar.vt = VT_LPWSTR;
1215  propvar.u.pwszVal = wstr_empty;
1216  result = PropVariantToStringWithDefault(&propvar, default_value);
1217  ok(result == wstr_empty, "Unexpected value %s\n", wine_dbgstr_w(result));
1218 
1219  propvar.vt = VT_LPWSTR;
1220  propvar.u.pwszVal = wstr_space;
1221  result = PropVariantToStringWithDefault(&propvar, default_value);
1222  ok(result == wstr_space, "Unexpected value %s\n", wine_dbgstr_w(result));
1223 
1224  propvar.vt = VT_LPWSTR;
1225  propvar.u.pwszVal = wstr_test2;
1226  result = PropVariantToStringWithDefault(&propvar, default_value);
1227  ok(result == wstr_test2, "Unexpected value %s\n", wine_dbgstr_w(result));
1228 
1229  /* VT_LPSTR */
1230 
1231  propvar.vt = VT_LPSTR;
1232  propvar.u.pszVal = NULL;
1233  result = PropVariantToStringWithDefault(&propvar, default_value);
1234  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1235 
1236  propvar.vt = VT_LPSTR;
1237  propvar.u.pszVal = str_empty;
1238  result = PropVariantToStringWithDefault(&propvar, default_value);
1239  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1240 
1241  propvar.vt = VT_LPSTR;
1242  propvar.u.pszVal = str_space;
1243  result = PropVariantToStringWithDefault(&propvar, default_value);
1244  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1245 
1246  propvar.vt = VT_LPSTR;
1247  propvar.u.pszVal = str_test2;
1248  result = PropVariantToStringWithDefault(&propvar, default_value);
1249  ok(result == default_value, "Unexpected value %s\n", wine_dbgstr_w(result));
1250 
1251  /* VT_BSTR */
1252 
1253  propvar.vt = VT_BSTR;
1254  propvar.u.bstrVal = NULL;
1255  result = PropVariantToStringWithDefault(&propvar, default_value);
1256  ok(!lstrcmpW(result, wstr_empty), "Unexpected value %s\n", wine_dbgstr_w(result));
1257 
1258  propvar.vt = VT_BSTR;
1259  propvar.u.bstrVal = SysAllocString(wstr_empty);
1260  result = PropVariantToStringWithDefault(&propvar, default_value);
1261  ok(!lstrcmpW(result, wstr_empty), "Unexpected value %s\n", wine_dbgstr_w(result));
1262  SysFreeString(propvar.u.bstrVal);
1263 
1264  propvar.vt = VT_BSTR;
1265  propvar.u.bstrVal = SysAllocString(wstr_space);
1266  result = PropVariantToStringWithDefault(&propvar, default_value);
1267  ok(!lstrcmpW(result, wstr_space), "Unexpected value %s\n", wine_dbgstr_w(result));
1268  SysFreeString(propvar.u.bstrVal);
1269 
1270  propvar.vt = VT_BSTR;
1271  propvar.u.bstrVal = SysAllocString(wstr_test2);
1272  result = PropVariantToStringWithDefault(&propvar, default_value);
1273  ok(!lstrcmpW(result, wstr_test2), "Unexpected value %s\n", wine_dbgstr_w(result));
1274  SysFreeString(propvar.u.bstrVal);
1275 }
1276 
1278 {
1279  PROPVARIANT dest, src;
1280  HRESULT hr;
1281 
1282  PropVariantInit(&dest);
1283 
1284  src.vt = VT_NULL;
1286  ok(hr == S_OK, "hr=%x\n", hr);
1287  ok(dest.vt == VT_LPWSTR, "got %d\n", dest.vt);
1288  ok(!lstrcmpW(dest.u.pwszVal, emptyW), "got %s\n", wine_dbgstr_w(dest.u.pwszVal));
1291 
1292  src.vt = VT_LPSTR;
1293  src.u.pszVal = CoTaskMemAlloc(strlen(topic)+1);
1294  strcpy(src.u.pszVal, topic);
1296  ok(hr == S_OK, "hr=%x\n", hr);
1297  ok(dest.vt == VT_LPWSTR, "got %d\n", dest.vt);
1298  ok(!lstrcmpW(dest.u.pwszVal, topicW), "got %s\n", wine_dbgstr_w(dest.u.pwszVal));
1301 
1302  src.vt = VT_LPWSTR;
1303  src.u.pwszVal = CoTaskMemAlloc( (lstrlenW(topicW)+1) * sizeof(WCHAR));
1304  lstrcpyW(src.u.pwszVal, topicW);
1306  ok(hr == S_OK, "hr=%x\n", hr);
1307  ok(dest.vt == VT_LPWSTR, "got %d\n", dest.vt);
1308  ok(!lstrcmpW(dest.u.pwszVal, topicW), "got %s\n", wine_dbgstr_w(dest.u.pwszVal));
1311 }
1312 
1314 {
1315  PROPVARIANT propvar;
1316  GUID clsid;
1317  HRESULT hr;
1318 
1319  memset(&propvar, 0, sizeof(propvar));
1320  propvar.vt = VT_I4;
1321  propvar.u.lVal = 15;
1322 
1323  memset(&clsid, 0xcc, sizeof(clsid));
1324  hr = InitPropVariantFromCLSID(&clsid, &propvar);
1325  ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
1326  ok(propvar.vt == VT_CLSID, "Unexpected type %d.\n", propvar.vt);
1327  ok(IsEqualGUID(propvar.u.puuid, &clsid), "Unexpected puuid value.\n");
1328  PropVariantClear(&propvar);
1329 }
1330 
1331 static void test_PropVariantToDouble(void)
1332 {
1333  PROPVARIANT propvar;
1334  double value;
1335  HRESULT hr;
1336 
1337  PropVariantInit(&propvar);
1338  propvar.vt = VT_R8;
1339  propvar.u.dblVal = 15.0;
1340  hr = PropVariantToDouble(&propvar, &value);
1341  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1342  ok(value == 15.0, "Unexpected value: %f.\n", value);
1343 
1344  PropVariantClear(&propvar);
1345  propvar.vt = VT_I4;
1346  propvar.u.lVal = 123;
1347  hr = PropVariantToDouble(&propvar, &value);
1348  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1349  ok(value == 123.0, "Unexpected value: %f.\n", value);
1350 
1351  PropVariantClear(&propvar);
1352  propvar.vt = VT_I4;
1353  propvar.u.lVal = -256;
1354  hr = PropVariantToDouble(&propvar, &value);
1355  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1356  ok(value == -256, "Unexpected value: %f\n", value);
1357 
1358  PropVariantClear(&propvar);
1359  propvar.vt = VT_I8;
1360  propvar.u.lVal = 65536;
1361  hr = PropVariantToDouble(&propvar, &value);
1362  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1363  ok(value == 65536.0, "Unexpected value: %f.\n", value);
1364 
1365  PropVariantClear(&propvar);
1366  propvar.vt = VT_I8;
1367  propvar.u.lVal = -321;
1368  hr = PropVariantToDouble(&propvar, &value);
1369  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1370  ok(value == 4294966975.0, "Unexpected value: %f.\n", value);
1371 
1372  PropVariantClear(&propvar);
1373  propvar.vt = VT_UI4;
1374  propvar.u.ulVal = 6;
1375  hr = PropVariantToDouble(&propvar, &value);
1376  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1377  ok(value == 6.0, "Unexpected value: %f.\n", value);
1378 
1379  PropVariantClear(&propvar);
1380  propvar.vt = VT_UI8;
1381  propvar.u.uhVal.QuadPart = 8;
1382  hr = PropVariantToDouble(&propvar, &value);
1383  ok(hr == S_OK, "PropVariantToDouble failed: 0x%08x.\n", hr);
1384  ok(value == 8.0, "Unexpected value: %f.\n", value);
1385 }
1386 
1387 static void test_PropVariantToString(void)
1388 {
1389  PROPVARIANT propvar;
1390  static CHAR string[] = "Wine";
1391  static WCHAR stringW[] = {'W','i','n','e',0};
1392  WCHAR bufferW[256] = {0};
1393  HRESULT hr;
1394 
1395  PropVariantInit(&propvar);
1396  propvar.vt = VT_EMPTY;
1397  U(propvar).pwszVal = stringW;
1398  bufferW[0] = 65;
1399  hr = PropVariantToString(&propvar, bufferW, 0);
1400  ok(hr == E_INVALIDARG, "PropVariantToString should fail: 0x%08x.\n", hr);
1401  ok(!bufferW[0], "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1402  memset(bufferW, 0, sizeof(bufferW));
1403  PropVariantClear(&propvar);
1404 
1405  PropVariantInit(&propvar);
1406  propvar.vt = VT_EMPTY;
1407  U(propvar).pwszVal = stringW;
1408  bufferW[0] = 65;
1409  hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW));
1410  ok(hr == S_OK, "PropVariantToString failed: 0x%08x.\n", hr);
1411  ok(!bufferW[0], "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1412  memset(bufferW, 0, sizeof(bufferW));
1413  PropVariantClear(&propvar);
1414 
1415  PropVariantInit(&propvar);
1416  propvar.vt = VT_NULL;
1417  U(propvar).pwszVal = stringW;
1418  bufferW[0] = 65;
1419  hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW));
1420  ok(hr == S_OK, "PropVariantToString failed: 0x%08x.\n", hr);
1421  ok(!bufferW[0], "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1422  memset(bufferW, 0, sizeof(bufferW));
1423  PropVariantClear(&propvar);
1424 
1425  PropVariantInit(&propvar);
1426  propvar.vt = VT_I4;
1427  U(propvar).lVal = 22;
1428  hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW));
1429  todo_wine ok(hr == S_OK, "PropVariantToString failed: 0x%08x.\n", hr);
1430  todo_wine ok(!strcmp_wa(bufferW, "22"), "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1431  memset(bufferW, 0, sizeof(bufferW));
1432  PropVariantClear(&propvar);
1433 
1434  PropVariantInit(&propvar);
1435  propvar.vt = VT_LPWSTR;
1436  U(propvar).pwszVal = stringW;
1437  hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW));
1438  ok(hr == S_OK, "PropVariantToString failed: 0x%08x.\n", hr);
1439  ok(!lstrcmpW(bufferW, stringW), "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1440  memset(bufferW, 0, sizeof(bufferW));
1441 
1442  PropVariantInit(&propvar);
1443  propvar.vt = VT_LPSTR;
1444  U(propvar).pszVal = string;
1445  hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW));
1446  ok(hr == S_OK, "PropVariantToString failed: 0x%08x.\n", hr);
1447  ok(!lstrcmpW(bufferW, stringW), "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1448  memset(bufferW, 0, sizeof(bufferW));
1449 
1450  PropVariantInit(&propvar);
1451  propvar.vt = VT_LPWSTR;
1452  U(propvar).pwszVal = stringW;
1453  hr = PropVariantToString(&propvar, bufferW, 4);
1454  ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "PropVariantToString returned: 0x%08x.\n", hr);
1455  ok(!memcmp(bufferW, stringW, 4), "got wrong string.\n");
1456  memset(bufferW, 0, sizeof(bufferW));
1457 
1458  PropVariantInit(&propvar);
1459  propvar.vt = VT_LPSTR;
1460  U(propvar).pszVal = string;
1461  hr = PropVariantToString(&propvar, bufferW, 4);
1462  ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "PropVariantToString returned: 0x%08x.\n", hr);
1463  ok(!memcmp(bufferW, stringW, 4), "got wrong string.\n");
1464  memset(bufferW, 0, sizeof(bufferW));
1465 
1466  PropVariantInit(&propvar);
1467  propvar.vt = VT_BSTR;
1468  propvar.u.bstrVal = SysAllocString(stringW);
1469  hr = PropVariantToString(&propvar, bufferW, ARRAY_SIZE(bufferW));
1470  ok(hr == S_OK, "PropVariantToString failed: 0x%08x.\n", hr);
1471  ok(!lstrcmpW(bufferW, stringW), "got wrong string: \"%s\".\n", wine_dbgstr_w(bufferW));
1472  memset(bufferW, 0, sizeof(bufferW));
1473  SysFreeString(propvar.u.bstrVal);
1474 }
1475 
1476 static void test_PropVariantToBuffer(void)
1477 {
1478  PROPVARIANT propvar;
1479  HRESULT hr;
1480  UINT8 data[] = {1,2,3,4,5,6,7,8,9,10};
1481  INT8 data_int8[] = {1,2,3,4,5,6,7,8,9,10};
1482  SAFEARRAY *sa;
1483  SAFEARRAYBOUND sabound;
1484  void *pdata;
1485  UINT8 buffer[256];
1486 
1487  hr = InitPropVariantFromBuffer(data, 10, &propvar);
1488  ok(hr == S_OK, "InitPropVariantFromBuffer failed 0x%08x.\n", hr);
1489  hr = PropVariantToBuffer(&propvar, NULL, 0); /* crash when cb isn't zero */
1490  ok(hr == S_OK, "PropVariantToBuffer failed: 0x%08x.\n", hr);
1491  PropVariantClear(&propvar);
1492 
1493  hr = InitPropVariantFromBuffer(data, 10, &propvar);
1494  ok(hr == S_OK, "InitPropVariantFromBuffer failed 0x%08x.\n", hr);
1495  hr = PropVariantToBuffer(&propvar, buffer, 10);
1496  ok(hr == S_OK, "PropVariantToBuffer failed: 0x%08x.\n", hr);
1497  ok(!memcmp(buffer, data, 10) && !buffer[10], "got wrong buffer.\n");
1498  memset(buffer, 0, sizeof(buffer));
1499  PropVariantClear(&propvar);
1500 
1501  hr = InitPropVariantFromBuffer(data, 10, &propvar);
1502  ok(hr == S_OK, "InitPropVariantFromBuffer failed 0x%08x.\n", hr);
1503  buffer[0] = 99;
1504  hr = PropVariantToBuffer(&propvar, buffer, 11);
1505  ok(hr == E_FAIL, "PropVariantToBuffer returned: 0x%08x.\n", hr);
1506  ok(buffer[0] == 99, "got wrong buffer.\n");
1507  memset(buffer, 0, sizeof(buffer));
1508  PropVariantClear(&propvar);
1509 
1510  hr = InitPropVariantFromBuffer(data, 10, &propvar);
1511  ok(hr == S_OK, "InitPropVariantFromBuffer failed 0x%08x.\n", hr);
1512  hr = PropVariantToBuffer(&propvar, buffer, 9);
1513  ok(hr == S_OK, "PropVariantToBuffer failed: 0x%08x.\n", hr);
1514  ok(!memcmp(buffer, data, 9) && !buffer[9], "got wrong buffer.\n");
1515  memset(buffer, 0, sizeof(buffer));
1516  PropVariantClear(&propvar);
1517 
1518  PropVariantInit(&propvar);
1519  propvar.vt = VT_ARRAY|VT_UI1;
1520  sabound.lLbound = 0;
1521  sabound.cElements = sizeof(data);
1522  sa = NULL;
1523  sa = SafeArrayCreate(VT_UI1, 1, &sabound);
1524  ok(sa != NULL, "SafeArrayCreate failed.\n");
1526  ok(hr == S_OK, "SafeArrayAccessData failed: 0x%08x.\n", hr);
1527  memcpy(pdata, data, sizeof(data));
1529  ok(hr == S_OK, "SafeArrayUnaccessData failed: 0x%08x.\n", hr);
1530  U(propvar).parray = sa;
1531  buffer[0] = 99;
1532  hr = PropVariantToBuffer(&propvar, buffer, 11);
1533  todo_wine ok(hr == E_FAIL, "PropVariantToBuffer returned: 0x%08x.\n", hr);
1534  ok(buffer[0] == 99, "got wrong buffer.\n");
1535  memset(buffer, 0, sizeof(buffer));
1536  PropVariantClear(&propvar);
1537 
1538  PropVariantInit(&propvar);
1539  propvar.vt = VT_ARRAY|VT_UI1;
1540  sabound.lLbound = 0;
1541  sabound.cElements = sizeof(data);
1542  sa = NULL;
1543  sa = SafeArrayCreate(VT_UI1, 1, &sabound);
1544  ok(sa != NULL, "SafeArrayCreate failed.\n");
1546  ok(hr == S_OK, "SafeArrayAccessData failed: 0x%08x.\n", hr);
1547  memcpy(pdata, data, sizeof(data));
1549  ok(hr == S_OK, "SafeArrayUnaccessData failed: 0x%08x.\n", hr);
1550  U(propvar).parray = sa;
1551  hr = PropVariantToBuffer(&propvar, buffer, sizeof(data));
1552  todo_wine ok(hr == S_OK, "PropVariantToBuffer failed: 0x%08x.\n", hr);
1553  todo_wine ok(!memcmp(buffer, data, 10) && !buffer[10], "got wrong buffer.\n");
1554  memset(buffer, 0, sizeof(buffer));
1555  PropVariantClear(&propvar);
1556 
1557  PropVariantInit(&propvar);
1558  propvar.vt = VT_VECTOR|VT_I1;
1559  U(propvar).caub.pElems = CoTaskMemAlloc(sizeof(data_int8));
1560  U(propvar).caub.cElems = sizeof(data_int8);
1561  memcpy(U(propvar).caub.pElems, data_int8, sizeof(data_int8));
1562  hr = PropVariantToBuffer(&propvar, buffer, sizeof(data_int8));
1563  ok(hr == E_INVALIDARG, "PropVariantToBuffer failed: 0x%08x.\n", hr);
1564  PropVariantClear(&propvar);
1565 
1566  PropVariantInit(&propvar);
1567  propvar.vt = VT_ARRAY|VT_I1;
1568  sabound.lLbound = 0;
1569  sabound.cElements = sizeof(data_int8);
1570  sa = NULL;
1571  sa = SafeArrayCreate(VT_I1, 1, &sabound);
1572  ok(sa != NULL, "SafeArrayCreate failed.\n");
1574  ok(hr == S_OK, "SafeArrayAccessData failed: 0x%08x.\n", hr);
1575  memcpy(pdata, data_int8, sizeof(data_int8));
1577  ok(hr == S_OK, "SafeArrayUnaccessData failed: 0x%08x.\n", hr);
1578  U(propvar).parray = sa;
1579  hr = PropVariantToBuffer(&propvar, buffer, sizeof(data_int8));
1580  ok(hr == E_INVALIDARG, "PropVariantToBuffer failed: 0x%08x.\n", hr);
1581  PropVariantClear(&propvar);
1582 }
1583 
1585 {
1602 }
const char * var
Definition: shader.c:5666
signed char INT8
ULONG cbElements
Definition: compat.h:2006
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
HRESULT WINAPI PropVariantToUInt16(REFPROPVARIANT propvarIn, USHORT *ret)
Definition: propvar.c:210
static void test_PropVariantToBuffer(void)
Definition: propsys.c:1476
#define TRUE
Definition: types.h:120
static void test_PSRefreshPropertySchema(void)
Definition: propsys.c:439
Definition: compat.h:1947
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define expect_guid(expected, guid)
Definition: typelib.c:49
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:420
#define WideCharToMultiByte
Definition: compat.h:101
Definition: compat.h:1963
HRESULT hr
Definition: shlfolder.c:183
Definition: scsiwmi.h:51
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
Definition: compat.h:1959
static void test_PropVariantCompare(void)
Definition: propsys.c:660
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define GUID_MEMBERS(g)
Definition: propsys.c:42
HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar)
Definition: ole2.c:2968
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
#define CP_ACP
Definition: compat.h:99
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
static void test_PropVariantToDouble(void)
Definition: propsys.c:1331
HRESULT WINAPI PSStringFromPropertyKey(REFPROPERTYKEY pkey, LPWSTR psz, UINT cch)
Definition: propsys_main.c:284
char CHAR
Definition: xmlstorage.h:175
#define V_ARRAY(A)
Definition: oleauto.h:222
static void test_intconversions(void)
Definition: propsys.c:846
SAFEARRAYBOUND rgsabound[1]
Definition: compat.h:2009
#define U(x)
Definition: wordpad.c:46
USHORT fFeatures
Definition: compat.h:2005
const char * wine_dbgstr_guid(const GUID *guid)
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
GLuint buffer
Definition: glext.h:5915
HRESULT WINAPI PropVariantChangeType(PROPVARIANT *ppropvarDest, REFPROPVARIANT propvarSrc, PROPVAR_CHANGE_FLAGS flags, VARTYPE vt)
Definition: propvar.c:428
HRESULT WINAPI PropVariantToBuffer(REFPROPVARIANT propvarIn, void *ret, UINT cb)
Definition: propvar.c:306
#define lstrlenW
Definition: compat.h:415
HRESULT WINAPI VariantToGUID(const VARIANT *pvar, GUID *guid)
Definition: propvar.c:775
#define E_FAIL
Definition: ddrawi.h:102
INT WINAPI PropVariantCompareEx(REFPROPVARIANT propvar1, REFPROPVARIANT propvar2, PROPVAR_COMPARE_UNIT unit, PROPVAR_COMPARE_FLAGS flags)
Definition: propvar.c:814
#define STRSAFE_E_INSUFFICIENT_BUFFER
Definition: strsafe.h:103
int32_t INT
Definition: typedefs.h:57
static const WCHAR stringW[]
Definition: engine.c:38
#define CO_E_NOTINITIALIZED
HRESULT WINAPI PropVariantToInt32(REFPROPVARIANT propvarIn, LONG *ret)
Definition: propvar.c:186
PCWSTR WINAPI PropVariantToStringWithDefault(REFPROPVARIANT propvarIn, LPCWSTR pszDefault)
Definition: propvar.c:407
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
const GUID * guid
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
short SHORT
Definition: pedump.c:59
static const WCHAR topicW[]
Definition: propsys.c:45
#define E_INVALIDARG
Definition: ddrawi.h:101
const WCHAR * str
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:201
static void test_PropVariantToGUID(void)
Definition: propsys.c:559
smooth NULL
Definition: ftsmooth.c:416
HRESULT WINAPI PropVariantToStringAlloc(REFPROPVARIANT propvarIn, WCHAR **ret)
Definition: propvar.c:356
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
USHORT cDims
Definition: compat.h:2004
HRESULT WINAPI PSRefreshPropertySchema(void)
Definition: propsys_main.c:278
#define ERROR_ARITHMETIC_OVERFLOW
Definition: winerror.h:351
static PROTOCOLDATA * pdata
Definition: protocol.c:158
GLuint GLfloat * val
Definition: glext.h:7180
HRESULT WINAPI InitPropVariantFromGUIDAsString(REFGUID guid, PROPVARIANT *ppropvar)
Definition: propvar.c:592
static void test_PropVariantToStringAlloc(void)
Definition: propsys.c:632
int64_t LONGLONG
Definition: typedefs.h:67
HRESULT WINAPI InitPropVariantFromBuffer(const VOID *pv, UINT cb, PROPVARIANT *ppropvar)
Definition: propvar.c:626
Llong llval
Definition: format.c:276
#define DISP_E_TYPEMISMATCH
Definition: winerror.h:2514
HRESULT WINAPI PropVariantToGUID(const PROPVARIANT *ppropvar, GUID *guid)
Definition: propvar.c:756
GLsizeiptr size
Definition: glext.h:5919
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
uint64_t ULONGLONG
Definition: typedefs.h:66
PVOID pvData
Definition: compat.h:2008
static FILE * out
Definition: regtests2xml.c:44
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
static void test_PropVariantToString(void)
Definition: propsys.c:1387
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
int ret
HRESULT WINAPI PropVariantToUInt64(REFPROPVARIANT propvarIn, ULONGLONG *ret)
Definition: propvar.c:234
REFCLSID clsid
Definition: msctf.c:82
HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR pszString, PROPERTYKEY *pkey)
Definition: propsys_main.c:432
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
Definition: compat.h:1948
static void test_InitPropVariantFromGUIDAsString(void)
Definition: propsys.c:457
#define IID_NULL
Definition: guiddef.h:98
#define todo_wine
Definition: test.h:162
static void test_PropVariantToBoolean(void)
Definition: propsys.c:966
#define V_VT(A)
Definition: oleauto.h:211
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
HRESULT WINAPI PropVariantToUInt32(REFPROPVARIANT propvarIn, ULONG *ret)
Definition: propvar.c:222
#define GUID_NULL
Definition: ks.h:106
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
GLenum src
Definition: glext.h:6340
HRESULT WINAPI InitPropVariantFromCLSID(REFCLSID clsid, PROPVARIANT *ppropvar)
Definition: propvar.c:640
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
GLsizei const GLfloat * value
Definition: glext.h:6069
#define V_BSTR(A)
Definition: oleauto.h:226
static int strcmp_wa(LPCWSTR strw, const char *stra)
Definition: propsys.c:48
#define broken(x)
Definition: _sntprintf.h:21
char string[160]
Definition: util.h:11
PSSTDAPI typedef PROPERTYKEY * REFPROPERTYKEY
Definition: propsys.idl:30
SAFEARRAY *WINAPI SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND *rgsabound)
Definition: safearray.c:600
HRESULT WINAPI PropVariantToDouble(REFPROPVARIANT propvarIn, double *ret)
Definition: propvar.c:162
static void test_PSPropertyKeyFromString(void)
Definition: propsys.c:158
#define S_OK
Definition: intsafe.h:59
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI InitVariantFromGUIDAsString(REFGUID guid, VARIANT *pvar)
Definition: propvar.c:608
#define lstrcpyW
Definition: compat.h:414
static void test_PropVariantChangeType_LPWSTR(void)
Definition: propsys.c:1277
unsigned short USHORT
Definition: pedump.c:61
DEFINE_GUID(GUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
static IPropertySystem propsys
Definition: propsys_main.c:239
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ARRAY_SIZE(a)
Definition: main.h:24
#define ok(value,...)
Definition: atltest.h:57
static void test_InitPropVariantFromBuffer(void)
Definition: propsys.c:505
static const char topic[]
Definition: propsys.c:44
HRESULT WINAPI InitVariantFromBuffer(const VOID *pv, UINT cb, VARIANT *pvar)
Definition: propvar.c:653
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
HRESULT WINAPI PropVariantToInt16(REFPROPVARIANT propvarIn, SHORT *ret)
Definition: propvar.c:174
BOOL empty
Definition: button.c:170
HRESULT WINAPI PropVariantToString(REFPROPVARIANT propvarIn, PWSTR ret, UINT cch)
Definition: propvar.c:332
HRESULT WINAPI PropVariantToBoolean(REFPROPVARIANT propvarIn, BOOL *ret)
Definition: propvar.c:246
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
HRESULT WINAPI PropVariantToInt64(REFPROPVARIANT propvarIn, LONGLONG *ret)
Definition: propvar.c:198
static void test_PSStringFromPropertyKey(void)
Definition: propsys.c:55
GLuint res
Definition: glext.h:9613
START_TEST(propsys)
Definition: propsys.c:1584
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
unsigned int ULONG
Definition: retypes.h:1
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:41
static char * dest
Definition: rtl.c:135
WCHAR * LPWSTR
Definition: xmlstorage.h:184
static void test_InitPropVariantFromCLSID(void)
Definition: propsys.c:1313
#define E_POINTER
Definition: winerror.h:2365
static void test_PropVariantToStringWithDefault(void)
Definition: propsys.c:1177
unsigned char UINT8
GLuint64EXT * result
Definition: glext.h:11304
#define memset(x, y, z)
Definition: compat.h:39
static const char * strw(LPCWSTR x)
Definition: actctx.c:49
static const WCHAR emptyW[]
Definition: propsys.c:46
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:404
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
Definition: compat.h:1949
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
Definition: compat.h:1946
ULONG cLocks
Definition: compat.h:2007