Hi folks,

I wrote two patches for adding IRichEditOle/ITextDocument support for ITextServices::QueryInterface(for bug 17042[1]), but I'm
no sure is it the correct way. I need your review and comment! I will really appreciate it!

There are some tests for ITextServices::QueryInterface in dlls/riched20/txtsrv.c: test_QueryInterfaces():
1. 
    refcount = get_refcount((IUnknown *)txtserv);
    ok(refcount == 1, "got wrong ref count: %d\n", refcount);

    /* IID_IRichEditOle */
    hres = ITextServices_QueryInterface(txtserv, &IID_IRichEditOle, (void **)&txtsrv_reOle);
    ok(hres == S_OK, "ITextServices_QueryInterface\n");

    refcount = get_refcount((IUnknown *)txtserv);
    ok(refcount == 2, "got wrong ref count: %d\n", refcount);

From this case we know ref count of ITextServices will increase after get a IRichEditOle interface from
ITextServices::QueryInterface.  ITextServices::QueryInterface(&IID_ITextDocument) is also similar.

2. 
    refcount = get_refcount((IUnknown *)txtserv);
    ok(refcount == 2, "got wrong ref count: %d\n", refcount);

    if (SUCCEEDED(hres)) {
        refcount = get_refcount((IUnknown *)txtsrv_reOle);
        ok(refcount == 2, "got wrong ref count: %d\n", refcount);

        hres = IRichEditOle_QueryInterface(txtsrv_reOle, &IID_ITextDocument, (void **)&txtDoc);
        ok(hres == S_OK, "IRichEditOle_QueryInterface: 0x%08x\n", hres);
        refcount = get_refcount((IUnknown *)txtserv);
        ok(refcount == 3, "got wrong ref count: %d\n", refcount);
        refcount = get_refcount((IUnknown *)txtsrv_reOle);
        ok(refcount == 3, "got wrong ref count: %d\n", refcount);

From this case we know when a IRichEditOle was got by ITextServices::QueryInterface(&IID_IRichEditOle) then
we used IRichEditOle::QueryInterface to get another interface, the ref count of ITextServices will increase too.
For implementing this feature I added IUnknown *parent in IRichEditOleImpl and passed ITextServices interface into 
CreateIRichEditOle when we call it in ITextServices::QueryInterface:
dlls/riched20/richole.c
---snip---
typedef struct IRichEditOleImpl {
    IRichEditOle IRichEditOle_iface;
    ITextDocument ITextDocument_iface;
    LONG ref;

    ME_TextEditor *editor;
    ITextSelectionImpl *txtSel;
    IOleClientSiteImpl *clientSite;
    struct list rangelist;
    IUnknown *parent;
} IRichEditOleImpl;
---snip---
dlls/riched20/txtsrv.c
---snip---
   else if (IsEqualIID(riid, &IID_IRichEditOle) || IsEqualIID(riid, &IID_ITextDocument)) {
       if (!This->editor->reOle)
           CreateIRichEditOle(This->editor, (LPVOID *)&(This->editor->reOle), iface);
       IRichEditOle_QueryInterface(This->editor->reOle, riid, (void **)ppv);
       return S_OK;
   } else {
---snip---

3. By some other tests, I found when a ITextServices was got by IRichEditOle::QueryInterface, then
we use ITextServices::QueryInterface to got another interface, the ref count of IRichEditOle will increase
too.

Thanks!

[1] https://bugs.winehq.org/show_bug.cgi?id=17042

--
Regards,
Jactry Zeng