ole32: Don't fail in OleCreate if created object doesn't implement IRunnableObject or IOleChache.
This commit is contained in:
parent
06ec62d9c7
commit
2abe8348fa
@ -2378,21 +2378,24 @@ HRESULT WINAPI OleCreate(
|
|||||||
{
|
{
|
||||||
IRunnableObject *pRunnable;
|
IRunnableObject *pRunnable;
|
||||||
IOleCache *pOleCache;
|
IOleCache *pOleCache;
|
||||||
|
HRESULT hres2;
|
||||||
|
|
||||||
hres = IUnknown_QueryInterface(pUnk, &IID_IRunnableObject, (void **)&pRunnable);
|
hres2 = IUnknown_QueryInterface(pUnk, &IID_IRunnableObject, (void **)&pRunnable);
|
||||||
if (SUCCEEDED(hres))
|
if (SUCCEEDED(hres2))
|
||||||
{
|
{
|
||||||
hres = IRunnableObject_Run(pRunnable, NULL);
|
hres = IRunnableObject_Run(pRunnable, NULL);
|
||||||
IRunnableObject_Release(pRunnable);
|
IRunnableObject_Release(pRunnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SUCCEEDED(hres))
|
|
||||||
hres = IUnknown_QueryInterface(pUnk, &IID_IOleCache, (void **)&pOleCache);
|
|
||||||
if (SUCCEEDED(hres))
|
if (SUCCEEDED(hres))
|
||||||
{
|
{
|
||||||
DWORD dwConnection;
|
hres2 = IUnknown_QueryInterface(pUnk, &IID_IOleCache, (void **)&pOleCache);
|
||||||
hres = IOleCache_Cache(pOleCache, pFormatEtc, ADVF_PRIMEFIRST, &dwConnection);
|
if (SUCCEEDED(hres2))
|
||||||
IOleCache_Release(pOleCache);
|
{
|
||||||
|
DWORD dwConnection;
|
||||||
|
hres = IOleCache_Cache(pOleCache, pFormatEtc, ADVF_PRIMEFIRST, &dwConnection);
|
||||||
|
IOleCache_Release(pOleCache);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr)
|
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr)
|
||||||
|
|
||||||
static IPersistStorage OleObjectPersistStg;
|
static IPersistStorage OleObjectPersistStg;
|
||||||
static IOleCache OleObjectCache;
|
static IOleCache *cache;
|
||||||
static IRunnableObject OleObjectRunnable;
|
static IRunnableObject *runnable;
|
||||||
|
|
||||||
static char const * const *expected_method_list;
|
static char const * const *expected_method_list;
|
||||||
|
|
||||||
@ -52,33 +52,24 @@ static char const * const *expected_method_list;
|
|||||||
static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
|
static HRESULT WINAPI OleObject_QueryInterface(IOleObject *iface, REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
CHECK_EXPECTED_METHOD("OleObject_QueryInterface");
|
CHECK_EXPECTED_METHOD("OleObject_QueryInterface");
|
||||||
|
|
||||||
|
*ppv = NULL;
|
||||||
|
|
||||||
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleObject))
|
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleObject))
|
||||||
{
|
|
||||||
*ppv = (void *)iface;
|
*ppv = (void *)iface;
|
||||||
IUnknown_AddRef(iface);
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else if (IsEqualIID(riid, &IID_IPersistStorage))
|
else if (IsEqualIID(riid, &IID_IPersistStorage))
|
||||||
{
|
|
||||||
*ppv = &OleObjectPersistStg;
|
*ppv = &OleObjectPersistStg;
|
||||||
IUnknown_AddRef((IUnknown *)*ppv);
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else if (IsEqualIID(riid, &IID_IOleCache))
|
else if (IsEqualIID(riid, &IID_IOleCache))
|
||||||
{
|
*ppv = cache;
|
||||||
*ppv = &OleObjectCache;
|
|
||||||
IUnknown_AddRef((IUnknown *)*ppv);
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
else if (IsEqualIID(riid, &IID_IRunnableObject))
|
else if (IsEqualIID(riid, &IID_IRunnableObject))
|
||||||
{
|
*ppv = runnable;
|
||||||
*ppv = &OleObjectRunnable;
|
|
||||||
IUnknown_AddRef((IUnknown *)*ppv);
|
if(*ppv) {
|
||||||
|
IUnknown_AddRef((IUnknown*)*ppv);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace("OleObject_QueryInterface: returning E_NOINTERFACE\n");
|
trace("OleObject_QueryInterface: returning E_NOINTERFACE\n");
|
||||||
*ppv = NULL;
|
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -722,7 +713,41 @@ static void test_OleCreate(IStorage *pStorage)
|
|||||||
"OleObject_Release",
|
"OleObject_Release",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
static const char *methods_olerender_draw_no_runnable[] =
|
||||||
|
{
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObject_AddRef",
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObjectPersistStg_AddRef",
|
||||||
|
"OleObjectPersistStg_InitNew",
|
||||||
|
"OleObjectPersistStg_Release",
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObjectCache_AddRef",
|
||||||
|
"OleObjectCache_Cache",
|
||||||
|
"OleObjectCache_Release",
|
||||||
|
"OleObject_Release",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
static const char *methods_olerender_draw_no_cache[] =
|
||||||
|
{
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObject_AddRef",
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObjectPersistStg_AddRef",
|
||||||
|
"OleObjectPersistStg_InitNew",
|
||||||
|
"OleObjectPersistStg_Release",
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObjectRunnable_AddRef",
|
||||||
|
"OleObjectRunnable_Run",
|
||||||
|
"OleObjectRunnable_Release",
|
||||||
|
"OleObject_QueryInterface",
|
||||||
|
"OleObject_Release",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
runnable = &OleObjectRunnable;
|
||||||
|
cache = &OleObjectCache;
|
||||||
expected_method_list = methods_olerender_none;
|
expected_method_list = methods_olerender_none;
|
||||||
trace("OleCreate with OLERENDER_NONE:\n");
|
trace("OleCreate with OLERENDER_NONE:\n");
|
||||||
hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject);
|
hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_NONE, NULL, NULL, pStorage, (void **)&pObject);
|
||||||
@ -756,6 +781,22 @@ static void test_OleCreate(IStorage *pStorage)
|
|||||||
IOleObject_Release(pObject);
|
IOleObject_Release(pObject);
|
||||||
ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
|
ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
|
||||||
|
|
||||||
|
runnable = NULL;
|
||||||
|
expected_method_list = methods_olerender_draw_no_runnable;
|
||||||
|
trace("OleCreate with OLERENDER_DRAW (no IOlObjectRunnable):\n");
|
||||||
|
hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
|
||||||
|
ok_ole_success(hr, "OleCreate");
|
||||||
|
IOleObject_Release(pObject);
|
||||||
|
ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
|
||||||
|
|
||||||
|
runnable = &OleObjectRunnable;
|
||||||
|
cache = NULL;
|
||||||
|
expected_method_list = methods_olerender_draw_no_cache;
|
||||||
|
trace("OleCreate with OLERENDER_DRAW (no IOlObjectRunnable):\n");
|
||||||
|
hr = OleCreate(&CLSID_Equation3, &IID_IOleObject, OLERENDER_DRAW, NULL, NULL, pStorage, (void **)&pObject);
|
||||||
|
ok_ole_success(hr, "OleCreate");
|
||||||
|
IOleObject_Release(pObject);
|
||||||
|
ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list);
|
||||||
trace("end\n");
|
trace("end\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user