On Thu, Jun 26, 2014 at 02:52:16PM +0800, Jactry Zeng wrote:
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index 2af2582..55821bf 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -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;
I'm sure you can think about how to simplify this a bit. The clue that it needs simplification is that you've got two AddRef()s in there.
Hint: The code is trying to do two things:
1. If needed, assign an interface to reOle 2. AddRef and return.
--- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -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;
No, this is wrong. This function should remain unchanged.
The editor is in charge of the reOle reference, so it needs to release it when the editor is destroyed - ie in ME_DestroyEditor().
Huw.