//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
// ArithmeticDriver.cpp : Definiuje punkt wejścia dla aplikacji konsoli.
//

#include "stdafx.h"

//void TestDispatchArithmetic()
//{
//	CComPtr<Arithmetic::IBasicOperations> a;
//	HRESULT hr = a.CoCreateInstance(__uuidof(Arithmetic::Arithmetic));
//	if(FAILED(hr))
//		return;
//
//	DISPPARAMS dispparams;
//	memset(&dispparams, 0, sizeof(dispparams));
//	dispparams.cArgs = 2;
//	// Alokacja pamięci dla parametrów
//	VARIANTARG* pArg = new VARIANTARG[dispparams.cArgs];
//	dispparams.rgvarg = pArg;
//	memset(pArg, 0, sizeof(VARIANT) * dispparams.cArgs);
//
//	// Parametry są wprowadzane w kolejności od prawej do lewej;
//	dispparams.rgvarg[0].vt = VT_I4;
//	dispparams.rgvarg[0].lVal = 2;
//	dispparams.rgvarg[1].vt = VT_I4;
//	dispparams.rgvarg[1].lVal = 2;
//
//    VARIANTARG varRet;
//	VariantInit( &varRet );
//
//	DISPID id[4];
//	OLECHAR *szMember = L"Add";
//	hr = a->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &id[0]);
//	szMember = L"Subtract";
//	hr = a->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &id[1]);
//	szMember = L"Multiply";
//	hr = a->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &id[2]);
//	szMember = L"Divide";
//	hr = a->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &id[3]);
//
//	hr = a->Invoke(id[0], IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &varRet, NULL, NULL);
//	hr = a->Invoke(id[1], IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &varRet, NULL, NULL);
//	hr = a->Invoke(id[2], IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &varRet, NULL, NULL);
//	hr = a->Invoke(id[3], IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &varRet, NULL, NULL);
//}
void TestInterfaceArithmetic()
{
	CComPtr<Arithmetic::IBasicOperations> a;
	HRESULT hr = a.CoCreateInstance(__uuidof(Arithmetic::Arithmetic));
	if(FAILED(hr))
		return;
	CComQIPtr<Arithmetic::IBasicOperations> i = a;
	int result;
	result = i->Add(2,3);
	result = i->Subtract(4,3);
	result = i->Multiply(2,5);
	result = i->Divide(10,2);
}
int _tmain(int argc, _TCHAR* argv[])
{
	CoInitialize(NULL);
	// TestDispatchArithmetic();
	TestInterfaceArithmetic();
	CoUninitialize();
	return 0;
}

