HRESULT OLEAUTPS_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { return NdrDllGetClassObject(rclsid, riid, ppv, OLEAUT32_ProxyFileList, &CLSID_PSDispatch, &PSFactoryBuffer); }
static IPSFactoryBuffer *test_NdrDllGetClassObject(void) { HMODULE rpcrt4 = GetModuleHandleA("rpcrt4.dll"); IPSFactoryBuffer *ppsf = NULL; const PCInterfaceProxyVtblList* proxy_vtbl; const PCInterfaceStubVtblList* stub_vtbl; const CLSID PSDispatch = {0x20420, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}}; const CLSID CLSID_Unknown = {0x45678, 0x1234, 0x6666, {0xff, 0x67, 0x45, 0x98, 0x76, 0x12, 0x34, 0x56}}; static const GUID * const interfaces[] = { &IID_if1, &IID_if2, &IID_if3, &IID_if4 }; UINT i; HRESULT r; HMODULE hmod = GetModuleHandleA("rpcrt4.dll"); void *CStd_QueryInterface = GetProcAddress(hmod, "CStdStubBuffer_QueryInterface"); void *CStd_AddRef = GetProcAddress(hmod, "CStdStubBuffer_AddRef"); void *CStd_Release = GetProcAddress(hmod, "NdrCStdStubBuffer_Release"); void *CStd_Connect = GetProcAddress(hmod, "CStdStubBuffer_Connect"); void *CStd_Disconnect = GetProcAddress(hmod, "CStdStubBuffer_Disconnect"); void *CStd_Invoke = GetProcAddress(hmod, "CStdStubBuffer_Invoke"); void *CStd_IsIIDSupported = GetProcAddress(hmod, "CStdStubBuffer_IsIIDSupported"); void *CStd_CountRefs = GetProcAddress(hmod, "CStdStubBuffer_CountRefs"); void *CStd_DebugServerQueryInterface = GetProcAddress(hmod, "CStdStubBuffer_DebugServerQueryInterface"); void *CStd_DebugServerRelease = GetProcAddress(hmod, "CStdStubBuffer_DebugServerRelease"); r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list, &CLSID_Unknown, &PSFactoryBuffer); ok(r == CLASS_E_CLASSNOTAVAILABLE, "NdrDllGetClassObject with unknown clsid should have returned CLASS_E_CLASSNOTAVAILABLE instead of 0x%x\n", r); ok(ppsf == NULL, "NdrDllGetClassObject should have set ppsf to NULL on failure\n"); r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list, &PSDispatch, &PSFactoryBuffer); ok(r == S_OK, "ret %08x\n", r); ok(ppsf != NULL, "ppsf == NULL\n"); proxy_vtbl = PSFactoryBuffer.pProxyFileList[0]->pProxyVtblList; stub_vtbl = PSFactoryBuffer.pProxyFileList[0]->pStubVtblList; ok(PSFactoryBuffer.pProxyFileList == proxy_file_list, "pfl not the same\n"); ok(proxy_vtbl == (PCInterfaceProxyVtblList *) &cstub_ProxyVtblList, "proxy vtbllist not the same\n"); ok(stub_vtbl == (PCInterfaceStubVtblList *) &cstub_StubVtblList, "stub vtbllist not the same\n"); /* if1 is non-delegating, if2 is delegating, if3 is non-delegating but I've zero'ed the vtbl entries, similarly if4 is delegating with zero'ed vtbl entries */ #define VTBL_TEST_NOT_CHANGE_TO(name, i) \ ok(stub_vtbl[i]->Vtbl.name != CStd_##name, #name "vtbl %d updated %p %p\n", \ i, stub_vtbl[i]->Vtbl.name, CStd_##name ) #define VTBL_TEST_CHANGE_TO(name, i) \ ok(check_address(stub_vtbl[i]->Vtbl.name, CStd_##name), #name "vtbl %d not updated %p %p\n", \ i, stub_vtbl[i]->Vtbl.name, CStd_##name ) #define VTBL_TEST_ZERO(name, i) \ ok(stub_vtbl[i]->Vtbl.name == NULL, #name "vtbl %d not null %p\n", \ i, stub_vtbl[i]->Vtbl.name ) VTBL_TEST_NOT_CHANGE_TO(QueryInterface, 0); VTBL_TEST_NOT_CHANGE_TO(AddRef, 0); VTBL_TEST_NOT_CHANGE_TO(Release, 0); VTBL_TEST_NOT_CHANGE_TO(Connect, 0); VTBL_TEST_NOT_CHANGE_TO(Disconnect, 0); VTBL_TEST_NOT_CHANGE_TO(Invoke, 0); VTBL_TEST_NOT_CHANGE_TO(IsIIDSupported, 0); VTBL_TEST_NOT_CHANGE_TO(CountRefs, 0); VTBL_TEST_NOT_CHANGE_TO(DebugServerQueryInterface, 0); VTBL_TEST_NOT_CHANGE_TO(DebugServerRelease, 0); VTBL_TEST_CHANGE_TO(QueryInterface, 1); VTBL_TEST_CHANGE_TO(AddRef, 1); VTBL_TEST_NOT_CHANGE_TO(Release, 1); VTBL_TEST_NOT_CHANGE_TO(Connect, 1); VTBL_TEST_NOT_CHANGE_TO(Disconnect, 1); VTBL_TEST_CHANGE_TO(Invoke, 1); VTBL_TEST_CHANGE_TO(IsIIDSupported, 1); VTBL_TEST_NOT_CHANGE_TO(CountRefs, 1); VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 1); VTBL_TEST_CHANGE_TO(DebugServerRelease, 1); VTBL_TEST_CHANGE_TO(QueryInterface, 2); VTBL_TEST_CHANGE_TO(AddRef, 2); VTBL_TEST_ZERO(Release, 2); VTBL_TEST_CHANGE_TO(Connect, 2); VTBL_TEST_CHANGE_TO(Disconnect, 2); VTBL_TEST_CHANGE_TO(Invoke, 2); VTBL_TEST_CHANGE_TO(IsIIDSupported, 2); VTBL_TEST_CHANGE_TO(CountRefs, 2); VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 2); VTBL_TEST_CHANGE_TO(DebugServerRelease, 2); VTBL_TEST_CHANGE_TO(QueryInterface, 3); VTBL_TEST_CHANGE_TO(AddRef, 3); VTBL_TEST_ZERO(Release, 3); VTBL_TEST_NOT_CHANGE_TO(Connect, 3); VTBL_TEST_NOT_CHANGE_TO(Disconnect, 3); VTBL_TEST_CHANGE_TO(Invoke, 3); VTBL_TEST_CHANGE_TO(IsIIDSupported, 3); VTBL_TEST_NOT_CHANGE_TO(CountRefs, 3); VTBL_TEST_CHANGE_TO(DebugServerQueryInterface, 3); VTBL_TEST_CHANGE_TO(DebugServerRelease, 3); #define VTBL_PROXY_TEST(i,num,ptr) \ ok( check_address(proxy_vtbl[i]->Vtbl[num], (ptr)), "wrong proxy %u func %u %p/%p\n", \ (i), (num), proxy_vtbl[i]->Vtbl[num], (ptr) ) #define VTBL_PROXY_TEST_NOT_ZERO(i,num) \ ok( proxy_vtbl[i]->Vtbl[num] != NULL, "wrong proxy %u func %u is NULL\n", (i), (num)) VTBL_PROXY_TEST(0, 0, IUnknown_QueryInterface_Proxy); VTBL_PROXY_TEST(0, 1, IUnknown_AddRef_Proxy); VTBL_PROXY_TEST(0, 2, IUnknown_Release_Proxy); VTBL_PROXY_TEST(0, 3, if1_fn1_Proxy); VTBL_PROXY_TEST(0, 4, if1_fn2_Proxy); VTBL_PROXY_TEST(1, 0, GetProcAddress(rpcrt4,"IUnknown_QueryInterface_Proxy")); VTBL_PROXY_TEST(1, 1, GetProcAddress(rpcrt4,"IUnknown_AddRef_Proxy")); VTBL_PROXY_TEST(1, 2, GetProcAddress(rpcrt4,"IUnknown_Release_Proxy")); VTBL_PROXY_TEST_NOT_ZERO(1, 3); VTBL_PROXY_TEST_NOT_ZERO(1, 4); VTBL_PROXY_TEST_NOT_ZERO(1, 5); VTBL_PROXY_TEST_NOT_ZERO(1, 6); VTBL_PROXY_TEST_NOT_ZERO(1, 7); VTBL_PROXY_TEST_NOT_ZERO(1, 8); VTBL_PROXY_TEST_NOT_ZERO(1, 9); VTBL_PROXY_TEST_NOT_ZERO(1, 10); VTBL_PROXY_TEST_NOT_ZERO(1, 11); VTBL_PROXY_TEST_NOT_ZERO(1, 12); VTBL_PROXY_TEST(2, 0, IUnknown_QueryInterface_Proxy); VTBL_PROXY_TEST(2, 1, IUnknown_AddRef_Proxy); VTBL_PROXY_TEST(2, 2, IUnknown_Release_Proxy); VTBL_PROXY_TEST(2, 3, if1_fn1_Proxy); todo_wine VTBL_PROXY_TEST_NOT_ZERO(2, 4); VTBL_PROXY_TEST(3, 0, GetProcAddress(rpcrt4,"IUnknown_QueryInterface_Proxy")); VTBL_PROXY_TEST(3, 1, GetProcAddress(rpcrt4,"IUnknown_AddRef_Proxy")); VTBL_PROXY_TEST(3, 2, GetProcAddress(rpcrt4,"IUnknown_Release_Proxy")); VTBL_PROXY_TEST_NOT_ZERO(3, 3); VTBL_PROXY_TEST_NOT_ZERO(3, 4); VTBL_PROXY_TEST_NOT_ZERO(3, 5); VTBL_PROXY_TEST_NOT_ZERO(3, 6); #undef VTBL_TEST_NOT_CHANGE_TO #undef VTBL_TEST_CHANGE_TO #undef VTBL_TEST_ZERO #undef VTBL_PROXY_TEST #undef VTBL_PROXY_TEST_NOT_ZERO for (i = 0; i < sizeof(interfaces)/sizeof(interfaces[0]); i++) ok( proxy_vtbl[i]->header.piid == interfaces[i], "wrong proxy %u iid %p/%p\n", i, proxy_vtbl[i]->header.piid, interfaces[i] ); ok(PSFactoryBuffer.RefCount == 1, "ref count %d\n", PSFactoryBuffer.RefCount); IPSFactoryBuffer_Release(ppsf); r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list, NULL, &PSFactoryBuffer); ok(r == S_OK, "ret %08x\n", r); ok(ppsf != NULL, "ppsf == NULL\n"); return ppsf; }