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