为什么对我的IDispatch对象的所有引用都没有释放?
Why are all references to my IDispatch object not released?
我在我的c++程序中托管一个IWebBrowser2控件,使用的只是普通的Win32(没有mfc, atl, wtl等)。在DISPID_NAVIGATECOMPLETE2上,我添加了一个自定义对象,以便从运行在显示网页上的javascript访问。
为了添加自定义对象,我使用DISPATCH_PROPERTYPUT和一个带有指向自定义对象指针的disparams结构调用InvokeEx。
在调用InvokeEx期间,调用自定义对象的AddRef函数,并增加其引用计数器。但是对象永远不会调用它的Release函数,所以引用计数器永远不会再降为零。
谁负责调用Release()后,AddRef()已在InvokeEx调用?
EDIT:(添加一些代码)
这是将我的自定义对象添加到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, ¶ms, NULL, NULL, NULL);
这是我要添加的对象(为了简洁,省略了一些私有成员)
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。如果可以,请分叉并改进:)
你在分配一个属性,不是吗?只要这个属性存在并且引用你的对象,它就会被添加一个引用。
如果你想让远程对象释放你的引用,你应该给属性赋NULL,或者赋其他对象。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 释放错误后堆使用
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 引用释放的内存是未定义的行为吗?
- 为什么在取消引用/释放动态创建的对象后,它仍然在 c++ 中被引用?
- 当原始指针和唯一指针都引用同一对象时,如何避免双重释放
- C++ 如何释放对外部对象的静态引用
- 删除引用时出现未分配释放的指针错误
- 如何在派生的子级中释放使用app_indicator_new创建的AppIndicator引用
- C/C++ 通过调用引用或直接释放指针
- 为什么对我的IDispatch对象的所有引用都没有释放?
- 使用JNIEnv::FindClass:我需要释放返回的jclass引用
- 为什么指向释放内存的引用有效
- 如何释放由 "new" 分配的内存,但不显式引用相应的指针