|
-
May 26th, 2013, 12:14 PM
#13
Re: COleVariant in WinAPI (afxdisp.h)
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.
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|