ole32: Add inproc handler object creation support for CoCreateInstance.
This commit is contained in:
parent
a7b621bd9b
commit
24cccbf4d1
@ -4106,6 +4106,33 @@ HRESULT WINAPI CoGetContextToken( ULONG_PTR *token )
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT Handler_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
static const WCHAR wszInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
|
||||||
|
HKEY hkey;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
hres = COM_OpenKeyForCLSID(rclsid, wszInprocHandler32, KEY_READ, &hkey);
|
||||||
|
if (SUCCEEDED(hres))
|
||||||
|
{
|
||||||
|
WCHAR dllpath[MAX_PATH+1];
|
||||||
|
|
||||||
|
if (COM_RegReadPath(hkey, NULL, NULL, dllpath, ARRAYSIZE(dllpath)) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
static const WCHAR wszOle32[] = {'o','l','e','3','2','.','d','l','l',0};
|
||||||
|
if (!strcmpiW(dllpath, wszOle32))
|
||||||
|
{
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
return HandlerCF_Create(rclsid, riid, ppv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
WARN("not creating object for inproc handler path %s\n", debugstr_w(dllpath));
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
}
|
||||||
|
|
||||||
|
return CLASS_E_CLASSNOTAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DllMain (OLE32.@)
|
* DllMain (OLE32.@)
|
||||||
|
@ -313,6 +313,9 @@ extern HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID
|
|||||||
extern HRESULT WINAPI OLE32_DllRegisterServer(void) DECLSPEC_HIDDEN;
|
extern HRESULT WINAPI OLE32_DllRegisterServer(void) DECLSPEC_HIDDEN;
|
||||||
extern HRESULT WINAPI OLE32_DllUnregisterServer(void) DECLSPEC_HIDDEN;
|
extern HRESULT WINAPI OLE32_DllUnregisterServer(void) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
extern HRESULT Handler_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv);
|
||||||
|
extern HRESULT HandlerCF_Create(REFCLSID rclsid, REFIID riid, LPVOID *ppv);
|
||||||
|
|
||||||
/* Exported non-interface Data Advise Holder functions */
|
/* Exported non-interface Data Advise Holder functions */
|
||||||
HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate);
|
HRESULT DataAdviseHolder_OnConnect(IDataAdviseHolder *iface, IDataObject *pDelegate);
|
||||||
void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface);
|
void DataAdviseHolder_OnDisconnect(IDataAdviseHolder *iface);
|
||||||
|
@ -2122,3 +2122,77 @@ HRESULT WINAPI OleCreateDefaultHandler(REFCLSID clsid, LPUNKNOWN pUnkOuter,
|
|||||||
return OleCreateEmbeddingHelper(clsid, pUnkOuter, EMBDHLP_INPROC_HANDLER | EMBDHLP_CREATENOW,
|
return OleCreateEmbeddingHelper(clsid, pUnkOuter, EMBDHLP_INPROC_HANDLER | EMBDHLP_CREATENOW,
|
||||||
NULL, riid, ppvObj);
|
NULL, riid, ppvObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct HandlerCF
|
||||||
|
{
|
||||||
|
const IClassFactoryVtbl *lpVtbl;
|
||||||
|
LONG refs;
|
||||||
|
CLSID clsid;
|
||||||
|
} HandlerCF;
|
||||||
|
|
||||||
|
static HRESULT WINAPI
|
||||||
|
HandlerCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
*ppv = NULL;
|
||||||
|
if (IsEqualIID(riid,&IID_IUnknown) ||
|
||||||
|
IsEqualIID(riid,&IID_IClassFactory))
|
||||||
|
{
|
||||||
|
*ppv = iface;
|
||||||
|
IClassFactory_AddRef(iface);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI HandlerCF_AddRef(LPCLASSFACTORY iface)
|
||||||
|
{
|
||||||
|
HandlerCF *This = (HandlerCF *)iface;
|
||||||
|
return InterlockedIncrement(&This->refs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI HandlerCF_Release(LPCLASSFACTORY iface)
|
||||||
|
{
|
||||||
|
HandlerCF *This = (HandlerCF *)iface;
|
||||||
|
ULONG refs = InterlockedDecrement(&This->refs);
|
||||||
|
if (!refs)
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
return refs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI
|
||||||
|
HandlerCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pUnk,
|
||||||
|
REFIID riid, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
HandlerCF *This = (HandlerCF *)iface;
|
||||||
|
return OleCreateDefaultHandler(&This->clsid, pUnk, riid, ppv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI HandlerCF_LockServer(LPCLASSFACTORY iface, BOOL fLock)
|
||||||
|
{
|
||||||
|
FIXME("(%d), stub!\n",fLock);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IClassFactoryVtbl HandlerClassFactoryVtbl = {
|
||||||
|
HandlerCF_QueryInterface,
|
||||||
|
HandlerCF_AddRef,
|
||||||
|
HandlerCF_Release,
|
||||||
|
HandlerCF_CreateInstance,
|
||||||
|
HandlerCF_LockServer
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT HandlerCF_Create(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
HandlerCF *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
|
||||||
|
if (!This) return E_OUTOFMEMORY;
|
||||||
|
This->lpVtbl = &HandlerClassFactoryVtbl;
|
||||||
|
This->refs = 0;
|
||||||
|
This->clsid = *rclsid;
|
||||||
|
|
||||||
|
hr = IUnknown_QueryInterface((IUnknown *)&This->lpVtbl, riid, ppv);
|
||||||
|
if (FAILED(hr))
|
||||||
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
*/
|
*/
|
||||||
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
|
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
|
||||||
{
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&(
|
if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&(
|
||||||
IsEqualIID(iid,&IID_IClassFactory) ||
|
IsEqualIID(iid,&IID_IClassFactory) ||
|
||||||
@ -70,5 +72,9 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
|
|||||||
if (IsEqualGUID(rclsid, &CLSID_StdComponentCategoriesMgr))
|
if (IsEqualGUID(rclsid, &CLSID_StdComponentCategoriesMgr))
|
||||||
return ComCatCF_Create(iid, ppv);
|
return ComCatCF_Create(iid, ppv);
|
||||||
|
|
||||||
return OLE32_DllGetClassObject(rclsid, iid, ppv);
|
hr = OLE32_DllGetClassObject(rclsid, iid, ppv);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
return Handler_DllGetClassObject(rclsid, iid, ppv);
|
||||||
}
|
}
|
||||||
|
@ -2314,7 +2314,6 @@ static void test_inproc_handler(void)
|
|||||||
reg_unreg_wine_test_class(TRUE);
|
reg_unreg_wine_test_class(TRUE);
|
||||||
|
|
||||||
hr = CoCreateInstance(&CLSID_WineTest, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&pObject);
|
hr = CoCreateInstance(&CLSID_WineTest, NULL, CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void **)&pObject);
|
||||||
todo_wine
|
|
||||||
ok_ole_success(hr, "CoCreateInstance");
|
ok_ole_success(hr, "CoCreateInstance");
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user