ole32: Don't fail in OleCreate if created object doesn't implement IRunnableObject or IOleChache.

This commit is contained in:
Jacek Caban 2006-10-07 14:56:09 +02:00 committed by Alexandre Julliard
parent 06ec62d9c7
commit 2abe8348fa
2 changed files with 70 additions and 26 deletions

View File

@ -2378,23 +2378,26 @@ HRESULT WINAPI OleCreate(
{
IRunnableObject *pRunnable;
IOleCache *pOleCache;
HRESULT hres2;
hres = IUnknown_QueryInterface(pUnk, &IID_IRunnableObject, (void **)&pRunnable);
if (SUCCEEDED(hres))
hres2 = IUnknown_QueryInterface(pUnk, &IID_IRunnableObject, (void **)&pRunnable);
if (SUCCEEDED(hres2))
{
hres = IRunnableObject_Run(pRunnable, NULL);
IRunnableObject_Release(pRunnable);
}
if (SUCCEEDED(hres))
hres = IUnknown_QueryInterface(pUnk, &IID_IOleCache, (void **)&pOleCache);
if (SUCCEEDED(hres))
{
hres2 = IUnknown_QueryInterface(pUnk, &IID_IOleCache, (void **)&pOleCache);
if (SUCCEEDED(hres2))
{
DWORD dwConnection;
hres = IOleCache_Cache(pOleCache, pFormatEtc, ADVF_PRIMEFIRST, &dwConnection);
IOleCache_Release(pOleCache);
}
}
}
if (FAILED(hres))
{

View File

@ -32,8 +32,8 @@
#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr)
static IPersistStorage OleObjectPersistStg;
static IOleCache OleObjectCache;
static IRunnableObject OleObjectRunnable;
static IOleCache *cache;
static IRunnableObject *runnable;
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)
{
CHECK_EXPECTED_METHOD("OleObject_QueryInterface");
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IOleObject))
{
*ppv = (void *)iface;
IUnknown_AddRef(iface);
return S_OK;
}
else if (IsEqualIID(riid, &IID_IPersistStorage))
{
*ppv = &OleObjectPersistStg;
IUnknown_AddRef((IUnknown *)*ppv);
return S_OK;
}
else if (IsEqualIID(riid, &IID_IOleCache))
{
*ppv = &OleObjectCache;
IUnknown_AddRef((IUnknown *)*ppv);
return S_OK;
}
*ppv = cache;
else if (IsEqualIID(riid, &IID_IRunnableObject))
{
*ppv = &OleObjectRunnable;
IUnknown_AddRef((IUnknown *)*ppv);
*ppv = runnable;
if(*ppv) {
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
trace("OleObject_QueryInterface: returning E_NOINTERFACE\n");
*ppv = NULL;
return E_NOINTERFACE;
}
@ -722,7 +713,41 @@ static void test_OleCreate(IStorage *pStorage)
"OleObject_Release",
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;
trace("OleCreate with OLERENDER_NONE:\n");
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);
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");
}