mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-22 02:05:08 +00:00
182 lines
5.7 KiB
C++
182 lines
5.7 KiB
C++
/**
|
|
* This file has no copyright assigned and is placed in the Public Domain.
|
|
* This file is part of the mingw-w64 runtime package.
|
|
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
|
|
*/
|
|
#ifndef _MSPCOLL_H_
|
|
#define _MSPCOLL_H_
|
|
|
|
template <class T> class CTapiIfCollection : public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CComObjectRootEx<CComMultiThreadModelNoCS>
|
|
{
|
|
public:
|
|
typedef CTapiIfCollection<T> _CTapiCollectionBase;
|
|
BEGIN_COM_MAP(_CTapiCollectionBase)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
COM_INTERFACE_ENTRY(ITCollection)
|
|
END_COM_MAP()
|
|
private:
|
|
int m_nSize;
|
|
CComVariant *m_Var;
|
|
|
|
public:
|
|
CTapiIfCollection(void) : m_nSize(0),m_Var(NULL) { }
|
|
HRESULT WINAPI Initialize(DWORD dwSize,T *pBegin,T *pEnd) {
|
|
int i;
|
|
HRESULT hr;
|
|
T *iter;
|
|
LOG((MSP_TRACE,"CTapiCollection::Initialize - enter"));
|
|
m_nSize = dwSize;
|
|
m_Var = new CComVariant[m_nSize];
|
|
if(!m_Var) return E_OUTOFMEMORY;
|
|
i = 0;
|
|
for(iter = pBegin;iter!=pEnd;iter++) {
|
|
IDispatch *pDisp = NULL;
|
|
hr = (*iter)->QueryInterface(IID_IDispatch,(void**)&pDisp);
|
|
if(hr!=S_OK) return hr;
|
|
CComVariant& var = m_Var[i];
|
|
VariantInit(&var);
|
|
var.vt = VT_DISPATCH;
|
|
var.pdispVal = pDisp;
|
|
i++;
|
|
}
|
|
LOG((MSP_TRACE,"CTapiCollection::Initialize - exit"));
|
|
return S_OK;
|
|
}
|
|
void FinalRelease() {
|
|
LOG((MSP_TRACE,"CTapiCollection::FinalRelease - enter"));
|
|
delete [] m_Var;
|
|
LOG((MSP_TRACE,"CTapiCollection::FinalRelease - exit"));
|
|
}
|
|
STDMETHOD(get_Count)(__LONG32 *retval) {
|
|
HRESULT hr = S_OK;
|
|
LOG((MSP_TRACE,"CTapiCollection::get_Count - enter"));
|
|
try {
|
|
*retval = m_nSize;
|
|
} catch(...) {
|
|
hr = E_INVALIDARG;
|
|
}
|
|
LOG((MSP_TRACE,"CTapiCollection::get_Count - exit"));
|
|
return hr;
|
|
}
|
|
STDMETHOD(get_Item)(__LONG32 Index,VARIANT *retval) {
|
|
HRESULT hr = S_OK;
|
|
LOG((MSP_TRACE,"CTapiCollection::get_Item - enter"));
|
|
if(!retval) return E_POINTER;
|
|
try {
|
|
VariantInit(retval);
|
|
} catch(...) {
|
|
hr = E_INVALIDARG;
|
|
}
|
|
if(hr!=S_OK) return hr;
|
|
retval->vt = VT_UNKNOWN;
|
|
retval->punkVal = NULL;
|
|
if((Index < 1) || (Index > m_nSize)) return E_INVALIDARG;
|
|
hr = VariantCopy(retval,&m_Var[Index-1]);
|
|
if(FAILED(hr)) {
|
|
LOG((MSP_ERROR,"CTapiCollection::get_Item - VariantCopy failed. hr = %lx",hr));
|
|
return hr;
|
|
}
|
|
LOG((MSP_TRACE,"CTapiCollection::get_Item - exit"));
|
|
return S_OK;
|
|
}
|
|
HRESULT WINAPI get__NewEnum(IUnknown **retval) {
|
|
HRESULT hr;
|
|
LOG((MSP_TRACE,"CTapiCollection::new__Enum - enter"));
|
|
if(!retval) return E_POINTER;
|
|
*retval = NULL;
|
|
typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
|
|
enumvar *p;
|
|
hr = enumvar::CreateInstance(&p);
|
|
if(FAILED(hr)) return hr;
|
|
hr = p->Init(&m_Var[0],&m_Var[m_nSize],NULL,AtlFlagCopy);
|
|
if(SUCCEEDED(hr)) hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
|
|
if(FAILED(hr)) delete p;
|
|
LOG((MSP_TRACE,"CTapiCollection::new__Enum - exit"));
|
|
return hr;
|
|
}
|
|
};
|
|
|
|
class CTapiBstrCollection : public CComObjectRootEx<CComMultiThreadModelNoCS>,public IDispatchImpl<ITCollection,&IID_ITCollection,&LIBID_TAPI3Lib>,public CMSPObjectSafetyImpl
|
|
{
|
|
public:
|
|
BEGIN_COM_MAP(CTapiBstrCollection)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
COM_INTERFACE_ENTRY(ITCollection)
|
|
COM_INTERFACE_ENTRY(IObjectSafety)
|
|
END_COM_MAP()
|
|
private:
|
|
DWORD m_dwSize;
|
|
CComVariant *m_Var;
|
|
public:
|
|
CTapiBstrCollection(void) : m_dwSize(0),m_Var(NULL) { }
|
|
HRESULT WINAPI Initialize(DWORD dwSize,BSTR *pBegin,BSTR *pEnd) {
|
|
BSTR *i;
|
|
DWORD dw = 0;
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - enter"));
|
|
m_dwSize = dwSize;
|
|
m_Var = new CComVariant[m_dwSize];
|
|
if(!m_Var) return E_OUTOFMEMORY;
|
|
for(i = pBegin;i!=pEnd;i++) {
|
|
CComVariant& var = m_Var[dw];
|
|
var.vt = VT_BSTR;
|
|
var.bstrVal = *i;
|
|
dw++;
|
|
}
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::Initialize - exit"));
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_Count)(__LONG32 *retval) {
|
|
HRESULT hr = S_OK;
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - enter"));
|
|
try {
|
|
*retval = m_dwSize;
|
|
} catch(...) {
|
|
hr = E_INVALIDARG;
|
|
}
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::get_Count - exit"));
|
|
return hr;
|
|
}
|
|
STDMETHOD(get_Item)(__LONG32 Index,VARIANT *retval) {
|
|
HRESULT hr = S_OK;
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - enter"));
|
|
if(!retval) return E_POINTER;
|
|
try {
|
|
VariantInit(retval);
|
|
} catch(...) {
|
|
hr = E_INVALIDARG;
|
|
}
|
|
if(hr!=S_OK) return hr;
|
|
retval->vt = VT_BSTR;
|
|
retval->bstrVal = NULL;
|
|
if((Index < 1) || ((DWORD) Index > m_dwSize)) return E_INVALIDARG;
|
|
hr = VariantCopy(retval,&m_Var[Index-1]);
|
|
if(FAILED(hr)) {
|
|
LOG((MSP_ERROR,"CTapiBstrCollection::get_Item - VariantCopy failed. hr = %lx",hr));
|
|
return hr;
|
|
}
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::get_Item - exit"));
|
|
return S_OK;
|
|
}
|
|
HRESULT WINAPI get__NewEnum(IUnknown **retval) {
|
|
HRESULT hr;
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::get__NumEnum - enter"));
|
|
if(!retval) return E_POINTER;
|
|
*retval = NULL;
|
|
typedef CComObject<CSafeComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > enumvar;
|
|
enumvar *p = new enumvar;
|
|
if(!p) return E_OUTOFMEMORY;
|
|
hr = p->Init(&m_Var[0],&m_Var[m_dwSize],NULL,AtlFlagCopy);
|
|
if(SUCCEEDED(hr)) {
|
|
hr = p->QueryInterface(IID_IEnumVARIANT,(void**)retval);
|
|
}
|
|
if(FAILED(hr)) delete p;
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::get__NewEnum - exit"));
|
|
return hr;
|
|
}
|
|
void FinalRelease() {
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - enter"));
|
|
delete [] m_Var;
|
|
LOG((MSP_TRACE,"CTapiBstrCollection::FinalRelease() - exit"));
|
|
}
|
|
};
|
|
#endif
|