Huw Davies : oleaut32: Implement ITypeInfo_CreateInstance.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Oct 9 14:05:11 CDT 2006
Module: wine
Branch: master
Commit: 03ec218326dc857e926674ae737cfb2f69666a2d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=03ec218326dc857e926674ae737cfb2f69666a2d
Author: Huw Davies <huw at codeweavers.com>
Date: Mon Oct 9 15:04:07 2006 +0100
oleaut32: Implement ITypeInfo_CreateInstance.
---
dlls/oleaut32/typelib.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 45 insertions(+), 3 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 52ce8b4..8ebfd0e 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -5867,11 +5867,53 @@ static HRESULT WINAPI ITypeInfo_fnAddres
* (coclass).
*/
static HRESULT WINAPI ITypeInfo_fnCreateInstance( ITypeInfo2 *iface,
- IUnknown *pUnk, REFIID riid, VOID **ppvObj)
+ IUnknown *pOuterUnk, REFIID riid, VOID **ppvObj)
{
ITypeInfoImpl *This = (ITypeInfoImpl *)iface;
- FIXME("(%p) stub!\n", This);
- return S_OK;
+ HRESULT hr;
+ TYPEATTR *pTA;
+
+ TRACE("(%p)->(%p, %s, %p)\n", This, pOuterUnk, debugstr_guid(riid), ppvObj);
+
+ *ppvObj = NULL;
+
+ if(pOuterUnk)
+ {
+ WARN("Not able to aggregate\n");
+ return CLASS_E_NOAGGREGATION;
+ }
+
+ hr = ITypeInfo_GetTypeAttr(iface, &pTA);
+ if(FAILED(hr)) return hr;
+
+ if(pTA->typekind != TKIND_COCLASS)
+ {
+ WARN("CreateInstance on typeinfo of type %x\n", pTA->typekind);
+ hr = E_INVALIDARG;
+ goto end;
+ }
+
+ hr = S_FALSE;
+ if(pTA->wTypeFlags & TYPEFLAG_FAPPOBJECT)
+ {
+ IUnknown *pUnk;
+ hr = GetActiveObject(&pTA->guid, NULL, &pUnk);
+ TRACE("GetActiveObject rets %08lx\n", hr);
+ if(hr == S_OK)
+ {
+ hr = IUnknown_QueryInterface(pUnk, riid, ppvObj);
+ IUnknown_Release(pUnk);
+ }
+ }
+
+ if(hr != S_OK)
+ hr = CoCreateInstance(&pTA->guid, NULL,
+ CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
+ riid, ppvObj);
+
+end:
+ ITypeInfo_ReleaseTypeAttr(iface, pTA);
+ return hr;
}
/* ITypeInfo::GetMops
More information about the wine-cvs
mailing list