VC DOM 编程,已经取得了IHTMLFormElement 的对象,想收到 from 提交的消息,用 put_onsubmit没反应,请指教我的代码:CComVariant vEvent;
CComPtr< COnWebEvent > pOnWebEvent;vEvent.pdispVal = (IDispatch*)pOnWebEvent;
spFormElement->put_onsubmit( vEvent );其中的 COnWebEvent 是这么写的class COnWebEvent : public IDispatch
{
public:
COnWebEvent();
~COnWebEvent(); virtual HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr);
};
我在 COnWebEvent 里面 和 Invoke 里面都下了断点和打印调试信息,都没反应,请指教
CComPtr< COnWebEvent > pOnWebEvent;vEvent.pdispVal = (IDispatch*)pOnWebEvent;
spFormElement->put_onsubmit( vEvent );其中的 COnWebEvent 是这么写的class COnWebEvent : public IDispatch
{
public:
COnWebEvent();
~COnWebEvent(); virtual HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr);
};
我在 COnWebEvent 里面 和 Invoke 里面都下了断点和打印调试信息,都没反应,请指教
解决方案 »
- 请问有实际开发过可发布程序经验的程序员,从一个VC++6.0的WORK PLACE文件夹里的各种源文件,配套文件被包装成一个可安装程序的大概的步骤是什么
- 关于视频实时处理
- 100分求《VISUAL C++MFC编程实例>>、<<VISUAL C++MFC扩展编程实例>>随书的源代码?
- VC环境下如何使用graphviz生成图片
- 初学MFC用什么书啊??大家推荐一下吧
- 为什么我在PrintDlg弹出前,不能设置打印机的打印质量(dmPrintQuality),而打印方向和打印的数量却可以设定啊!!!
- GDI中關于分辨率﹑像素尺寸﹑字體大小的疑惑?????
- 急用:InstallShield中如何检查注册表中一个项是否存在?
- 请教一个坐标的算法,急急急!!!
- 求助,Thinking in c++ 中的一个问题
- 关于rs232的一个问题
- VC 操作INI文件和复制文件!
你那样只是提交表单
我现在需要的是,当我关心的表单被 submit 之后,我要第一时间收到通知。
IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD wCookie;
// Check that this is a connectable object.
hr = spFormElement->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (hr == S_OK)
{
// Find the connection point.
hr = spFormElement->FindConnectionPoint(DIID_HTMLFormElementEvents2, &pCP);
if (hr == S_OK)
{
// Advise the connection point.
hr = l_pCP->Advise(&vEvent, &dwCookie);
}
l_pCPC->Release();
}不用时,记得释放连接点 : hr = pCP->Unadvise(dwCookie);
CComPtr< COnWebEvent > pOnWebEvent; vEvent.pdispVal = (IDispatch*)pOnWebEvent;
//spFormElement->put_onsubmit( vEvent ); IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD dwCookie;
// Check that this is a connectable object.
hr = spFormElement->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (hr == S_OK)
{
// Find the connection point.
hr = pCPC->FindConnectionPoint(DIID_HTMLFormElementEvents2, &pCP);
if (hr == S_OK)
{
// Advise the connection point.
hr = pCP->Advise((IUnknown*)&vEvent, &dwCookie);
}
pCPC->Release();
}代码改成这样还是没有反应
CComPtr< COnWebEvent > pOnWebEvent; vEvent.pdispVal = (IDispatch*)pOnWebEvent;
//spFormElement->put_onsubmit( vEvent ); IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD dwCookie;
// Check that this is a connectable object.
hr = spFormElement->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (hr == S_OK)
{
// Find the connection point.
hr = pCPC->FindConnectionPoint(DIID_HTMLFormElementEvents2, &pCP);
if (hr == S_OK)
{
// Advise the connection point.
hr = pCP->Advise((IUnknown*)&vEvent, &dwCookie);
}
pCPC->Release();
}刚才的代码有点乱,从新贴一下,
代码改成这样还是没有反应
HRESULT STDMETHODCALLTYPE COnWebEvent::Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr)
{ ::ATLTRACE("in Invoke\n"); return -1;
}也不行哦,我插入的调试信息和断点都没有触发
都试过了,我参考了 MSDN 说明,把你说的这几个事件都试过了
从CCmdTarget派生试下
class COnWebEvent : public IDispatch , public CCmdTarget 还是没反应
CComPtr < COnWebEvent > pOnWebEvent; vEvent.pdispVal = (IDispatch*)pOnWebEvent;
spFormElement->put_onsubmit( vEvent ); 改成
CComVariant vEvent;
COnWebEvent OnWebEvent; // 不过这里如果是局部变量的话问题就大了vEvent = (IDispatch*)&OnWebEvent;
spFormElement->put_onsubmit( &vEvent );
hr = pCP->Advise((IUnknown*)&pOnWebEvent, &dwCookie);
的返回值是 E_NOTIMPL,看来是不支持这个接口了??
你的COnWebEvent到底是怎么写的?Invoke没有被调用到吗?put_onsubmit()返回值是什么?
不实现AddRef/QueryInterface之类的方法你居然能编译通过?不可能吧。
就是 InVoke 没有被调用到啊,所以才奇怪被调用到就说明已经收到通知了,我现在是连通知都没收到
{
public:
virtual ULONG STDMETHODCALLTYPE AddRef()
{
return 1;
} virtual ULONG STDMETHODCALLTYPE Release()
{
return 1;
} virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID* ppvObj)
{
if (iid==__uuidof(IDispatch) || iid==__uuidof(IUnknown))
{
if (ppvObj)
*ppvObj = this;
return S_OK;
}
return E_NOINTERFACE;
} virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT * /*pctinfo*/)
{
return E_NOTIMPL;
} virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT /*iTInfo*/, LCID /*lcid*/, ITypeInfo ** /*ppTInfo*/)
{
return E_NOTIMPL;
} virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID /*riid*/, LPOLESTR * /*rgszNames*/, UINT /*cNames*/, LCID /*lcid*/, DISPID * /*rgDispId*/)
{
return E_NOTIMPL;
} virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS * pdispparams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo, UINT * puArgErr)
{
// do something
// 在这里设置断点试试
return hr;
}
};
CComQIPtr< IDispatch > pDisp;
hr = spElementCollection->item( CComVariant( i ), CComVariant(), &pDisp );
if ( FAILED( hr ) ) continue; if( !pDisp )//容错
return; CComQIPtr< IHTMLFormElement > spFormElement = pDisp;
{
public:
COnWebEvent():m_dwRef(1)
{};
~COnWebEvent(){}; //HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
// /* [out] */ UINT *pctinfo);
//HRESULT STDMETHODCALLTYPE GetTypeInfo(
// /* [in] */ UINT iTInfo,
// /* [in] */ LCID lcid,
// /* [out] */ ITypeInfo **ppTInfo);
//HRESULT STDMETHODCALLTYPE GetIDsOfNames(
// /* [in] */ REFIID riid,
// /* [size_is][in] */ LPOLESTR *rgszNames,
// /* [in] */ UINT cNames,
// /* [in] */ LCID lcid,
// /* [size_is][out] */ DISPID *rgDispId);
//virtual HRESULT STDMETHODCALLTYPE Invoke(
// /* [in] */ DISPID dispIdMember,
// /* [in] */ REFIID riid,
// /* [in] */ LCID lcid,
// /* [in] */ WORD wFlags,
// /* [out][in] */ DISPPARAMS *pDispParams,
// /* [out] */ VARIANT *pVarResult,
// /* [out] */ EXCEPINFO *pExcepInfo,
// /* [out] */ UINT *puArgErr);
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)(long dispID,const struct _GUID &,unsigned long,unsigned short,struct tagDISPPARAMS * pParams,struct tagVARIANT *,struct tagEXCEPINFO *,unsigned int *)
{
return NOERROR;
}
};
另外QueryInterface不能简单返回this指针, 要根据继承接口的IID进行识别.
感谢老大,用连接点已经可以了但是 put_onsubmit() 还是不行,不过能解决问题就可以了,给分。
yjgx007 老大已经帮忙修改了,
用连接点可以,但是 put_onsubmit() 还是不行,呵呵,不知道为啥,感谢老大参与,给分。
if (hr == S_OK)
{
// Find the connection point.
hr = pCPC->FindConnectionPoint( DIID_HTMLFormElementEvents , &pCP);
if (hr == S_OK)
{
// Advise the connection point.
hr = pCP->Advise((IUnknown*)&pOnWebEvent, &dwCookie);
if ( FAILED( hr ) ) ::AfxMessageBox("bbb");
}
pCPC->Release();
}
//----------------------------------------------------------------------------------
//枚举表单中的元素,找到与input 有关的项,如果发现为 image 类型的按钮,就点击。
CComQIPtr< IHTMLElement > spAllInputElement;
spFormElement->QueryInterface( IID_IHTMLElement , (void**)&spAllInputElement ); CComQIPtr< IDispatch > spCollDisp;
CComQIPtr< IHTMLElementCollection > spCollElement; spAllInputElement->get_all( (IDispatch**)&spCollDisp );
spCollDisp->QueryInterface( IID_IHTMLElementCollection , (void**)&spCollElement ); long nCollCount = 0;
spCollElement->get_length(&nCollCount); for( long i = 0 ; i< nCollCount ; i++ )
{
CComQIPtr< IDispatch > MyDisp;
CComQIPtr< IHTMLInputElement > spInputElement;
hr = spCollElement->item( CComVariant(i) , CComVariant() , &MyDisp );
if ( FAILED( hr ) ) continue;
if( !MyDisp )//容错
return; hr = MyDisp->QueryInterface( IID_IHTMLInputElement , (void**)&spInputElement );
if ( FAILED( hr ) ) continue;
if( !strnicmp(lpType , "image" , 5) )//如果发现 为 image 类型的按钮就点击之
{
CComQIPtr< IHTMLElement > spSingleElement; hr = spInputElement->QueryInterface( IID_IHTMLElement , (void**)&spSingleElement);
if( FAILED( hr ) ) continue; hr = spSingleElement->click();
if( FAILED( hr ) ) continue;
}
CComBSTR vName,vVal,vType; hr = spInputElement->get_name( &vName );
if( FAILED( hr ) ) continue; hr = spInputElement->get_value( &vVal );
if( FAILED( hr ) ) continue; hr = spInputElement->get_type( &vType );
if( FAILED( hr ) ) continue; if( !strnicmp(lpType , "image" , 5) )//如果发现 为 image 类型的按钮就点击之
{
CComQIPtr< IHTMLElement > spSingleElement; hr = spInputElement->QueryInterface( IID_IHTMLElement , (void**)&spSingleElement);
if( FAILED( hr ) ) continue; hr = spSingleElement->click();
if( FAILED( hr ) ) continue;
}
vEvent.pdispVal = (IDispatch*)&pOnWebEvent;
vEvent.vt = VT_DISPATCH;