ole32: Pass failures from delegate object's ::QueryInterface in default handler.
This commit is contained in:
parent
ab3740afe6
commit
a5caff3bac
|
@ -230,9 +230,7 @@ static HRESULT WINAPI DefaultHandler_NDIUnknown_QueryInterface(
|
||||||
}
|
}
|
||||||
else if (This->inproc_server && This->pOleDelegate)
|
else if (This->inproc_server && This->pOleDelegate)
|
||||||
{
|
{
|
||||||
HRESULT hr = IUnknown_QueryInterface(This->pOleDelegate, riid, ppvObject);
|
return IUnknown_QueryInterface(This->pOleDelegate, riid, ppvObject);
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
return hr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that we obtained an interface. */
|
/* Check that we obtained an interface. */
|
||||||
|
|
|
@ -44,7 +44,16 @@ static const CLSID CLSID_WineTest =
|
||||||
{0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0}
|
{0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const IID IID_WineTest =
|
||||||
|
{ /* 9474ba1a-258b-490b-bc13-516e9239ace1 */
|
||||||
|
0x9474ba1a,
|
||||||
|
0x258b,
|
||||||
|
0x490b,
|
||||||
|
{0xbc, 0x13, 0x51, 0x6e, 0x92, 0x39, 0xac, 0xe1}
|
||||||
|
};
|
||||||
|
|
||||||
#define TEST_OPTIONAL 0x1
|
#define TEST_OPTIONAL 0x1
|
||||||
|
#define TEST_TODO 0x2
|
||||||
|
|
||||||
struct expected_method
|
struct expected_method
|
||||||
{
|
{
|
||||||
|
@ -58,18 +67,31 @@ static FORMATETC *g_expected_fetc = NULL;
|
||||||
static BOOL g_showRunnable = TRUE;
|
static BOOL g_showRunnable = TRUE;
|
||||||
static BOOL g_isRunning = TRUE;
|
static BOOL g_isRunning = TRUE;
|
||||||
static BOOL g_failGetMiscStatus;
|
static BOOL g_failGetMiscStatus;
|
||||||
|
static HRESULT g_QIFailsWith;
|
||||||
|
|
||||||
#define CHECK_EXPECTED_METHOD(method_name) \
|
#define CHECK_EXPECTED_METHOD(method_name) \
|
||||||
do { \
|
do { \
|
||||||
trace("%s\n", method_name); \
|
trace("%s\n", method_name); \
|
||||||
ok(expected_method_list->method != NULL, "Extra method %s called\n", method_name); \
|
ok(expected_method_list->method != NULL, "Extra method %s called\n", method_name); \
|
||||||
|
if (!strcmp(expected_method_list->method, "WINE_EXTRA")) \
|
||||||
|
{ \
|
||||||
|
todo_wine ok(0, "Too many method calls.\n"); \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
if (expected_method_list->method) \
|
if (expected_method_list->method) \
|
||||||
{ \
|
{ \
|
||||||
while (expected_method_list->flags & TEST_OPTIONAL && \
|
while (expected_method_list->flags & TEST_OPTIONAL && \
|
||||||
strcmp(expected_method_list->method, method_name) != 0) \
|
strcmp(expected_method_list->method, method_name) != 0) \
|
||||||
expected_method_list++; \
|
expected_method_list++; \
|
||||||
ok(!strcmp(expected_method_list->method, method_name), "Expected %s to be called instead of %s\n", \
|
if (expected_method_list->flags & TEST_TODO) \
|
||||||
expected_method_list->method, method_name); \
|
todo_wine \
|
||||||
|
ok(!strcmp(expected_method_list->method, method_name), \
|
||||||
|
"Expected %s to be called instead of %s\n", \
|
||||||
|
expected_method_list->method, method_name); \
|
||||||
|
else \
|
||||||
|
ok(!strcmp(expected_method_list->method, method_name), \
|
||||||
|
"Expected %s to be called instead of %s\n", \
|
||||||
|
expected_method_list->method, method_name); \
|
||||||
expected_method_list++; \
|
expected_method_list++; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
@ -95,6 +117,8 @@ static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, v
|
||||||
*ppv = cache;
|
*ppv = cache;
|
||||||
else if (IsEqualIID(riid, &IID_IRunnableObject) && g_showRunnable)
|
else if (IsEqualIID(riid, &IID_IRunnableObject) && g_showRunnable)
|
||||||
*ppv = runnable;
|
*ppv = runnable;
|
||||||
|
else if (IsEqualIID(riid, &IID_WineTest))
|
||||||
|
return g_QIFailsWith;
|
||||||
|
|
||||||
if(*ppv) {
|
if(*ppv) {
|
||||||
IUnknown_AddRef((IUnknown*)*ppv);
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
|
@ -1464,10 +1488,25 @@ static void test_default_handler(void)
|
||||||
FORMATETC fmtetc;
|
FORMATETC fmtetc;
|
||||||
IOleInPlaceObject *pInPlaceObj;
|
IOleInPlaceObject *pInPlaceObj;
|
||||||
IEnumOLEVERB *pEnumVerbs;
|
IEnumOLEVERB *pEnumVerbs;
|
||||||
|
DWORD dwRegister;
|
||||||
static const WCHAR wszUnknown[] = {'U','n','k','n','o','w','n',0};
|
static const WCHAR wszUnknown[] = {'U','n','k','n','o','w','n',0};
|
||||||
static const WCHAR wszHostName[] = {'W','i','n','e',' ','T','e','s','t',' ','P','r','o','g','r','a','m',0};
|
static const WCHAR wszHostName[] = {'W','i','n','e',' ','T','e','s','t',' ','P','r','o','g','r','a','m',0};
|
||||||
static const WCHAR wszDelim[] = {'!',0};
|
static const WCHAR wszDelim[] = {'!',0};
|
||||||
|
|
||||||
|
static const struct expected_method methods_embeddinghelper[] =
|
||||||
|
{
|
||||||
|
{ "OleObject_QueryInterface", 0 },
|
||||||
|
{ "OleObject_AddRef", 0 },
|
||||||
|
{ "OleObject_QueryInterface", 0 },
|
||||||
|
{ "OleObject_QueryInterface", TEST_TODO },
|
||||||
|
{ "OleObject_QueryInterface", 0 },
|
||||||
|
{ "OleObject_QueryInterface", 0 },
|
||||||
|
{ "OleObject_QueryInterface", TEST_OPTIONAL }, /* Win95/98/NT4 */
|
||||||
|
{ "OleObject_Release", TEST_TODO },
|
||||||
|
{ "WINE_EXTRA", TEST_OPTIONAL },
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
hr = CoCreateInstance(&CLSID_WineTest, NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void **)&pObject);
|
hr = CoCreateInstance(&CLSID_WineTest, NULL, CLSCTX_INPROC_HANDLER, &IID_IOleObject, (void **)&pObject);
|
||||||
ok(hr == REGDB_E_CLASSNOTREG, "CoCreateInstance should have failed with REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
|
ok(hr == REGDB_E_CLASSNOTREG, "CoCreateInstance should have failed with REGDB_E_CLASSNOTREG instead of 0x%08x\n", hr);
|
||||||
|
|
||||||
|
@ -1595,6 +1634,45 @@ static void test_default_handler(void)
|
||||||
|
|
||||||
IRunnableObject_Release(pRunnableObject);
|
IRunnableObject_Release(pRunnableObject);
|
||||||
IOleObject_Release(pObject);
|
IOleObject_Release(pObject);
|
||||||
|
|
||||||
|
/* Test failure propagation from delegate ::QueryInterface */
|
||||||
|
hr = CoRegisterClassObject(&CLSID_WineTest, (IUnknown*)&OleObjectCF,
|
||||||
|
CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
|
||||||
|
ok_ole_success(hr, "CoRegisterClassObject");
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
expected_method_list = methods_embeddinghelper;
|
||||||
|
hr = OleCreateEmbeddingHelper(&CLSID_WineTest, NULL, EMBDHLP_INPROC_SERVER,
|
||||||
|
&OleObjectCF, &IID_IOleObject, (void**)&pObject);
|
||||||
|
ok_ole_success(hr, "OleCreateEmbeddingHelper");
|
||||||
|
if(SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
IUnknown *punk;
|
||||||
|
|
||||||
|
g_QIFailsWith = E_FAIL;
|
||||||
|
hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
|
||||||
|
ok(hr == E_FAIL, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
g_QIFailsWith = E_NOINTERFACE;
|
||||||
|
hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
|
||||||
|
ok(hr == E_NOINTERFACE, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
g_QIFailsWith = CO_E_OBJNOTCONNECTED;
|
||||||
|
hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
|
||||||
|
ok(hr == CO_E_OBJNOTCONNECTED, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
g_QIFailsWith = 0x87654321;
|
||||||
|
hr = IOleObject_QueryInterface(pObject, &IID_WineTest, (void**)&punk);
|
||||||
|
ok(hr == 0x87654321, "Got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
IOleObject_Release(pObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECK_NO_EXTRA_METHODS();
|
||||||
|
|
||||||
|
hr = CoRevokeClassObject(dwRegister);
|
||||||
|
ok_ole_success(hr, "CoRevokeClassObject");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_runnable(void)
|
static void test_runnable(void)
|
||||||
|
|
Loading…
Reference in New Issue