Piotr Caban : oleaut32: Added ICreateTypeInfo2_SetFuncHelpContext implementation.

Alexandre Julliard julliard at winehq.org
Tue Mar 16 11:49:16 CDT 2010


Module: wine
Branch: master
Commit: 3c747fec5024394fc35d5f5321f1f4cc87421f76
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3c747fec5024394fc35d5f5321f1f4cc87421f76

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Mar 15 23:38:57 2010 +0100

oleaut32: Added ICreateTypeInfo2_SetFuncHelpContext implementation.

---

 dlls/oleaut32/tests/typelib.c |   12 ++++++++++++
 dlls/oleaut32/typelib2.c      |   38 ++++++++++++++++++++++++++++++++++++--
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 7b1d0fe..0b26e6c 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -1106,6 +1106,9 @@ static void test_CreateTypeLib(void) {
     hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
     ok(hres == S_OK, "got %08x\n", hres);
 
+    hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
+    ok(hres == S_OK, "got %08x\n", hres);
+
     funcdesc.invkind = INVOKE_PROPERTYPUT;
     hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
     ok(hres == TYPE_E_INCONSISTENTPROPFUNCS, "got %08x\n", hres);
@@ -1126,10 +1129,19 @@ static void test_CreateTypeLib(void) {
     hres = ICreateTypeInfo_AddFuncDesc(createti, 1, &funcdesc);
     ok(hres == S_OK, "got %08x\n", hres);
 
+    hres = ICreateTypeInfo_SetFuncHelpContext(createti, 1, 0xabcdefab);
+    ok(hres == S_OK, "got %08x\n", hres);
+
     funcdesc.invkind = INVOKE_PROPERTYPUTREF;
     hres = ICreateTypeInfo_AddFuncDesc(createti, 0, &funcdesc);
     ok(hres == S_OK, "got %08x\n", hres);
 
+    hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0xabcdefab);
+    ok(hres == S_OK, "got %08x\n", hres);
+
+    hres = ICreateTypeInfo_SetFuncHelpContext(createti, 0, 0x201);
+    ok(hres == S_OK, "got %08x\n", hres);
+
     funcdesc.memid = 1;
     funcdesc.lprgelemdescParam = NULL;
     funcdesc.invkind = INVOKE_FUNC;
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index d931c45..08f650c 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -2264,8 +2264,42 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncHelpContext(
         UINT index,
         DWORD dwHelpContext)
 {
-    FIXME("(%p,%d,%d), stub!\n", iface, index, dwHelpContext);
-    return E_OUTOFMEMORY;
+    ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
+    CyclicList *func;
+    int *typedata;
+    int size;
+
+    TRACE("(%p,%d,%d)\n", iface, index, dwHelpContext);
+
+    if(This->typeinfo->cElement<index)
+        return TYPE_E_ELEMENTNOTFOUND;
+
+    if(This->typeinfo->cElement == index)
+        func = This->typedata;
+    else
+        for(func=This->typedata->next->next; func!=This->typedata; func=func->next)
+            if(index-- == 0)
+                break;
+
+    typedata = func->u.data;
+
+    /* Compute func size without arguments */
+    size = typedata[0] - typedata[5]*(typedata[4]&0x1000?16:12);
+
+    /* Allocate memory for HelpContext if needed */
+    if(size < 7*sizeof(int)) {
+        typedata = HeapReAlloc(GetProcessHeap(), 0, typedata, typedata[0]+sizeof(int));
+        if(!typedata)
+            return E_OUTOFMEMORY;
+
+        memmove(&typedata[7], &typedata[6], typedata[0]-sizeof(int)*6);
+        typedata[0] += sizeof(int);
+        This->typedata->next->u.val += sizeof(int);
+        func->u.data = typedata;
+    }
+
+    typedata[6] = dwHelpContext;
+    return S_OK;
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list