Hi Huw, 2014-09-11 19:55 GMT+08:00 Huw Davies huw@codeweavers.com:
This looks very suspicious to me. You're storing a reference to 'reOle' so you should AddRef it somewhere. It may be better to pass the interface ptr, AddRef and store that.
Also, is the purpose of rangelist just to be able to NULL out reOle when the parent object is destroyed? If so, this can go away if you correctly handle the ref counting.
Thanks for your review!
I have tested ref count of reOle/txtDoc in Windows, and ref count of reOle/txtDoc didn't increase after ITextDocument::Range. So I didn't call AddRef in ITextDocument::Range.
create_interfaces(&w, &reOle, &txtDoc, NULL); refcount = get_refcount((IUnknown *)txtDoc); ok(refcount == 3, "got wrong ref count: %d\n", refcount); hres = ITextDocument_Range(txtDoc, 0, 0, &txtRge); ok(hres == S_OK, "ITextDocument_Range fails 0x%x.\n", hres); refcount = get_refcount((IUnknown *)txtRge); ok(refcount == 1, "get wrong refcount: returned %d expected 1\n", refcount); refcount = get_refcount((IUnknown *)txtDoc); ok(refcount == 3, "got wrong ref count: %d\n", refcount);