- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我不知道是否有人熟悉 BHO(浏览器助手对象),但是 c++ 专家也可以帮助我。
在我的 BHO 中,我只想在主框架上运行 OnDocumentComplete() 函数 - 第一个容器,而不是当前页面内的所有 Iframe。 (另一种方法是仅在这是主框架时才放置一些代码)。
我找不到如何跟踪何时填充主框架。
在谷歌搜索后,我发现每一帧都有“IDispatch* pDisp”,我必须将它与指向第一帧的指针进行比较。
这是主要功能:
STDMETHODIMP Browsarity::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL)
{
// Cache the pointer to IWebBrowser2.
HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_spWebBrowser);
if (SUCCEEDED(hr))
{
// Register to sink events from DWebBrowserEvents2.
hr = DispEventAdvise(m_spWebBrowser);
if (SUCCEEDED(hr))
{
m_fAdvised = TRUE;
}
}
}
else
{
// Unregister event sink.
if (m_fAdvised)
{
DispEventUnadvise(m_spWebBrowser);
m_fAdvised = FALSE;
}
// Release cached pointers and other resources here.
m_spWebBrowser.Release();
}
// Call base class implementation.
return IObjectWithSiteImpl<Browsarity>::SetSite(pUnkSite);
}
这是我想知道它是否是主窗口(框架)的地方:
void STDMETHODCALLTYPE Browsarity::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
{
// as you can see, this function get the IDispatch *pDisp which is unique to every frame.
//some code
}
我在 Microsoft 论坛上问了这个问题,但没有解释如何实际实现就得到了答案:http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/7c433bfa-30d7-42db-980a-70e62640184c
最佳答案
jeffdav 的建议是,通过QueryInterface()
测试pDisp
是否支持IWebBrowser2
,如果支持,则检查它是否支持与您存储在 SetSite()
中的对象相同。QueryInterface()
rules只要求 IUnknown
的 QI
始终产生相同的指针值,因此您必须另外将 QI
到 IUnknown
并比较结果指针。
这将导致在 OnDocumentComplete()
中出现类似这样的结果:
IWebBrowser2* pBrowser = 0;
IUnknown *pUnk1=0, *pUnk2=0;
if( SUCCEEDED(pDisp ->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser))
&& SUCCEEDED(pDisp ->QueryInterface(IID_IUnknown, (void**)&pUnk1))
&& SUCCEEDED(m_spBrowser->QueryInterface(IID_IUnknown, (void**)&pUnk2))
&& (pUnk1 == pUnk2))
{
// ... top-level
}
...或者如果您正在使用 ATL(如 m_spWebBrowser
所建议的那样):
CComQIPtr<IWebBrowser2> spBrowser(pDisp);
if(spBrowser && spBrowser.IsEqualObject(m_spWebBrowser)) {
// ...
}
关于c++ - 将对象与 IDispatch 进行比较以仅获取主框架 (BHO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2398525/
我目前正在开发一个 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
我是一名优秀的程序员,十分优秀!