?? 連接點的事件實現.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 + -