2 * Default Handler Tests
4 * Copyright 2008 Huw Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define WIN32_NO_STATUS
23 #define COM_NO_WINDOWS_H
34 //#include "objbase.h"
36 #include <wine/test.h>
38 #define DEFINE_EXPECT(func) \
39 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
41 #define SET_EXPECT(func) \
42 expect_ ## func = TRUE
44 #define CHECK_EXPECT2(func) \
46 ok(expect_ ##func, "unexpected call " #func "\n"); \
47 called_ ## func = TRUE; \
50 #define CHECK_EXPECT(func) \
52 CHECK_EXPECT2(func); \
53 expect_ ## func = FALSE; \
56 #define CHECK_CALLED(func) \
58 ok(called_ ## func, "expected " #func "\n"); \
59 expect_ ## func = called_ ## func = FALSE; \
62 #define CHECK_NOT_CALLED(func) \
64 ok(!called_ ## func, "unexpected " #func "\n"); \
65 expect_ ## func = called_ ## func = FALSE; \
68 DEFINE_EXPECT(CF_QueryInterface_ClassFactory
);
69 DEFINE_EXPECT(CF_CreateInstance
);
70 DEFINE_EXPECT(CF_QueryInterface_IMarshal
);
72 static HRESULT
create_storage(IStorage
**stg
)
75 ILockBytes
*lock_bytes
;
77 hr
= CreateILockBytesOnHGlobal(NULL
, TRUE
, &lock_bytes
);
80 hr
= StgCreateDocfileOnILockBytes(lock_bytes
,
81 STGM_CREATE
| STGM_SHARE_EXCLUSIVE
| STGM_READWRITE
, 0, stg
);
82 ILockBytes_Release(lock_bytes
);
91 DWORD link_update_opt
;
94 } ole_stream_header_t
;
96 static void test_olestream(void)
99 const CLSID non_existent_class
= {0xa5f1772f, 0x3772, 0x490f, {0x9e, 0xc6, 0x77, 0x13, 0xe8, 0xb3, 0x4b, 0x5d}};
101 IPersistStorage
*persist
;
104 static const WCHAR olestream
[] = {1,'O','l','e',0};
106 ole_stream_header_t header
;
108 hr
= create_storage(&stg
);
109 ok(hr
== S_OK
, "got %08x\n", hr
);
111 hr
= IStorage_OpenStream(stg
, olestream
, NULL
, STGM_SHARE_EXCLUSIVE
| STGM_READ
, 0, &stm
);
112 ok(hr
== STG_E_FILENOTFOUND
, "got %08x\n", hr
);
114 hr
= OleCreateDefaultHandler(&non_existent_class
, 0, &IID_IOleObject
, (void**)&ole_obj
);
115 ok(hr
== S_OK
, "got %08x\n", hr
);
117 hr
= IOleObject_QueryInterface(ole_obj
, &IID_IPersistStorage
, (void**)&persist
);
118 ok(hr
== S_OK
, "got %08x\n", hr
);
120 hr
= IPersistStorage_InitNew(persist
, stg
);
121 ok(hr
== S_OK
, "got %08x\n", hr
);
123 hr
= IStorage_OpenStream(stg
, olestream
, NULL
, STGM_SHARE_EXCLUSIVE
| STGM_READ
, 0, &stm
);
124 ok(hr
== S_OK
, "got %08x\n", hr
);
125 hr
= IStream_Read(stm
, &header
, sizeof(header
), &read
);
126 ok(hr
== S_OK
, "got %08x\n", hr
);
127 ok(read
== sizeof(header
), "read %d\n", read
);
128 ok(header
.version
== 0x02000001, "got version %08x\n", header
.version
);
129 ok(header
.flags
== 0x0, "got flags %08x\n", header
.flags
);
130 ok(header
.link_update_opt
== 0x0, "got link update option %08x\n", header
.link_update_opt
);
131 ok(header
.res
== 0x0, "got reserved %08x\n", header
.res
);
132 ok(header
.moniker_size
== 0x0, "got moniker size %08x\n", header
.moniker_size
);
134 IStream_Release(stm
);
136 IPersistStorage_Release(persist
);
137 IOleObject_Release(ole_obj
);
139 IStorage_Release(stg
);
142 static HRESULT WINAPI
test_class_QueryInterface(IUnknown
*iface
, REFIID riid
, void **ppv
)
144 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
147 }else if(IsEqualGUID(riid
, &IID_IOleObject
)) {
148 ok(0, "unexpected query for IOleObject interface\n");
150 return E_NOINTERFACE
;
154 return E_NOINTERFACE
;
157 static ULONG WINAPI
test_class_AddRef(IUnknown
*iface
)
162 static ULONG WINAPI
test_class_Release(IUnknown
*iface
)
167 static const IUnknownVtbl test_class_vtbl
= {
168 test_class_QueryInterface
,
173 static IUnknown test_class
= { &test_class_vtbl
};
175 static HRESULT WINAPI
ClassFactory_QueryInterface(IClassFactory
*iface
, REFIID riid
, void **ppv
)
177 if(IsEqualGUID(riid
, &IID_IUnknown
)) {
180 }else if(IsEqualGUID(riid
, &IID_IMarshal
)) {
181 CHECK_EXPECT(CF_QueryInterface_IMarshal
);
183 return E_NOINTERFACE
;
184 }else if(IsEqualGUID(riid
, &IID_IClassFactory
)) {
185 CHECK_EXPECT(CF_QueryInterface_ClassFactory
);
190 ok(0, "unexpected interface: %s\n", wine_dbgstr_guid(riid
));
192 return E_NOINTERFACE
;
195 static ULONG WINAPI
ClassFactory_AddRef(IClassFactory
*iface
)
200 static ULONG WINAPI
ClassFactory_Release(IClassFactory
*iface
)
205 static HRESULT WINAPI
ClassFactory_CreateInstance(IClassFactory
*iface
,
206 IUnknown
*pUnkOuter
, REFIID riid
, void **ppv
)
208 CHECK_EXPECT(CF_CreateInstance
);
210 ok(pUnkOuter
== NULL
, "pUnkOuter != NULL\n");
211 todo_wine
ok(IsEqualGUID(riid
, &IID_IUnknown
), "riid = %s\n", wine_dbgstr_guid(riid
));
212 if(IsEqualGUID(riid
, &IID_IOleObject
)) {
214 return E_NOINTERFACE
;
221 static HRESULT WINAPI
ClassFactory_LockServer(IClassFactory
*iface
, BOOL fLock
)
223 ok(0, "unexpected call\n");
227 static const IClassFactoryVtbl ClassFactoryVtbl
= {
228 ClassFactory_QueryInterface
,
230 ClassFactory_Release
,
231 ClassFactory_CreateInstance
,
232 ClassFactory_LockServer
235 static IClassFactory ClassFactory
= { &ClassFactoryVtbl
};
237 static void test_default_handler_run(void)
239 const CLSID test_server_clsid
= {0x0f77e570,0x80c3,0x11e2,{0x9e,0x96,0x08,0x00,0x20,0x0c,0x9a,0x66}};
244 IPersistStorage
*persist
;
248 if(!GetProcAddress(GetModuleHandleA("ole32"), "CoRegisterSurrogateEx")) {
249 win_skip("skipping OleCreateDefaultHandler tests\n");
253 hres
= CoRegisterClassObject(&test_server_clsid
, (IUnknown
*)&ClassFactory
,
254 CLSCTX_INPROC_SERVER
, 0, &class_reg
);
255 ok(hres
== S_OK
, "CoRegisterClassObject failed: %x\n", hres
);
257 hres
= OleCreateDefaultHandler(&test_server_clsid
, NULL
, &IID_IUnknown
, (void**)&unk
);
258 ok(hres
== S_OK
, "OleCreateDefaultHandler failed: %x\n", hres
);
260 hres
= IUnknown_QueryInterface(unk
, &IID_IRunnableObject
, (void**)&ro
);
261 ok(hres
== S_OK
, "QueryInterface(IRunnableObject) failed: %x\n", hres
);
262 IUnknown_Release(unk
);
264 hres
= IRunnableObject_Run(ro
, NULL
);
265 ok(hres
== REGDB_E_CLASSNOTREG
, "Run returned: %x, expected REGDB_E_CLASSNOTREG\n", hres
);
266 IRunnableObject_Release(ro
);
268 SET_EXPECT(CF_QueryInterface_IMarshal
);
269 CoRevokeClassObject(class_reg
);
270 todo_wine
CHECK_CALLED(CF_QueryInterface_IMarshal
);
272 hres
= CoRegisterClassObject(&test_server_clsid
, (IUnknown
*)&ClassFactory
,
273 CLSCTX_LOCAL_SERVER
, 0, &class_reg
);
274 ok(hres
== S_OK
, "CoRegisterClassObject failed: %x\n", hres
);
276 hres
= OleCreateDefaultHandler(&test_server_clsid
, NULL
, &IID_IUnknown
, (void**)&unk
);
277 ok(hres
== S_OK
, "OleCreateDefaultHandler failed: %x\n", hres
);
279 hres
= IUnknown_QueryInterface(unk
, &IID_IOleObject
, (void**)&oleobj
);
280 ok(hres
== S_OK
, "QueryInterface(IID_IOleObject) failed: %x\n", hres
);
282 hres
= IOleObject_QueryInterface(oleobj
, &IID_IPersistStorage
, (void**)&persist
);
283 ok(hres
== S_OK
, "QueryInterface(IID_IPersistStorage) failed: %x\n", hres
);
284 IPersistStorage_Release(persist
);
285 IOleObject_Release(oleobj
);
287 hres
= IUnknown_QueryInterface(unk
, &IID_IRunnableObject
, (void**)&ro
);
288 ok(hres
== S_OK
, "QueryInterface(IRunnableObject) failed: %x\n", hres
);
289 IUnknown_Release(unk
);
291 SET_EXPECT(CF_QueryInterface_ClassFactory
);
292 SET_EXPECT(CF_CreateInstance
);
293 hres
= IRunnableObject_Run(ro
, NULL
);
295 ok(hres
== S_OK
, "Run failed: %x\n", hres
);
296 CHECK_CALLED(CF_QueryInterface_ClassFactory
);
297 CHECK_CALLED(CF_CreateInstance
);
298 IRunnableObject_Release(ro
);
300 SET_EXPECT(CF_QueryInterface_ClassFactory
);
301 SET_EXPECT(CF_CreateInstance
);
302 hres
= CoCreateInstance(&test_server_clsid
, NULL
, CLSCTX_LOCAL_SERVER
,
303 &IID_IOleObject
, (void**)&oleobj
);
305 ok(hres
== REGDB_E_CLASSNOTREG
, "expected REGDB_E_CLASSNOTREG, got %x\n", hres
);
307 CHECK_NOT_CALLED(CF_QueryInterface_ClassFactory
);
309 CHECK_NOT_CALLED(CF_CreateInstance
);
311 SET_EXPECT(CF_QueryInterface_IMarshal
);
312 CoRevokeClassObject(class_reg
);
313 todo_wine
CHECK_CALLED(CF_QueryInterface_IMarshal
);
316 START_TEST(defaulthandler
)
321 test_default_handler_run();