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

📄 dispatchhelper.cpp

📁 《脚本驱动的应用软件开发方法与实践》源码
💻 CPP
字号:
//
// DispatchHelper.cpp
//
// --------------------------------------------------------
// A Practical Guide to Script-Driven Software Development
// Author: Qiming Lu                        Date: 6/1/2006
// MSN Messager: luqiming26@hotmail.com
// MSN Blog: http://spaces.msn.com/jemylu
// --------------------------------------------------------

#include "stdafx.h"
#include "DispatchHelper.h"

DispatchHelper::DispatchHelper(IDispatch* pDisp) 
	: mpDisp(pDisp)
	, mpParams(0)
	, mParamCount(0)
{
}

DispatchHelper::~DispatchHelper()
{
	DeleteParameters();
}

bool DispatchHelper::CreateParameters(int paramCount)
{
	// Delete the parameters used last time.
	DeleteParameters();

	mParamCount = paramCount;
	if (paramCount > 0)
	{
		mpParams = new VARIANT[paramCount];
		if (mpParams == 0)
			return false;

		for (int i = 0; i < paramCount; i++)
		{
			VariantInit( &(mpParams[i]) );
		}
	}
	
	return true;
}

void DispatchHelper::DeleteParameters()
{
	if (mpParams)
	{
		for (UINT i = 0; i < mParamCount; i++)
		{
			VariantClear( &(mpParams[i]) );
		}

		delete[] mpParams;
		mpParams = 0;
		mParamCount = 0;
	}
}

bool DispatchHelper::AddParameter(UINT index, VARIANT* value)
{
	if (index >= mParamCount)
		return false;
	if (!mpParams || !value)
		return false;

	VariantCopy(&(mpParams[index]), value);
	return true;
}

bool DispatchHelper::AddParameter(UINT index, BSTR value)
{
	if (index >= mParamCount)
		return false;
	if (!mpParams)
		return false;

	mpParams[index].vt		= VT_BSTR;
	mpParams[index].bstrVal = SysAllocString(value);
	return true;
}

bool DispatchHelper::AddParameter(UINT index, INT value)
{
	if (index >= mParamCount)
		return false;
	if (!mpParams)
		return false;

	mpParams[index].vt		= VT_INT;
	mpParams[index].intVal	= value;
	return true;
}

bool DispatchHelper::AddParameter(UINT index, UINT value)
{
	if (index >= mParamCount)
		return false;
	if (!mpParams)
		return false;

	mpParams[index].vt		= VT_UINT;
	mpParams[index].uintVal	= value;
	return true;
}

bool DispatchHelper::AddParameter(UINT index, IDispatch* pDisp)
{
	if (index >= mParamCount)
		return false;
	if (!mpParams)
		return false;

	mpParams[index].vt		 = VT_DISPATCH;
	mpParams[index].pdispVal = pDisp;
	if (pDisp)
		pDisp->AddRef();
	return true;
}

bool DispatchHelper::AddNullParameter(UINT index)
{
	if (index >= mParamCount)
		return false;
	if (!mpParams)
		return false;

	mpParams[index].vt = VT_NULL;
	return true;
}

void DispatchHelper::SetDispatch(IDispatch* pDisp)
{
	// Note: we don't add reference count!
	mpDisp = pDisp;
}

bool DispatchHelper::GetDispid(BSTR functionName, DISPID* outDispid)
{
	HRESULT hr = E_FAIL;
	if (mpDisp && outDispid)
	{
		hr = mpDisp->GetIDsOfNames(IID_NULL, &functionName, 1, 0, outDispid);
	}
	return SUCCEEDED(hr);
}

bool DispatchHelper::Invoke(DISPID dispid)
{
	if (mpDisp == 0)
		return false;

	DISPPARAMS	dispParams;
	dispParams.rgvarg            = mpParams;
	dispParams.rgdispidNamedArgs = 0;
	dispParams.cArgs             = mParamCount;
	dispParams.cNamedArgs        = 0;

	HRESULT hr = mpDisp->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, 
		&dispParams, 0, 0, 0);
	return SUCCEEDED(hr);
}

bool DispatchHelper::SetProperty(BSTR propName, VARIANT* inValue)
{
	if (mpDisp == 0)
		return false;

	// Get a dispid for the specified property name
	DISPID dispid = 0;
	if (!GetDispid(propName, &dispid))
		return false;

	DISPPARAMS dispParams = {0, 0, 1, 1};
	dispParams.rgvarg = inValue;
	DISPID dispidPut  = DISPID_PROPERTYPUT;
	dispParams.rgdispidNamedArgs = &dispidPut;

	HRESULT hr = S_OK;
	if (inValue->vt == VT_UNKNOWN || inValue->vt == VT_DISPATCH || 
		(inValue->vt & VT_ARRAY) || (inValue->vt & VT_BYREF))
	{
		hr = mpDisp->Invoke(dispid, IID_NULL, 0, DISPATCH_PROPERTYPUTREF,
			&dispParams, 0, 0, 0);
	}
	else
	{
		hr = mpDisp->Invoke(dispid, IID_NULL, 0, DISPATCH_PROPERTYPUT,
			&dispParams, 0, 0, 0);
	}
	return SUCCEEDED(hr);
}

bool DispatchHelper::GetProperty(BSTR propName, VARIANT* outValue)
{
	if (mpDisp == 0)
		return false;

	// Get a dispid for the specified property name
	DISPID dispid = 0;
	if (!GetDispid(propName, &dispid))
		return false;

	DISPPARAMS dispParams = {0, 0, 0, 0};
	HRESULT hr = mpDisp->Invoke(dispid, IID_NULL, 0, DISPATCH_PROPERTYGET,
		&dispParams, outValue, 0, 0);
	return SUCCEEDED(hr);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -