[PATCH] riched20: Don't create too many IRichEditOle interfaces for a RichEdit. (try 2)

Jactry Zeng jactry92 at gmail.com
Wed Jun 25 09:57:29 CDT 2014


Hi Huw,
2014-06-25 19:18 GMT+08:00 Huw Davies <huw at codeweavers.com>:
>
> > diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
> > index 2af2582..65e70fa 100644
> > --- a/dlls/riched20/editor.c
> > +++ b/dlls/riched20/editor.c
> > @@ -4468,6 +4468,13 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor,
UINT msg, WPARAM wParam,
> >    case EM_GETOLEINTERFACE:
> >    {
> >      LPVOID *ppvObj = (LPVOID*) lParam;
> > +    if (editor->reOle)
> > +    {
> > +        *ppvObj = editor->reOle;
> > +        IRichEditOle_AddRef(*ppvObj);
> > +        return 1;
> > +    }
> > +
> >      return CreateIRichEditOle(editor, ppvObj);
> >    }
> >    case EM_GETPASSWORDCHAR:
>
>
> Better to assign editor->reOle here too.
> That will be one ref, then every returned iface should add
> another ref.  So the first iface returned will have
> refcount of 2 and then your tests will pass.
>
> You release the final ref in the editor destructor.

Is this the right way? :

@@ -4468,7 +4468,20 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT
msg, WPARAM wParam,
   case EM_GETOLEINTERFACE:
   {
     LPVOID *ppvObj = (LPVOID*) lParam;
-    return CreateIRichEditOle(editor, ppvObj);
+    if (editor->reOle)
+    {
+        *ppvObj = editor->reOle;
+        IRichEditOle_AddRef(*ppvObj);
+        return 1;
+    }
+
+    if (CreateIRichEditOle(editor, ppvObj))
+    {
+        editor->reOle = *ppvObj;
+        IRichEditOle_AddRef(*ppvObj);
+        return 1;
+    }
+    return 0;
   }

ref will be one when created, and will increase every time returned iface.
And in this way, IRichEditOle_fnRelease also should be modified:

@@ -126,12 +126,13 @@ IRichEditOle_fnRelease(IRichEditOle *me)

     TRACE ("%p ref=%u\n", This, ref);

-    if (!ref)
+    if (ref == 1)
     {
         TRACE ("Destroying %p\n", This);
         This->txtSel->reOle = NULL;
         ITextSelection_Release(&This->txtSel->ITextSelection_iface);
         IOleClientSite_Release(&This->clientSite->IOleClientSite_iface);
+        This->editor->reOle = NULL;
         heap_free(This);
     }
     return ref;

>
> > diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
> > index f139c29..3722c82 100644
> > --- a/dlls/riched20/editstr.h
> > +++ b/dlls/riched20/editstr.h
> > @@ -388,6 +388,7 @@ typedef struct tagME_TextEditor
> >  {
> >    HWND hWnd, hwndParent;
> >    ITextHost *texthost;
> > +  LPVOID reOle;
>
> Needs correct type.

@@ -388,6 +388,7 @@ typedef struct tagME_TextEditor
 {
   HWND hWnd, hwndParent;
   ITextHost *texthost;
+  IRichEditOle *reOle;
   BOOL bEmulateVersion10;
   ME_TextBuffer *pBuffer;
   ME_Cursor *pCursors;


Thanks again!
-- 
Regards,
Jactry Zeng
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20140625/4dcd1452/attachment-0001.html>


More information about the wine-devel mailing list