gpt4 book ai didi

c++ - 为什么对我的 IDispatch 对象的所有引用都没有释放?

转载 作者:太空狗 更新时间:2023-10-29 21:50:02 29 4
gpt4 key购买 nike

我在我的 C++ 程序中托管一个 IWebBrowser2 控件,只使用普通的 Win32(没有 mfc、atl、wtl 等)。在 DISPID_NAVIGATECOMPLETE2 上,我添加了一个自定义对象,以便从显示网页上运行的 javascript 访问。

为了添加自定义对象,我使用 DISPATCH_PROPERTYPUT 和一个带有指向自定义对象指针的 DISPPARAMS 结构调用 InvokeEx。

在调用 InvokeEx 期间,我的自定义对象的 AddRef 函数被调用,我增加了它的引用计数器。但是该对象永远不会调用其 Release 函数,因此引用计数器永远不会再次减少到零。

在 InvokeEx 中调用 AddRef() 之后,谁负责调用 Release()?

编辑:(添加一些代码)

这是将我的自定义对象添加到 IHTMLWindow2 的代码。 custObj 指向我的自定义对象

IHTMLWindow2 *win = NULL;
GetDoc()->get_parentWindow(&win);
IDispatchEx *winEx = NULL;
win->QueryInterface(&winEx);

DISPID dispid;
HRESULT hr = winEx->GetDispID(objName, fdexNameEnsure, &dispid); //objName is "JSObject"

DISPID namedArgs[] = {DISPID_PROPERTYPUT};
DISPPARAMS params;
params.rgvarg = new VARIANT[1];
params.rgvarg[0].pdispVal = custObj;
params.rgvarg[0].vt = VT_DISPATCH;
params.rgdispidNamedArgs = namedArgs;
params.cArgs = 1;
params.cNamedArgs = 1;

hr = winEx->InvokeEx(dispid, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &params, NULL, NULL, NULL);

这是我要添加的对象(为简洁起见,一些私有(private)成员已被忽略)

class JSObject : public IDispatch {
private:
long ref;
public:
JSObject();

// IUnknown
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();

// IDispatch
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid,
ITypeInfo **ppTInfo);
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
EXCEPINFO *pExcepInfo, UINT *puArgErr);
};

编辑 2:

既然它看起来工作正常,我应该决定把它放在 github 上吗。

https://github.com/Tobbe/CppIEEmbed .如果可以,请 fork 并改进 :)

最佳答案

好吧,你是在分配一个属性,不是吗?只要此属性存在并引用您的对象,它就会添加一个引用。

如果您希望远程对象释放您的引用,您应该将 NULL 分配给该属性或其他一些对象。

关于c++ - 为什么对我的 IDispatch 对象的所有引用都没有释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7107884/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com