⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 连接点的事件实现.txt

📁 C&C++论坛精华
💻 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 + -