会IE插件编程的朋友请进来帮我解决一下问题(BHO)

controstr 2008-09-10 05:47:19
这个问题之前发过一次贴,但那个问题已经解决了,现在迎来另一个问题
http://topic.csdn.net/u/20080908/16/e7c6cc3f-ae78-454f-8b74-b1234d196b3f.html

问题是:
类继承接口如下,并实现了它们的方法
class ATL_NO_VTABLE CFlashFilter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CFlashFilter, &CLSID_FlashFilter>,
public IDispatchImpl<IFlashFilter, &IID_IFlashFilter, &LIBID_AdBlockerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IInternetProtocol,
public IInternetProtocolSink

BEGIN_COM_MAP(CFlashFilter)
COM_INTERFACE_ENTRY(IFlashFilter)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_IID(IID_IInternetProtocol, IInternetProtocol)
COM_INTERFACE_ENTRY_IID(IID_IInternetProtocolSink, IInternetProtocolSink)
END_COM_MAP()
private:
CComPtr<IInternetProtocolSink> m_pProtocolSink;
CComPtr<IInternetBindInfo> m_pBindInfo;
CComPtr<IInternetProtocol> m_pProtocol;

在Start方法中的代码

//存储IInternetProtocol、IInternetProtocolSink
m_pProtocolSink = pOIProtSink;
if ( m_pProtocolSink == NULL )
return S_FALSE;
m_pBindInfo = pOIBindInfo;
HRESULT hr = m_pBindInfo->QueryInterface( IID_IInternetProtocol, (void**)&m_pProtocol );

ULONG Fetched;
// 获取网页地址
m_pBindInfo->GetBindString( BINDSTRING_URL, &m_pUrl, 1, &Fetched );

ReportData方法

STDMETHODIMP CFlashFilter::ReportData( DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax) USES_CONVERSION;

// 存储网页代码
std::string ts = "";
char buf[1024] = {0};
HRESULT hr;
ULONG ReadTotal = 0;

do{
memset( buf, 0x0, sizeof(buf) );
//m_pProtocolSink->ReportResult( S_OK, S_OK, NULL ); // 调用这个正确,可以执行
hr = m_pProtocol->Read( buf, sizeof(buf)-1, &ReadTotal ); // 出错,m_pProtoc指针不是空的,这时IE也死了
std::string temp(buf);
ts += temp;
}while ( (hr != S_FALSE) && (hr != INET_E_DOWNLOAD_FAILURE) && (hr != INET_E_DATA_NOT_AVAILABLE) );
_pProtocolSink->ReportData( grfBSCF, ulProgress, ulProgressMax ); // 直接调用这个也出错,IE死掉

请问高手这个问题该怎么解决,解决了另开贴再送分
...全文
402 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
controstr 2008-09-12
  • 打赏
  • 举报
回复
jameshooo
你好,我在网上找到资料要用IHTMLDocument2好像要继承IDispEventImpl这个接口吧?然后使用DWebBrowserEvents2事件来得到IHTMLDocument2指针,再从它里面分析成份,但是我在继承IDispEventImpl这个接品的时候出错,代码如下

class ATL_NO_VTABLE CIeFilter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CIeFilter, &CLSID_IeFilter>,
public IObjectWithSiteImpl<CIeFilter>,
public IDispatchImpl<IIeFilter, &IID_IIeFilter, &LIBID_AdBlockerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<CIeFilter>, // 手工添加持续性接口
public IInputObject,
public IDeskBand,
public IDispEventImpl< 1, CIeFilter, &IID_IIeFilter, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0> // 编译时这句出错
{
// DWebBrowserEvents2事件
BEGIN_SINK_MAP(CIeFilter)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
public:
//DWebBrowserEvents2 事件
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);
}
// 错误提示
1>e:\sourcecode\adblocker\iefilter.h(29) : error C2975: 'wMajor' : invalid template argument for 'ATL::IDispEventImpl', expected compile-time constant expression
1>d:\microsoft visual studio 9.0\vc\atlmfc\include\atlcom.h(4433) : see declaration of 'wMajor'
1>e:\sourcecode\adblocker\iefilter.h(29) : error C2974: 'ATL::IDispEventImpl' : invalid template argument for 'tihclass', type expected
1>d:\microsoft visual studio 9.0\vc\atlmfc\include\atlcom.h(4434) : see declaration of 'ATL::IDispEventImpl'
1>e:\sourcecode\adblocker\iefilter.h(30) : error C2955: 'ATL::IDispEventImpl' : use of class template requires template argument list
1>d:\microsoft visual studio 9.0\vc\atlmfc\include\atlcom.h(4434) : see declaration of 'ATL::IDispEventImpl'
1>e:\sourcecode\adblocker\iefilter.h(30) : fatal error C1903: unable to recover from previous error(s); stopping compilation


求救解决问题
controstr 2008-09-12
  • 打赏
  • 举报
回复
这个我知道,但是要处理那些源代码应该在哪个函数里去做呢,浏览器运行的时候应该有一个事件触发我在一个地方去执行IHTMLDocument2它的一些操作吧,要不我得到了这个函数也无用武之地啊
jameshooo 2008-09-12
  • 打赏
  • 举报
回复
获得文档指针不需要实现DWebBrowserEvents2事件接口,直接从IWebBrowser2::get_Document就能得到IHTMLDocument2
controstr 2008-09-11
  • 打赏
  • 举报
回复
我试过了,如果我想把网页中的“邮箱”替换成“Email”可以先将下过来的网页内容保存到变量,再替换该变量的值,然后通知浏览器是可以成功的,但不知这样的方法行不行,请指点
controstr 2008-09-11
  • 打赏
  • 举报
回复
jameshooo
-------------
现在问题解决了

hr = m_pProtocol->Read( buf, sizeof(buf)-1, &ReadTotal ); // 这里出错的原因是在start函数里赋错了值
// 之前我是通过start中的IInternetBindInfo *pOIBindInf这个参数得到pProtocol 的,这样是错误的,应该使用参数 IInternetProtocolSink *pOIProtSink得到pProtocol 应该改成
// HRESULT hr = m_pBindInfo->QueryInterface( IID_IInternetProtocol, (void**)&m_pProtocol ); // 错误的方法
HRESULT hr = m_pProtocolSink->QueryInterface( IID_IInternetProtocol, (void**)&m_pProtocol ); // 这才是正确的方法

jameshooo我想问你一下
现在我想在函数ReportData中通过调用m_pProtocol->Read( buf, sizeof(buf)-1, &ReadTotal );来得到下载的网页内容,然后替换掉我不想要的数据,再通知浏览器,这样能不能达到拦截flash和浮动窗口的目的?还是要用你上次说的那个方法?
jameshooo 2008-09-11
  • 打赏
  • 举报
回复
下载由你负责,在Start被调用时就要启动下载过程,然后通过调用ReportData报告进度,在Read被调用时返回需要的数据。
如果你要屏蔽该文件下载,在Read时简单返回空内容。
VsirSoft 2008-09-11
  • 打赏
  • 举报
回复
顶下好了。。
controstr 2008-09-11
  • 打赏
  • 举报
回复
那我应该在哪个函数里获取网页下载的数据?包括下载的js和CSS语句(即网页的HTML源文件)
jameshooo 2008-09-11
  • 打赏
  • 举报
回复
只有自己下载文件才能随意修改。
jameshooo 2008-09-10
  • 打赏
  • 举报
回复
只需要实现IInternetProtocol接口即可,无需实现IInternetProtocolSink,你搞复杂了。IInternetProtocolSink指针在Start里面会传给你,你保存下来备用。
sys0000 2008-09-10
  • 打赏
  • 举报
回复
m_pBindInfo在哪里赋值的?
sys0000 2008-09-10
  • 打赏
  • 举报
回复
对象已经实现了IInternetProtoco接口,
成员函数里为啥还要 CComPtr<IInternetProtocol> m_pProtocol;
captain_x 2008-09-10
  • 打赏
  • 举报
回复
mark
chenyijiu 2008-09-10
  • 打赏
  • 举报
回复
msdn:
After your IInternetProtocolSink::ReportResult method is called, your application should call the IInternetProtocol::LockRequest method to lock the resource you are reading from the protocol handler. Then your application should call the IInternetProtocolRoot::Terminate method.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧