- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在我的 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, ¶ms, 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/
我目前正在开发一个 COM 服务器(使用 ATL)供闭源 VB 使用应用。到目前为止一切正常,但我想确保没有泄漏那里...所以我的问题是: 我是否必须在通过以下方式获得的 IDispatch 指针上调
我想枚举一台机器上的所有 IDispatch 支持对象。目前我需要知道类 ID 或程序 ID 是什么,但是为了检查我的机器,我想知道我是否可以枚举所有实现 IDispatch 的对象。 这可能吗? 任
我有一个 ATL COM 组件,它引发一些由托管(C# 和 VB.NET)代码处理的事件。该组件当前由 VS2005 VB.NET 项目(作为 ActiveX 控件)使用,并且引发了所有事件并且一切正
我正在使用 ATL 将旧的 VB COM 对象(不是我写的)转换为 C++。根据 IDL,其中一种方法采用 IDispatch* 作为参数,此方法的文档和示例声称您可以传递一个字符串(这是一个对象的
我一直在考虑尝试使用实现 OPOS 服务对象的 C# 编写 COM 对象。我已经使用 Automation 和 MFC 在 C++ 中完成了它,这并不太难。所以我一直坚持尝试将其转换的方法之一。我将排
我用一个简单的 COM 对象编写了一个简单的 COM DLL inproc 服务器。 COM 对象实现了一个连接点。 我知道如何创建从 IDispEventImpl 派生的 ATL 客户端,并使用接收
在第三方 COM 模块中,我必须将结构传递给方法。 IDL 定义的重要部分如下所示: interface ITheirInterface : IDispatch { [id(0x0000012
我在我的 C++ 程序中托管一个 IWebBrowser2 控件,只使用普通的 Win32(没有 mfc、atl、wtl 等)。在 DISPID_NAVIGATECOMPLETE2 上,我添加了一个自
我在返回 HRESULTS 的 WMI/WBEM 接口(interface)上调用方法。我想向用户显示这些错误代码的有意义的错误消息。但是,当我查找 HRESULT 的错误消息时,我只得到类似“IDi
今天我带来了另一个让我头疼的问题, 我确实将一个 DAO 3.6 类型库导入到我的 delphi 7 中,并且我开始看到许多有趣的接口(interface),所以我面临着一个有趣的问题。 每次Fiel
如何在Delphi中释放IDispatch COM对象?我必须这样做吗? type IUtility = interface(IDispatch); var obj: IUtility; beg
如果我使用错误的参数数量/类型通过 IDispatch(后期绑定(bind))调用 COM 对象的方法,是否会返回一些错误代码,或者程序会崩溃或出现其他故障?我只想知道使用 IDispatch 进行后
明天我计划做一些 IDispatch 相关的工作,我将不得不创建一个支持这个接口(interface)的类。 我一直在使用 ATL 类来创建 COM 对象和管理 COM 指针,所以我也想将它们用于我的
我有一个函数,它通过参数(项目)返回一个指向接口(interface)指针的指针: CreateProject(std::string str, IDispatch** project); 鉴于另外两
我一直在用 C# 开发 Web 服务,以将网站与本地数据库链接起来。本地应用程序的 SDK 是一个 COM 对象。第二天,我开始思考如何将下面的 VB 代码(在 SDK 协议(protocol)中给出
继续 this question ,我很困惑 IDispatch::Invoke() 上的 DISPID_VALUE 是否可以将脚本函数和属性(在我的例子中是 JavaScript)视为调用实际函数的
我在使用 IDispatch.Invoke 调用具有浮点参数和浮点结果的函数时遇到问题。 这是一个最小的复制: #include #include int main(int argc, char*
我不知道是否有人熟悉 BHO(浏览器助手对象),但是 c++ 专家也可以帮助我。 在我的 BHO 中,我只想在主框架上运行 OnDocumentComplete() 函数 - 第一个容器,而不是当前页
我正在编写一些测试代码来模拟调用我的延迟绑定(bind) COM 对象的 C# 实现的非托管代码。我有一个声明为 IDispatch 类型的接口(interface),如下所示。 [Guid("2D
我是物理学家。我正在尝试使用导入的 activex 控件(ocx 文件)在 Delphi 上工作。假设库中有 3 个自动化接口(interface):IGraph、IGraphAxes 和 IAxis
我是一名优秀的程序员,十分优秀!