继续提一个问题:如何解决

K99 2003-10-14 03:46:06
在各位高手指点之下,有了很大进展,现在不知道怎么写这个

void ConnectEvents(IHTMLElement* pElem)
{
HRESULT hr;
IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD dwCookie;
CComObject<CElementSink> *pSink;

hr = CComObject<CDocumentSink>::CreateInstance(&pSink);
// Check that this is a connectable object.
hr = pElem->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);

if (SUCCEEDED(hr))
{
// Find the connection point.
hr = pCPC->FindConnectionPoint(DIID_HTMLElementEvents2, &pCP);

if (SUCCEEDED(hr))
{
// Advise the connection point.
// pUnk is the IUnknown interface pointer for your event sink
hr = pCP->Advise(pSink, &dwCookie);/

//上面那个psink该怎么处理??????????????

if (SUCCEEDED(hr))
{
// Successfully advised
}

pCP->Release();
}

pCPC->Release();
}
}


上面那个psink该怎么处理?
我这样写
STDMETHODIMP IDispatch::Invoke(DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pdispparams,
VARIANT* pvarResult,
EXCEPINFO* pexcepinfo,
UINT* puArgErr)
{
switch (dispidMember)
{
case DISPID_HTMLELEMENTEVENTS2_ONCLICK:
OnClick();
break;

default:
break;
}

return S_OK;
}
不知道如何联系他们
我是在win32 环境做的,不用mfc
...全文
42 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohyy 2003-10-14
  • 打赏
  • 举报
回复
这是《atl开发者指南》第7章的例子,

另外关于com连接点的文章:
http://www.vchelp.net/vchelp/file2003_2/comconnpoint.asp?type_id=70&class_id=1&cata_id=3&article_id=991&search_term=

http://www.vchelp.net/vchelp/zart/com_con.asp?type_id=29&class_id=1&cata_id=3&article_id=90&search_term=
xiaohyy 2003-10-14
  • 打赏
  • 举报
回复
server发出的事件就在CMathEvents中接收并处理
xiaohyy 2003-10-14
  • 打赏
  • 举报
回复
sorry,上面没帖完,该类是client用来和server通信的

class CMathEvents :
public CComObjectRoot,
public _IMathEvents
{
public:
CMathEvents()
{
}

BEGIN_COM_MAP(CMathEvents)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(_IMathEvents)
END_COM_MAP()

// IMathEvents
public:
STDMETHODIMP GetTypeInfoCount(UINT*)
{
return E_NOTIMPL;
}

STDMETHODIMP GetTypeInfo( UINT iTInfo,
LCID lcid,
ITypeInfo **ppTInfo)
{
return E_NOTIMPL;
}

STDMETHODIMP GetIDsOfNames( REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId)
{
return E_NOTIMPL;
}

STDMETHODIMP Invoke( DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pVarResult,
EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
switch( dispIdMember )
{
case 0x1:
// Make sure the is just one argument
if ( pDispParams->cArgs != 1 )
return DISP_E_BADPARAMCOUNT;

// We don't support named arguments
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;

// Coerce the argument into a long
HRESULT hr;
VARIANTARG var;
VariantInit( &var );
hr = VariantChangeTypeEx( &var,
&(pDispParams->rgvarg[0]),
lcid, 0, VT_I4 );
if FAILED( hr )
return DISP_E_BADVARTYPE;

ComputationComplete( var.lVal );
break;
default:
DisplayMessage( "Error" );
break;
}
return S_OK;
}

STDMETHODIMP ComputationComplete(long lResult)
{
char szMsg[128];
sprintf( szMsg, "The result is %d", lResult );
DisplayMessage( szMsg );
return S_OK;
}

};
K99 2003-10-14
  • 打赏
  • 举报
回复
CComObject<CMathEvents>* ptrMathEvents = new CComObject<CMathEvents>;

这里的CMathEvents是哪里来的呢?
蒋晟 2003-10-14
  • 打赏
  • 举报
回复
把MFC的SINK宏分离出来就可以……
xiaohyy 2003-10-14
  • 打赏
  • 举报
回复
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
// Initialize the ATL module
_Module.Init( ObjectMap, 0 );

CComPtr<IMath> ptrMath;
HRESULT hr;
hr = CoCreateInstance( CLSID_Math,
NULL,
CLSCTX_SERVER,
IID_IMath,
(void**) &ptrMath );

if ( FAILED( hr ))
{
HandleError( "Failed to create server instance", hr );
return -1;
}


CComObject<CMathEvents>* ptrMathEvents = new CComObject<CMathEvents>;
CComPtr<IUnknown> ptrEventsUnk = ptrMathEvents;

// Set up the connection
DWORD dwCookie;
hr = AtlAdvise( ptrMath,
ptrEventsUnk,
DIID__IMathEvents,
&dwCookie );
if (FAILED( hr ))
{
HandleError( "Unable to setup the connection for IMathEvents", hr );
return -1;
}

// Access the IMath interface
long lResult;
ptrMath->Add( 300, 10, &lResult );
ptrMath->Subtract( 300, 10, &lResult );
ptrMath->Multiply( 300, 10, &lResult );
ptrMath->Divide( 300, 10, &lResult );

// Shut down the event connection
AtlUnadvise( ptrMath,
DIID__IMathEvents,
dwCookie );

return 0;
}
xiaohyy 2003-10-14
  • 打赏
  • 举报
回复
STDMETHODIMP GetTypeInfoCount(UINT*)
{
return E_NOTIMPL;
}

STDMETHODIMP GetTypeInfo( UINT iTInfo,
LCID lcid,
ITypeInfo **ppTInfo)
{
return E_NOTIMPL;
}

STDMETHODIMP GetIDsOfNames( REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId)
{
return E_NOTIMPL;
}

STDMETHODIMP Invoke( DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pVarResult,
EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
switch( dispIdMember )
{
case 0x1:
// Make sure the is just one argument
if ( pDispParams->cArgs != 1 )
return DISP_E_BADPARAMCOUNT;

// We don't support named arguments
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;

// Coerce the argument into a long
HRESULT hr;
VARIANTARG var;
VariantInit( &var );
hr = VariantChangeTypeEx( &var,
&(pDispParams->rgvarg[0]),
lcid, 0, VT_I4 );
if FAILED( hr )
return DISP_E_BADVARTYPE;
break;
default:
break;
}
return S_OK;
}





3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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