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

📄 comcalculatorobject.cpp

📁 VisualC高级编程技术精粹.rar
💻 CPP
字号:
// COMCalculatorObject.cpp : Implementation of CCOMCalculatorApp and DLL registration.

#include "stdafx.h"
#include "COMCalculator.h"
#include "COMCalculatorObject.h"
#include "COMPlusCheck.h"
#include "COMPlus.h"
#include "COMMinusCheck.h"
#include "COMMinus.h"
#include "COMMultiplyCheck.h"
#include "COMMultiply.h"
#include "COMDivideCheck.h"
#include "COMDivide.h"
#include "COMRestore.h"
/////////////////////////////////////////////////////////////////////////////
//

STDMETHODIMP CCOMCalculatorObject::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_ICOMCalculatorObject,
	};

	for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
		{
			return S_OK;
		}
	}

	return S_FALSE;
}

STDMETHODIMP CCOMCalculatorObject::Plus(float A, float B, float *pResult)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())
	if (!pResult)
	{
		return OUTPUT_NULL_POINTER;
	}

	CCOMPlusCheck Check(A,B);
	CCOMPlus Plus(A,B);

	return Calculate(&Check,&Plus,pResult);
}

STDMETHODIMP CCOMCalculatorObject::Minus(float A, float B, float *pResult)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	if (!pResult)
	{
		return OUTPUT_NULL_POINTER;
	}

	CCOMMinusCheck Check(A,B);
	CCOMMinus Minus(A,B);

	return Calculate(&Check,&Minus,pResult);
}

STDMETHODIMP CCOMCalculatorObject::Multiply(float A, float B, float *pResult)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	if ( !pResult )
	{
		return OUTPUT_NULL_POINTER;
	}

	CCOMMultiplyCheck Check( A,B );
	CCOMMultiply Multiply( A,B );

	return Calculate( &Check,&Multiply,pResult );
}

STDMETHODIMP CCOMCalculatorObject::Divide(float A, float B, float *pResult)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	if ( !pResult )
	{
		return OUTPUT_NULL_POINTER;
	}

	CCOMDivideCheck Check( A,B );
	CCOMDivide Divide( A,B );

	return Calculate( &Check,&Divide,pResult );
}

STDMETHODIMP CCOMCalculatorObject::Restore(LPTSTR csFileName, float *pA, float *pB)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	return RestoreABvalue( csFileName,pA,pB );
}

long CCOMCalculatorObject::Calculate(CCOMInputCheckBase *pCheck, 
									 CCOMCalculatorBase *pCalculator, 
									 float *pResult)
{
	ASSERT(pCheck);
	ASSERT(pCalculator);
	ASSERT(pResult);

	long lResult = pCheck->Check();
	if (S_OK==lResult)
	{
		*pResult=pCalculator->Calculate();
	}

	return lResult;
}

long CCOMCalculatorObject::RestoreABvalue( CString csFileName, 
										  float *pA, 
										  float *pB )
{
	ASSERT(pA);
	ASSERT(pB);

	CCOMRestore restore;
	bool bResult = restore.ReadABvalueFromFile( csFileName );
	for ( int i = 0; i < restore.m_aABvalue.GetSize(); )
	{	
		if ( bResult )
		{
			CString csAvalue = restore.m_aABvalue.GetAt( i );
			CString csBvalue = restore.m_aABvalue.GetAt( i+1 );
			float Avalue = (float)atof( csAvalue );
			float Bvalue = (float)atof( csBvalue );
			*pA = Avalue;
			*pB = Bvalue;
		}

		i += 2;
	}

	return 0;
}

⌨️ 快捷键说明

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