ReactOS 0.4.16-dev-1946-g52006dd
ole_server.c File Reference
#include <windows.h>
#include <exdisp.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <assert.h>
#include "wine/test.h"
#include <initguid.h>
Include dependency graph for ole_server.c:

Go to the source code of this file.

Classes

struct  winetest_info
 
struct  UnknownImpl
 
struct  ClassFactoryImpl
 

Macros

#define COBJMACROS
 
#define CONST_VTABLE
 
#define GUID_NAME(guid)    { &IID_##guid, #guid }
 

Functions

 DEFINE_GUID (CLSID_WineTestObject, 0xdeadbeef, 0xdead, 0xbeef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef)
 
 DEFINE_GUID (CLSID_UnknownUnmarshal, 0x4c1e39e1, 0xe3e3, 0x4296, 0xaa, 0x86, 0xec, 0x93, 0x8d, 0x89, 0x6e, 0x92)
 
static UnknownImplimpl_from_IUnknown (IUnknown *iface)
 
static HRESULT WINAPI UnknownImpl_QueryInterface (IUnknown *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI UnknownImpl_AddRef (IUnknown *iface)
 
static ULONG WINAPI UnknownImpl_Release (IUnknown *iface)
 
static ClassFactoryImplimpl_from_IClassFactory (IClassFactory *iface)
 
static HRESULT WINAPI ClassFactoryImpl_QueryInterface (IClassFactory *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI ClassFactoryImpl_AddRef (IClassFactory *iface)
 
static ULONG WINAPI ClassFactoryImpl_Release (IClassFactory *iface)
 
static HRESULT WINAPI ClassFactoryImpl_CreateInstance (IClassFactory *iface, IUnknown *punkouter, REFIID iid, void **ppv)
 
static HRESULT WINAPI ClassFactoryImpl_LockServer (IClassFactory *iface, BOOL lock)
 
static void ole_server (void)
 
static BOOL register_server (const char *server, BOOL inproc_handler)
 
static void unregister_server (void)
 
static HANDLE start_server (const char *argv0)
 
 START_TEST (ole_server)
 

Variables

struct {
   const GUID *   guid
 
   const char *   name
 
guid_name []
 
static LONG obj_ref
 
static LONG class_ref
 
static LONG server_locks
 
static const IUnknownVtbl UnknownImpl_Vtbl
 
static const IClassFactoryVtbl ClassFactoryImpl_Vtbl
 
static ClassFactoryImpl factory = { { &ClassFactoryImpl_Vtbl }, 0 }
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file ole_server.c.

◆ CONST_VTABLE

#define CONST_VTABLE

Definition at line 22 of file ole_server.c.

◆ GUID_NAME

#define GUID_NAME (   guid)     { &IID_##guid, #guid }

Function Documentation

◆ ClassFactoryImpl_AddRef()

static ULONG WINAPI ClassFactoryImpl_AddRef ( IClassFactory iface)
static

Definition at line 157 of file ole_server.c.

158{
161
163
164 trace("server: factory_AddRef: %p, ref %u\n", iface, ref);
165 return ref;
166}
#define InterlockedIncrement
Definition: armddk.h:53
#define trace
Definition: atltest.h:70
static ClassFactoryImpl * impl_from_IClassFactory(IClassFactory *iface)
Definition: ole_server.c:131
static LONG class_ref
Definition: ole_server.c:61
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ ClassFactoryImpl_CreateInstance()

static HRESULT WINAPI ClassFactoryImpl_CreateInstance ( IClassFactory iface,
IUnknown punkouter,
REFIID  iid,
void **  ppv 
)
static

Definition at line 179 of file ole_server.c.

181{
183 HRESULT hr;
184
185 trace("server: factory_CreateInstance: %p,%s,%p\n", iface, debugstr_guid(iid), ppv);
186
187 if (punkouter) return CLASS_E_NOAGGREGATION;
188
189 unknown = HeapAlloc(GetProcessHeap(), 0, sizeof(*unknown));
190 if (!unknown) return E_OUTOFMEMORY;
191
192 unknown->IUnknown_iface.lpVtbl = &UnknownImpl_Vtbl;
193 unknown->ref = 0;
194 IUnknown_AddRef(&unknown->IUnknown_iface);
195
196 hr = IUnknown_QueryInterface(&unknown->IUnknown_iface, iid, ppv);
197 IUnknown_Release(&unknown->IUnknown_iface);
198
199 return hr;
200}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1605
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
static const IUnknownVtbl UnknownImpl_Vtbl
Definition: ole_server.c:118
HRESULT hr
Definition: shlfolder.c:183
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3771

◆ ClassFactoryImpl_LockServer()

static HRESULT WINAPI ClassFactoryImpl_LockServer ( IClassFactory iface,
BOOL  lock 
)
static

Definition at line 202 of file ole_server.c.

203{
205
206 trace("server: factory_LockServer: %p,%d, ref %u\n", iface, lock, ref);
207 return S_OK;
208}
#define InterlockedDecrement
Definition: armddk.h:52
#define S_OK
Definition: intsafe.h:52
static LONG server_locks
Definition: ole_server.c:61
rwlock_t lock
Definition: tcpcore.h:0

◆ ClassFactoryImpl_QueryInterface()

static HRESULT WINAPI ClassFactoryImpl_QueryInterface ( IClassFactory iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 136 of file ole_server.c.

138{
140
141 trace("server: factory_QueryInterface: %p,%s,%p\n", iface, debugstr_guid(iid), ppv);
142
143 if (!ppv) return E_INVALIDARG;
144
145 if (IsEqualIID(&IID_IUnknown, iid) ||
147 {
148 IClassFactory_AddRef(&This->IClassFactory_iface);
149 *ppv = &This->IClassFactory_iface;
150 return S_OK;
151 }
152
153 *ppv = NULL;
154 return E_NOINTERFACE;
155}
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define E_INVALIDARG
Definition: ddrawi.h:101
#define NULL
Definition: types.h:112
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ ClassFactoryImpl_Release()

static ULONG WINAPI ClassFactoryImpl_Release ( IClassFactory iface)
static

Definition at line 168 of file ole_server.c.

169{
172
174
175 trace("server: factory_Release: %p, ref %u\n", iface, ref);
176 return ref;
177}

◆ DEFINE_GUID() [1/2]

DEFINE_GUID ( CLSID_UnknownUnmarshal  ,
0x4c1e39e1  ,
0xe3e3  ,
0x4296  ,
0xaa  ,
0x86  ,
0xec  ,
0x93  ,
0x8d  ,
0x89  ,
0x6e  ,
0x92   
)

◆ DEFINE_GUID() [2/2]

DEFINE_GUID ( CLSID_WineTestObject  ,
0xdeadbeef  ,
0xdead  ,
0xbeef  ,
0xde  ,
0xad  ,
0xbe  ,
0xef  ,
0xde  ,
0xad  ,
0xbe  ,
0xef   
)

◆ impl_from_IClassFactory()

static ClassFactoryImpl * impl_from_IClassFactory ( IClassFactory iface)
inlinestatic

Definition at line 131 of file ole_server.c.

132{
133 return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface);
134}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by ClassFactoryImpl_AddRef(), ClassFactoryImpl_QueryInterface(), and ClassFactoryImpl_Release().

◆ impl_from_IUnknown()

static UnknownImpl * impl_from_IUnknown ( IUnknown iface)
inlinestatic

Definition at line 70 of file ole_server.c.

71{
72 return CONTAINING_RECORD(iface, UnknownImpl, IUnknown_iface);
73}

Referenced by UnknownImpl_AddRef(), UnknownImpl_QueryInterface(), and UnknownImpl_Release().

◆ ole_server()

static void ole_server ( void  )
static

Definition at line 221 of file ole_server.c.

222{
223 HRESULT hr;
224 DWORD key;
225
226 trace("server: starting %u\n", GetCurrentProcessId());
227
229 if (hr == S_OK)
230 {
231 trace("server: registering class object\n");
232 hr = CoRegisterClassObject(&CLSID_WineTestObject, (IUnknown *)&factory.IClassFactory_iface,
233 CLSCTX_SERVER, REGCLS_MULTIPLEUSE, &key);
234 if (hr == S_OK)
235 {
236 HANDLE done_event, init_done_event;
237
238 done_event = OpenEventA(SYNCHRONIZE, FALSE, "ole_server_done_event");
239 ok(done_event != 0, "server: OpenEvent error %d\n", GetLastError());
240 init_done_event = OpenEventA(EVENT_MODIFY_STATE, FALSE, "ole_server_init_done_event");
241 ok(init_done_event != 0, "server: OpenEvent error %d\n", GetLastError());
242
243 SetEvent(init_done_event);
244
245 trace("server: waiting for requests\n");
246 WaitForSingleObject(done_event, INFINITE);
247
248 /* 1 remainining class ref is supposed to be cleared by CoRevokeClassObject */
249 ok(class_ref == 1, "expected 1 class refs, got %d\n", class_ref);
250 ok(!obj_ref, "expected 0 object refs, got %d\n", obj_ref);
251 ok(!server_locks, "expected 0 server locks, got %d\n", server_locks);
252
253 CloseHandle(done_event);
254 CloseHandle(init_done_event);
255 if (0)
256 {
257 /* calling CoRevokeClassObject terminates process under Win7 */
258 trace("call CoRevokeClassObject\n");
260 trace("ret CoRevokeClassObject\n");
261 }
262 }
263 trace("server: call CoUninitialize\n");
265 trace("server: ret CoUninitialize\n");
266 }
267
268 trace("server: exiting %u\n", GetCurrentProcessId());
269}
#define ok(value,...)
Definition: atltest.h:57
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
HRESULT WINAPI CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk, DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister)
Definition: compobj.c:2897
HRESULT WINAPI DECLSPEC_HOTPATCH CoRevokeClassObject(DWORD dwRegister)
Definition: compobj.c:1086
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define INFINITE
Definition: serial.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SYNCHRONIZE
Definition: nt_native.h:61
@ REGCLS_MULTIPLEUSE
Definition: objbase.h:393
@ COINIT_MULTITHREADED
Definition: objbase.h:279
static LONG obj_ref
Definition: ole_server.c:61
Definition: main.c:439
IClassFactory IClassFactory_iface
Definition: main.c:440
Definition: copy.c:22
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synch.c:669
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define EVENT_MODIFY_STATE
Definition: winbase.h:165
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158

Referenced by START_TEST().

◆ register_server()

static BOOL register_server ( const char server,
BOOL  inproc_handler 
)
static

Definition at line 272 of file ole_server.c.

273{
274 static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
275 DWORD ret;
276 HKEY root;
277 WCHAR buf[39 + 6];
278 char server_path[MAX_PATH];
279
280 lstrcpyA(server_path, server);
281 lstrcatA(server_path, " ole_server");
282
284 StringFromGUID2(&CLSID_WineTestObject, buf + 6, 39);
285
288 if (ret == ERROR_SUCCESS)
289 {
290 ret = RegSetValueA(root, "LocalServer32", REG_SZ, server_path, strlen(server_path));
291 ok(ret == ERROR_SUCCESS, "RegSetValue error %u\n", ret);
292
293 if (inproc_handler)
294 {
295 ret = RegSetValueA(root, "InprocHandler32", REG_SZ, "ole32.dll", 9);
296 ok(ret == ERROR_SUCCESS, "RegSetValue error %u\n", ret);
297 }
298
300 }
301
302 return ret == ERROR_SUCCESS;
303}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define RegCloseKey(hKey)
Definition: registry.h:49
struct _root root
#define ERROR_SUCCESS
Definition: deptool.c:10
static const WCHAR clsidW[]
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueA(HKEY hKeyOriginal, LPCSTR lpSubKey, DWORD dwType, LPCSTR lpData, DWORD cbData)
Definition: reg.c:4954
#define MAX_PATH
Definition: compat.h:34
#define lstrcpyW
Definition: compat.h:749
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
return ret
Definition: mutex.c:146
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define REG_SZ
Definition: layer.c:22
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
LPSTR WINAPI lstrcatA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:123
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1021
#define KEY_WRITE
Definition: nt_native.h:1034
static rfbScreenInfoPtr server
Definition: vnc.c:74
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by START_TEST().

◆ start_server()

static HANDLE start_server ( const char argv0)
static

Definition at line 329 of file ole_server.c.

330{
332 STARTUPINFOA si;
334 char cmdline[MAX_PATH * 2];
335 BOOL ret;
336
337 memset(&si, 0, sizeof(si));
338 si.cb = sizeof(si);
342 si.hStdError = si.hStdOutput;
343
344 sa.nLength = sizeof(sa);
345 sa.lpSecurityDescriptor = NULL;
346 sa.bInheritHandle = TRUE;
347
348 sprintf(cmdline, "\"%s\" ole_server -server", argv0);
349 ret = CreateProcessA(argv0, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
350 ok(ret, "CreateProcess(%s) error %d\n", cmdline, GetLastError());
351 if (!ret) return 0;
352
353 CloseHandle(pi.hThread);
354 return pi.hProcess;
355}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
#define TRUE
Definition: types.h:120
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4749
unsigned int BOOL
Definition: ntddk_ex.h:94
#define sprintf
Definition: sprintf.c:45
static refpint_t pi[]
Definition: server.c:112
#define memset(x, y, z)
Definition: compat.h:39
static char argv0[MAX_PATH]
Definition: shlexec.c:49
TCHAR * cmdline
Definition: stretchblt.cpp:32
#define STD_OUTPUT_HANDLE
Definition: winbase.h:292
#define STD_INPUT_HANDLE
Definition: winbase.h:291
#define STARTF_USESTDHANDLES
Definition: winbase.h:476

Referenced by START_TEST().

◆ START_TEST()

START_TEST ( ole_server  )

Definition at line 357 of file ole_server.c.

358{
359 CLSID clsid = CLSID_WineTestObject;
360 HRESULT hr;
363 IOleObject *oleobj;
364 IRunnableObject *runobj;
365 DWORD ret;
366 HANDLE mapping, done_event, init_done_event, process;
367 struct winetest_info *info;
368 int argc;
369 char **argv;
370
371 mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, "winetest_ole_server");
372 ok(mapping != 0, "CreateFileMapping failed\n");
374
376
377 done_event = CreateEventA(NULL, TRUE, FALSE, "ole_server_done_event");
378 ok(done_event != 0, "CreateEvent error %d\n", GetLastError());
379 init_done_event = CreateEventA(NULL, TRUE, FALSE, "ole_server_init_done_event");
380 ok(init_done_event != 0, "CreateEvent error %d\n", GetLastError());
381
382 if (argc > 2)
383 {
384 if (!lstrcmpiA(argv[2], "-Embedding"))
385 {
386 trace("server: Refusing to be run by ole32\n");
387 return;
388 }
389
390 if (!lstrcmpiA(argv[2], "-server"))
391 {
392 info->child_failures = 0;
393 ole_server();
394 info->child_failures = winetest_get_failures();
395 return;
396 }
397
398 trace("server: Unknown parameter: %s\n", argv[2]);
399 return;
400 }
401
402 if (!register_server(argv[0], FALSE))
403 {
404 win_skip("not enough permissions to create a server CLSID key\n");
405 return;
406 }
407
408 if (!(process = start_server(argv[0])))
409 {
411 return;
412 }
413 WaitForSingleObject(init_done_event, 5000);
414
416 ok(hr == S_OK, "OleInitialize error %#x\n", hr);
417
418 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&unknown);
419 ok(hr == REGDB_E_CLASSNOTREG, "expected REGDB_E_CLASSNOTREG, got %#x\n", hr);
420
421 if (!register_server(argv[0], TRUE))
422 {
423 win_skip("not enough permissions to create a server CLSID key\n");
425 return;
426 }
427
428 trace("call CoCreateInstance(&IID_NULL)\n");
429 hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_NULL, (void **)&unknown);
430 trace("ret CoCreateInstance(&IID_NULL)\n");
431 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
432
433 /* in-process handler supports IID_IUnknown starting from Vista */
434 trace("call CoCreateInstance(&IID_IUnknown)\n");
435 hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&unknown);
436 trace("ret CoCreateInstance(&IID_IUnknown)\n");
437 ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* XP,win2000 and earlier */, "CoCreateInstance(IID_IUnknown) error %#x\n", hr);
438 if (hr != S_OK)
439 {
440 win_skip("In-process handler doesn't support IID_IUnknown on this platform\n");
442 }
443
444 trace("call CoCreateInstance(&IID_IOleObject)\n");
445 hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IOleObject, (void **)&oleobj);
446 trace("ret CoCreateInstance(&IID_IOleObject)\n");
447 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
448
449 trace("call IUnknown_QueryInterface(&IID_IRunnableObject)\n");
450 hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&runobj);
451 trace("ret IUnknown_QueryInterface(&IID_IRunnableObject)\n");
452 ok(hr == S_OK, "QueryInterface(&IID_IRunnableObject) error %#x\n", hr);
453
454 ret = IRunnableObject_IsRunning(runobj);
455 ok(!ret, "expected 0, got %d\n", ret);
456
457 trace("call OleRun\n");
458 hr = OleRun(unknown);
459 trace("ret OleRun\n");
461 ok(hr == S_OK, "OleRun error %#x\n", hr);
462
463 ret = IRunnableObject_IsRunning(runobj);
465 ok(ret == 1, "expected 1, got %d\n", ret);
466
467 trace("call IRunnableObject_Release\n");
468 ret = IRunnableObject_Release(runobj);
469 trace("ret IRunnableObject_Release\n");
470 ok(ret == 1, "expected ref 1, got %u\n", ret);
471
472 trace("call IUnknown_QueryInterface(&IID_IOleObject)\n");
473 hr = IUnknown_QueryInterface(unknown, &IID_IOleObject, (void **)&oleobj);
474 trace("ret IUnknown_QueryInterface(&IID_IOleObject)\n");
475 ok(hr == S_OK, "QueryInterface(&IID_IOleObject) error %#x\n", hr);
476
477 trace("call IOleObject_Release\n");
478 ret = IOleObject_Release(oleobj);
479 trace("ret IOleObject_Release\n");
480 ok(ret == 1, "expected ref 1, got %u\n", ret);
481
482 trace("call IUnknown_Release\n");
483 ret = IUnknown_Release(unknown);
484 trace("ret IUnknown_Release\n");
485 ok(!ret, "expected ref 0, got %u\n", ret);
486
488 /* local server supports IID_IUnknown */
489 trace("call CoCreateInstance(&IID_IUnknown)\n");
490 hr = CoCreateInstance(&clsid, NULL, CLSCTX_LOCAL_SERVER, &IID_IUnknown, (void **)&unknown);
491 trace("ret CoCreateInstance(&IID_IUnknown)\n");
492 ok(hr == S_OK, "CoCreateInstance(IID_IUnknown) error %#x\n", hr);
493
494 trace("call IUnknown_QueryInterface(&IID_IRunnableObject)\n");
495 hr = IUnknown_QueryInterface(unknown, &IID_IRunnableObject, (void **)&runobj);
496 trace("ret IUnknown_QueryInterface(&IID_IRunnableObject)\n");
497 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
498
499 trace("call OleRun\n");
500 hr = OleRun(unknown);
501 trace("ret OleRun\n");
502 ok(hr == S_OK, "OleRun error %#x\n", hr);
503
504 trace("call IUnknown_QueryInterface(&IID_IOleObject)\n");
505 hr = IUnknown_QueryInterface(unknown, &IID_IOleObject, (void **)&oleobj);
506 trace("ret IUnknown_QueryInterface(&IID_IOleObject)\n");
507 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
508
509 trace("call IUnknown_Release\n");
510 ret = IUnknown_Release(unknown);
511 trace("ret IUnknown_Release\n");
512 ok(!ret, "expected ref 0, got %u\n", ret);
513
514 trace("call CoGetClassObject(&IID_IClassFactory)\n");
515 hr = CoGetClassObject(&clsid, CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void **)&factory);
516 trace("ret CoGetClassObject(&IID_IClassFactory)\n");
517 ok(hr == S_OK, "CoGetClassObject error %#x\n", hr);
518
519 trace("call IClassFactory_CreateInstance(&IID_NULL)\n");
520 hr = IClassFactory_CreateInstance(factory, NULL, &IID_NULL, (void **)&oleobj);
521 trace("ret IClassFactory_CreateInstance(&IID_NULL)\n");
522 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
523
524 trace("call IClassFactory_CreateInstance(&IID_IOleObject)\n");
525 hr = IClassFactory_CreateInstance(factory, NULL, &IID_IOleObject, (void **)&oleobj);
526 trace("ret IClassFactory_CreateInstance(&IID_IOleObject)\n");
527 ok(hr == E_NOINTERFACE, "expected E_NOINTERFACE, got %#x\n", hr);
528
529 trace("call IClassFactory_Release\n");
530 ret = IClassFactory_Release(factory);
531 trace("ret IClassFactory_Release\n");
532 ok(!ret, "expected ref 0, got %u\n", ret);
533
534 trace("signalling termination\n");
535 SetEvent(done_event);
537 ok(ret == WAIT_OBJECT_0, "server failed to terminate\n");
538
540
542
543 if (info->child_failures)
544 {
545 trace("%d failures in child process\n", info->child_failures);
546 winetest_add_failures(info->child_failures);
547 }
548}
static int argc
Definition: ServiceArgs.c:12
#define broken(x)
Definition: atltest.h:178
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define FILE_MAP_READ
Definition: compat.h:776
#define MapViewOfFile
Definition: compat.h:745
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4227
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3103
HRESULT WINAPI DECLSPEC_HOTPATCH OleRun(LPUNKNOWN pUnknown)
Definition: ole2.c:1205
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:230
HANDLE NTAPI CreateFileMappingA(IN HANDLE hFile, IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes, IN DWORD flProtect, IN DWORD dwMaximumSizeHigh, IN DWORD dwMaximumSizeLow, IN LPCSTR lpName)
Definition: filemap.c:23
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031
#define win_skip
Definition: minitest.h:67
LONG winetest_get_failures(void)
void winetest_add_failures(LONG new_failures)
#define todo_wine
Definition: minitest.h:80
static void test_local_server(void)
Definition: marshal.c:3824
#define argv
Definition: mplay32.c:18
const CLSID * clsid
Definition: msctf.cpp:50
#define PAGE_READWRITE
Definition: nt_native.h:1307
static ClassFactoryImpl factory
Definition: ole_server.c:219
static void ole_server(void)
Definition: ole_server.c:221
static void unregister_server(void)
Definition: ole_server.c:305
static BOOL register_server(const char *server, BOOL inproc_handler)
Definition: ole_server.c:272
static HANDLE start_server(const char *argv0)
Definition: ole_server.c:329
const GUID IID_IRunnableObject
const GUID IID_IOleObject
#define IID_NULL
Definition: guiddef.h:98
int winetest_get_mainargs(char ***pargv)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:637
#define FILE_MAP_WRITE
Definition: winbase.h:156
#define WAIT_OBJECT_0
Definition: winbase.h:383
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801

◆ UnknownImpl_AddRef()

static ULONG WINAPI UnknownImpl_AddRef ( IUnknown iface)
static

Definition at line 95 of file ole_server.c.

96{
99
101
102 trace("server: unknown_AddRef: %p, ref %u\n", iface, ref);
103 return ref;
104}
static UnknownImpl * impl_from_IUnknown(IUnknown *iface)
Definition: ole_server.c:70

◆ UnknownImpl_QueryInterface()

static HRESULT WINAPI UnknownImpl_QueryInterface ( IUnknown iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 75 of file ole_server.c.

77{
79
80 trace("server: unknown_QueryInterface: %p,%s,%p\n", iface, debugstr_guid(iid), ppv);
81
82 if (!ppv) return E_INVALIDARG;
83
84 if (IsEqualIID(&IID_IUnknown, iid))
85 {
86 *ppv = &This->IUnknown_iface;
87 IUnknown_AddRef(&This->IUnknown_iface);
88 return S_OK;
89 }
90
91 *ppv = NULL;
92 return E_NOINTERFACE;
93}

◆ UnknownImpl_Release()

static ULONG WINAPI UnknownImpl_Release ( IUnknown iface)
static

Definition at line 106 of file ole_server.c.

107{
110
112
113 trace("server: unknown_Release: %p, ref %u\n", iface, ref);
114 if (ref == 0) HeapFree(GetProcessHeap(), 0, This);
115 return ref;
116}
#define HeapFree(x, y, z)
Definition: compat.h:735

◆ unregister_server()

static void unregister_server ( void  )
static

Definition at line 305 of file ole_server.c.

306{
307 static const WCHAR clsidW[] = {'C','L','S','I','D','\\',0};
308 DWORD ret;
309 HKEY root;
310 WCHAR buf[39 + 6];
311
313 StringFromGUID2(&CLSID_WineTestObject, buf + 6, 39);
314
316 DELETE, NULL, &root, NULL);
317 if (ret == ERROR_SUCCESS)
318 {
319 ret = RegDeleteKeyA(root, "InprocHandler32");
320 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
321 ret = RegDeleteKeyA(root, "LocalServer32");
322 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
323 ret = RegDeleteKeyA(root, "");
324 ok(ret == ERROR_SUCCESS, "RegDeleteKey error %u\n", ret);
326 }
327}
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
#define DELETE
Definition: nt_native.h:57

Referenced by START_TEST().

Variable Documentation

◆ class_ref

LONG class_ref
static

Definition at line 61 of file ole_server.c.

Referenced by ClassFactoryImpl_AddRef(), ClassFactoryImpl_Release(), and ole_server().

◆ ClassFactoryImpl_Vtbl

const IClassFactoryVtbl ClassFactoryImpl_Vtbl
static
Initial value:
=
{
}
static ULONG WINAPI ClassFactoryImpl_Release(IClassFactory *iface)
Definition: ole_server.c:168
static HRESULT WINAPI ClassFactoryImpl_LockServer(IClassFactory *iface, BOOL lock)
Definition: ole_server.c:202
static ULONG WINAPI ClassFactoryImpl_AddRef(IClassFactory *iface)
Definition: ole_server.c:157
static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface, IUnknown *punkouter, REFIID iid, void **ppv)
Definition: ole_server.c:179
static HRESULT WINAPI ClassFactoryImpl_QueryInterface(IClassFactory *iface, REFIID iid, void **ppv)
Definition: ole_server.c:136

Definition at line 210 of file ole_server.c.

◆ factory

Definition at line 219 of file ole_server.c.

Referenced by START_TEST().

◆ guid

const GUID* guid

Definition at line 42 of file ole_server.c.

◆ 

const struct { ... } guid_name[]
Initial value:
=
{
#define GUID_NAME(guid)
{ &CLSID_IdentityUnmarshal, "CLSID_IdentityUnmarshal" },
{ &CLSID_UnknownUnmarshal, "CLSID_UnknownUnmarshal" },
}
const CLSID CLSID_IdentityUnmarshal
#define GUID_NAME(guid)

◆ name

Definition at line 43 of file ole_server.c.

◆ obj_ref

LONG obj_ref
static

Definition at line 61 of file ole_server.c.

Referenced by ole_server(), UnknownImpl_AddRef(), and UnknownImpl_Release().

◆ server_locks

LONG server_locks
static

◆ UnknownImpl_Vtbl

const IUnknownVtbl UnknownImpl_Vtbl
static
Initial value:
=
{
}
static ULONG WINAPI UnknownImpl_AddRef(IUnknown *iface)
Definition: ole_server.c:95
static ULONG WINAPI UnknownImpl_Release(IUnknown *iface)
Definition: ole_server.c:106
static HRESULT WINAPI UnknownImpl_QueryInterface(IUnknown *iface, REFIID iid, void **ppv)
Definition: ole_server.c:75

Definition at line 118 of file ole_server.c.

Referenced by ClassFactoryImpl_CreateInstance().