解决方案 »
- 对话框上加载图标问题
- 如何删除flash10l.OCX组件
- GetBufferSetLength无需调用ReleaseBuffer吗?
- 初学者问一个问题,急,多谢了!
- 请问一个进程最多可以开多少个线程?我的程序在win2003下开了2000个左右就不行了
- 如何在WM_CHAR中获得输入的汉字
- richeditctrl不响应OnChange事件
- CEdit::SetWindowText(pStr),pStr中有"\n\r",如何将整个pStr都显示在Edit中。
- ATL新建Service为什么什么操作也不做,全部编译器生成的代码直接注册服务报错。。折磨死我了
- 请问如何取得 Windows 开始\程序 下的所有程序组。
- usbkey数字证书如何生成及其与私钥相关问题
- 在加载DLL应用程序前加入一个提示过渡对话框
没用过这个东西,而且还是第一次做MFC程序,能否指点一下啊~O(∩_∩)O~
http://msdn.microsoft.com/workshop/browser/ext/overview/downloadmgr.asp http://support.microsoft.com/kb/181678
{
public:
AboutWebEvent():m_dwRef(1)
{};
public:
~AboutWebEvent(){}; DWORD m_dwRef;
// IUnknown
STDMETHOD(QueryInterface)(const struct _GUID &riid,void ** ppv){
*ppv = NULL; if (IID_IUnknown == riid)
{
*ppv = (LPUNKNOWN)this;
AddRef();
return NOERROR;
}
else if (IID_IDispatch == riid)
{
*ppv = (IDispatch*)this;
AddRef();
return NOERROR;
}
else
{
return E_NOTIMPL;
}
}
ULONG __stdcall AddRef(void){
return ++m_dwRef;
}
ULONG __stdcall Release(void){
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}
// IDispatch
STDMETHOD(GetTypeInfoCount)(unsigned int *){
TRACE("GetTypeInfoCount\n"); return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(unsigned int,unsigned long,struct ITypeInfo ** ){
TRACE("GetTypeInfo\n"); return E_NOTIMPL;
}
STDMETHOD(GetIDsOfNames)(const IID &,LPOLESTR *,UINT,LCID,DISPID *){
TRACE("GetIDsOfNames\n"); return E_NOTIMPL;
}
STDMETHOD(Invoke)(DISPID dispID,const struct _GUID &,unsigned long,unsigned short,struct tagDISPPARAMS * pParams,struct tagVARIANT *,struct tagEXCEPINFO *,unsigned int *)
{
TRACE("进入Invoke--1\n");
if(dispID == 0)
{
::AfxMessageBox("dispID等于0");
}
if(dispID ==DISPID_FILEDOWNLOAD)
{
..................
}
}
{
public:
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ DISPID dispidMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out][in] */ VARIANT *pvarResult,
/* [out][in] */ EXCEPINFO *pExcepInfo,
/* [out][in] */ UINT *puArgErr) = 0;
};我也有个类ICtrlDownload派生于IDispatch啊,但是只有一个Invoke,还是我通过右键-->Add Method自动生成的。没有你那么东西啊!
你最好实现完全了,只有Invoke肯定是不完整的,建议你去看一下COM技术里面的事件连接点这些东东
#include <mshtml.h>
#include <atlbase.h>
#include "atlcom.h"
#include <mshtmdid.h>
#include <oleacc.h>
#include <atlconv.h>
怎么去调用Invoke啊~不知道怎么下手...
首先写一个基于IDispatch的类:(这个类是一个事件接受器,根据实际接收到的事件做自己想要的处理,主要在Invlke函数里面实现)class AboutWebEvent : public IDispatch
{
public:
AboutWebEvent():m_dwRef(1)
{};
public:
~AboutWebEvent(){}; DWORD m_dwRef;
// IUnknown
STDMETHOD(QueryInterface)(const struct _GUID &riid,void ** ppv){
*ppv = NULL; if (IID_IUnknown == riid)
{
*ppv = (LPUNKNOWN)this;
AddRef();
return NOERROR;
}
else if (IID_IDispatch == riid)
{
*ppv = (IDispatch*)this;
AddRef();
return NOERROR;
}
else
{
return E_NOTIMPL;
}
}
ULONG __stdcall AddRef(void){
return ++m_dwRef;
}
ULONG __stdcall Release(void){
if (--m_dwRef == 0)
{
delete this;
return 0;
}
return m_dwRef;
}
// IDispatch
STDMETHOD(GetTypeInfoCount)(unsigned int *){
TRACE("GetTypeInfoCount\n"); return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(unsigned int,unsigned long,struct ITypeInfo ** ){
TRACE("GetTypeInfo\n"); return E_NOTIMPL;
}
STDMETHOD(GetIDsOfNames)(const IID &,LPOLESTR *,UINT,LCID,DISPID *){
TRACE("GetIDsOfNames\n"); return E_NOTIMPL;
}
STDMETHOD(Invoke)(DISPID dispID,const struct _GUID &,unsigned long,unsigned short,struct tagDISPPARAMS * pParams,struct tagVARIANT *,struct tagEXCEPINFO *,unsigned int *)
{
TRACE("进入Invoke--1\n");
if(dispID == 0)
{
::AfxMessageBox("dispID等于0");
}
if(dispID ==DISPID_HTMLFORMELEMENTEVENTS2_ONSUBMIT )
{
...................
...................
}
}
其次,要把网页中的表单接口转化为事件连接点的接口,比如说提交表单消息事件(DISPID_HTMLFORMELEMENTEVENTS2_ONSUBMIT)属于DIID_HTMLFormElementEvents2事件集中的一个,要用到FindConnectionPoint函数(根据函数名你就知道啥意思了)AboutWebEvent pAboutWebEvent;//声明接收器对象
CComQIPtr<IUnknown, &IID_IUnknown> spUnk = &pAboutWebEvent; IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD pdwCookie = NULL;
hr=spFormElement->QueryInterface( IID_IConnectionPointContainer,(void**)&pCPC ); //spFormElement是已经获取的网页中的表单指针
if ( hr == S_OK )
{
hr = pCPC->FindConnectionPoint(DIID_HTMLFormElementEvents2,&pCP);
if ( hr == S_OK )
{
HRESULT hr1; hr1 = pCP->Advise(spUnk,&pdwCookie);
if ( FAILED( hr1 ) ) ::AfxMessageBox("Advise调用失败");
TRACE("Advise调用成功");
Invoke(); }
pCPC->Release();
}这样就可以进入Invoke中了,根据你的IDownloadManager接口,用FindConnectionPoint转一下,再看看有DISPID_FILEDOWNLOAD这个事件消息不
另外,看看这篇文章吧http://zhenry86.blog.163.com/blog/static/7567665820088283838757/