From 2021b448a95dc392703f8c4ddb161173b3f72c1d Mon Sep 17 00:00:00 2001 From: rylek Date: Sun, 11 Jul 2010 15:34:12 +0000 Subject: [PATCH] .Ole: basic support for conversion between ValueArray and Ole SAFEARRAY git-svn-id: svn://ultimatepp.org/upp/trunk@2524 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Ole/Ctrl/OleCtrl.h | 6 +++++ uppsrc/Ole/Ctrl/util.cpp | 9 +------- uppsrc/Ole/util.cpp | 48 +++++++++++++++++++++++++++++++++++++++ uppsrc/Ole/util.h | 5 ++++ 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/uppsrc/Ole/Ctrl/OleCtrl.h b/uppsrc/Ole/Ctrl/OleCtrl.h index b26be210d..0ed2b988b 100644 --- a/uppsrc/Ole/Ctrl/OleCtrl.h +++ b/uppsrc/Ole/Ctrl/OleCtrl.h @@ -509,6 +509,12 @@ struct OcxInit { OcxInit(void (*fn)()) { OcxTypeLib::Get().AddInit(fn); } }; OCX_OBJECT(type) \ static IRef COMBINE(OcxNew_, type)() { return new OcxObjectWrapper(MK__s); } +#ifndef _USRDLL +bool ExeRegisterServer(); +bool ExeUnregisterServer(); +void ExeRunServer(); +#endif + Size ToHiMetric(Size pixel_size); Size FromHiMetric(Size himetric_size); Rect GetWindow(HDC hdc); diff --git a/uppsrc/Ole/Ctrl/util.cpp b/uppsrc/Ole/Ctrl/util.cpp index 01050ab99..8fd9ae46b 100644 --- a/uppsrc/Ole/Ctrl/util.cpp +++ b/uppsrc/Ole/Ctrl/util.cpp @@ -557,7 +557,6 @@ HRESULT OcxTypeLib::Unregister() return hr; } -/* #ifndef _USRDLL HRESULT OcxTypeLib::RegisterObjects() { @@ -586,7 +585,6 @@ void OcxTypeLib::RevokeObjects() } } #endif -*/ HRESULT OcxTypeLib::GetFactory(REFCLSID rclsid, REFIID iid, void **ppv) { @@ -686,7 +684,6 @@ STDAPI DllUnregisterServer() } #endif -/* #ifndef _USRDLL bool ExeRegisterServer() { @@ -697,9 +694,7 @@ bool ExeRegisterServer() return SUCCEEDED(hr); } #endif -*/ -/* #ifndef _USRDLL bool ExeUnregisterServer() { @@ -710,9 +705,7 @@ bool ExeUnregisterServer() return SUCCEEDED(hr); } #endif -*/ -/* #ifndef _USRDLL void ExeRunServer() { @@ -731,9 +724,9 @@ void ExeRunServer() DispatchMessage(&msg); } LOGSYSOCX("end of message loop"); + OcxTypeLib::Get().RevokeObjects(); } #endif -*/ END_UPP_NAMESPACE diff --git a/uppsrc/Ole/util.cpp b/uppsrc/Ole/util.cpp index 8c8669411..42d9d0bc1 100644 --- a/uppsrc/Ole/util.cpp +++ b/uppsrc/Ole/util.cpp @@ -214,6 +214,54 @@ HRESULT CheckReturnWString(BSTR *bstr, WString s) return S_OK; } +static ValueArray SAFEARRAYToValueArrayPart(SAFEARRAY *array, long *indices, int dim_index) +{ + Vector dim_array; + int nelem = array->rgsabound[dim_index].cElements; + dim_array.SetCount(nelem); + for(int e = 0; e < nelem; e++) { + indices[dim_index] = e; + if(dim_index > 0) + dim_array[e] = SAFEARRAYToValueArrayPart(array, indices, dim_index - 1); + else { + OleVariant var; + HRESULT hr = SafeArrayGetElement(array, indices, &var); + if(SUCCEEDED(hr)) + dim_array[e] = AsValue(var); + else { + String dims; + for(int i = 0; i < dim_index; i++) + dims << (i ? ", " : "") << indices[i]; + dim_array[e] = ErrorValue(NFormat("SafeArrayGetElement(%s): error %08lx", dims, hr)); + } + } + } + return ValueArray(dim_array); +} + +ValueArray SAFEARRAYToValueArray(SAFEARRAY *array) +{ + int ndims = array->cDims; + Vector indices; + indices.SetCount(ndims, -1); + return SAFEARRAYToValueArrayPart(array, indices.Begin(), ndims - 1); +} + +SAFEARRAY * ValueArrayToSAFEARRAY(const ValueArray& varray) +{ + SAFEARRAYBOUND rgsabound; + rgsabound.lLbound = 0; + rgsabound.cElements = varray.GetCount(); + SAFEARRAY *a = SafeArrayCreate(VT_VARIANT, 1, &rgsabound); + if(!a) + return NULL; + for(long index = 0; index < varray.GetCount(); index++) { + OleVariant var = AsVariant(varray[(int)index]); + SafeArrayPutElement(a, &index, &var); + } + return a; +} + ////////////////////////////////////////////////////////////////////// // special types diff --git a/uppsrc/Ole/util.h b/uppsrc/Ole/util.h index 75bfdea64..1b135142c 100644 --- a/uppsrc/Ole/util.h +++ b/uppsrc/Ole/util.h @@ -123,6 +123,11 @@ HRESULT CheckReturnString(BSTR *bstr, String s); void ReturnWString(BSTR *dest, WString s); HRESULT CheckReturnWString(BSTR *bstr, WString s); +ValueArray SAFEARRAYToValueArray(SAFEARRAY *array); +SAFEARRAY *ValueArrayToSAFEARRAY(const ValueArray& varray); +void ReturnValueArray(SAFEARRAY *dest, const ValueArray& array); +HRESULT CheckReturnString(BSTR *bstr, String s); + class OleBstr { public: