📄 连接点的事件实现.txt
字号:
作者:rick1126
email: rickzhang@sina.com
日期:7/7/2001 6:41:45 PM
服务端
1. 首先保证你创建ATL对象的时候选中了IConnectionPoint的支持
// Chapter7_CPServer.idl : IDL source for Chapter7_CPServer.dll
//
// This file will be processed by the MIDL tool to
// produce the type library (Chapter7_CPServer.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(76E00670-8C03-458D-8A36-AB7E179346CF),
dual,
helpstring("IMath Interface"),
pointer_default(unique)
]
interface IMath : IDispatch
{
[helpstring("method Add")] HRESULT Add([in]long lOp1, [in]long lOp2, [out] long* plResult );
[helpstring("method Subtract")] HRESULT Subtract([in]long lOp1, [in]long lOp2, [out] long* plResult );
[helpstring("method Multiply")] HRESULT Multiply([in]long lOp1, [in]long lOp2, [out] long* plResult );
[helpstring("method Divide")] HRESULT Divide([in]long lOp1, [in]long lOp2, [out] long* plResult );
};
[
uuid(503AB931-AF9A-4CE0-8D34-D106C6341A58),
version(1.0),
helpstring("Chapter7_CPServer 1.0 Type Library")
]
library CHAPTER7_CPSERVERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(FC5CB2DB-6011-4431-80AA-01E7B60461EC),
helpstring("_IMathEvents Interface"),
]
dispinterface _IMathEvents//事件接口, 看到了吧_前缀需要注意, 而且它是一个纯Dispatch接口
{
properties:
methods:
[id(1),helpstring("method ComputationComplete")] HRESULT ComputationComplete([in]long lResult);
};
[
uuid(7A11D9AD-52ED-4A3C-92E4-7AA579713C11),
helpstring("Math Class")
]
coclass Math
{
[default] interface IMath;
[default,source] dispinterface _IMathEvents;
};
};
客户端:
class CMathEvents: public CComObjectRoot, public _IMathEvents
{
public:
CMathEvents(){}
BEGIN_COM_MAP( CMathEvents )
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* rgsNames, 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:
if ( pDispParams->cArgs!=1 )
return DISP_E_BADPARAMCOUNT;
if ( pDispParams->cNamedArgs )
return DISP_E_NONAMEDARGS;
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;
}
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -