hmm.. the code is very long, it has a lot of pages as i've been writing it for 4 months now.
but i will try to copy the most important parts:

xls.cpp:
Code:
#include <windows.h>
#include "xls.h"
#include "classes.h"
#include "resources.h"
#include "Tchar.h"


HRESULT hr2;
HRESULT OLEMethod(int nType, VARIANT *pvResult, IDispatch *pDisp,LPOLESTR ptName, int cArgs...)
{
	if(!pDisp) return E_FAIL;

	va_list marker;
	va_start(marker, cArgs);

	DISPPARAMS dp = { NULL, NULL, 0, 0 };
	DISPID dispidNamed = DISPID_PROPERTYPUT;
	DISPID dispID;
	char szName[200];


	// Convert down to ANSI
	WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

	// Get DISPID for name passed...
	HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
	if(FAILED(hr)) {
		return hr;
	}
	// Allocate memory for arguments...
	VARIANT *pArgs = new VARIANT[cArgs+1];
	// Extract arguments...
	for(int i=0; i<cArgs; i++) {
		pArgs[i] = va_arg(marker, VARIANT);
	}

	// Build DISPPARAMS
	dp.cArgs = cArgs;
	dp.rgvarg = pArgs;

	// Handle special-case for property-puts!
	if(nType & DISPATCH_PROPERTYPUT) {
		dp.cNamedArgs = 1;
		dp.rgdispidNamedArgs = &dispidNamed;
	}

	// Make the call!
	hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, pvResult, NULL, NULL);
	if(FAILED(hr)) {
		return hr;
	}
	// End variable-argument section...
	va_end(marker);

	delete [] pArgs;
	return hr;
}
CMSExcel::CMSExcel(void)
{
	m_hr=S_OK;
	m_pEApp=NULL;
	m_pBooks=NULL;
	m_pActiveBook=NULL;
}
HRESULT CMSExcel::Initialize(bool bVisible)
{
	CoInitialize(NULL);
	CLSID clsid;
	m_hr = CLSIDFromProgID(L"Excel.Application", &clsid);
	if(SUCCEEDED(m_hr))
	{
		m_hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&m_pEApp);
		if(FAILED(m_hr)) m_pEApp=NULL;
	}
	{
		m_hr=SetVisible(bVisible);
	}
	return m_hr;
}
HRESULT CMSExcel::SetVisible(bool bVisible)
{

	if(!m_pEApp) return E_FAIL;
	VARIANT x;
	x.vt = VT_I4;
	x.lVal = bVisible;
	m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, m_pEApp, L"Visible", 1, x);

	return m_hr;
}

HRESULT CMSExcel::NewExcelBook(bool bVisible)
{
	if(m_pEApp==NULL) 
	{
		if(FAILED(m_hr=Initialize(bVisible)))
			return m_hr;
	}

	{
		VARIANT result;
		VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pEApp, L"Workbooks", 0);
		m_pBooks = result.pdispVal;
	}	

	{
		VARIANT result;
		VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pBooks, L"Add", 0);
		m_pActiveBook = result.pdispVal;
	}
	return m_hr;
}

HRESULT CMSExcel::SetExcelValue(LPCTSTR szRange,LPCTSTR szValue,bool bAutoFit, int nAlignment)
{
	if(!m_pEApp) return E_FAIL;
	if(!m_pActiveBook) return E_FAIL;
	IDispatch *pSheets;
	{
		VARIANT result;
		VariantInit(&result);

		m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveBook, L"Sheets", 0);
		pSheets = result.pdispVal;
	}
	IDispatch *pSheet;
	{
		VARIANT result;
		VariantInit(&result);
		VARIANT itemn;
		itemn.vt = VT_I4;
		itemn.lVal = 1;
		m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pSheets, L"Item", 1, itemn);
		pSheet = result.pdispVal;
	}
	
	IDispatch* pRange;
	{
		//COleVariant oleRange(szRange);
		VARIANT xx;
		xx.vt=VT_BSTR;
		xx.pcVal = _T("a1");
	
		VARIANT result;
		VariantInit(&result);
		m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pSheet, L"Range", 1, xx);
		pRange = result.pdispVal;
	}

	{
		//COleVariant oleValue(szValue);
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pRange, L"Value", 1, "aa");
	}


	if(bAutoFit)
	{
		IDispatch* pEntireColumn;
		{
			VARIANT result;
			VariantInit(&result);
			m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pRange, L"EntireColumn",0);
			pEntireColumn= result.pdispVal;
		}

		{
			m_hr=OLEMethod(DISPATCH_METHOD, NULL, pEntireColumn, L"AutoFit", 0);
		}	
		pEntireColumn->Release();
	}

	{
		VARIANT x;
		x.vt = VT_I4;
		x.lVal = nAlignment;
		m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pRange, L"HorizontalAlignment", 1, x);
	}

	pRange->Release();
	pSheet->Release();
	pSheets->Release();
	return m_hr;
}

HRESULT CMSExcel::Quit()
{
	if(m_pEApp==NULL) return E_FAIL;
	DISPID dispID;
	LPOLESTR ptName=(LPOLESTR)"Quit";// LPOLESTR ptName=_T("Quit");
	m_hr = m_pEApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
	
	if(SUCCEEDED(m_hr))
	{
		DISPPARAMS dp = { NULL, NULL, 0, 0 };
		m_hr = m_pEApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, 
									&dp, NULL, NULL, NULL);
	}
	m_pEApp->Release();
	m_pEApp=NULL;
	return m_hr;
}


CMSExcel::~CMSExcel(void)
{
	Quit();
	CoUninitialize();
}

xls.h:
Code:
#include "classes.h"
#ifndef xls_h
#define xls_h

class CMSExcel
{
protected:
	HRESULT m_hr;
	IDispatch*	m_pEApp;
	IDispatch*  m_pBooks;
	IDispatch*	m_pActiveBook;
private:
	HRESULT Initialize(bool bVisible=true);
public:
	CMSExcel(void);
	~CMSExcel(void);
	HRESULT SetVisible(bool bVisible=true);
	HRESULT NewExcelBook(bool bVisible=true);
	HRESULT SetExcelValue(LPCTSTR szRange,LPCTSTR szValue,bool bAutoFit, int nAlignment);
	HRESULT Quit();
};

HRESULT OLEMethod(int nType, VARIANT *pvResult, IDispatch *pDisp,LPOLESTR ptName, int cArgs...);




#endif


and let's say that i call this somewhere from main.cpp:
Code:
CMSExcel xx;
xx.NewExcelBook(true);
xx.SetExcelValue("a2","1",true,1);




The error is:
Unhandled exception at 0x00B996C3 in Kredens (OLE aut).exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.

and it's caused in OLEMEthos function at the line:
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);


where this OLEMethod is called by (/from):
m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, pSheet, L"Range", 1, xx);

I guess i did some stupid mistake when i was copying the code from some example, not fully understanding it.
I believe you are right saying that it must have somethign to do with that conversion thing which i dont quite understand yet.