X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d980b3e1f4b22b92a7101432ae4e02598cc9e0d4..092fdc46a9bbed16ca2f0d50426f9f415b5ac684:/src/msw/ole/automtn.cpp diff --git a/src/msw/ole/automtn.cpp b/src/msw/ole/automtn.cpp index 2d94102905..108c2948b0 100644 --- a/src/msw/ole/automtn.cpp +++ b/src/msw/ole/automtn.cpp @@ -29,6 +29,37 @@ #include #include +#ifdef GetObject +#undef GetObject +#endif + +// wrapper around BSTR type (by Vadim Zeitlin) + +class WXDLLEXPORT BasicString +{ +public: + // ctors & dtor + BasicString(const char *sz); + ~BasicString(); + + // accessors + // just get the string + operator BSTR() const { return m_wzBuf; } + // retrieve a copy of our string - caller must SysFreeString() it later! + BSTR Get() const { return SysAllocString(m_wzBuf); } + +private: + // @@@ not implemented (but should be) + BasicString(const BasicString&); + BasicString& operator=(const BasicString&); + + OLECHAR *m_wzBuf; // actual string +}; + +// Convert variants +static bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) ; +static bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) ; + // Convert string to Unicode static BSTR ConvertStringToOle(const wxString& str); @@ -163,8 +194,7 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, for (i = 0; i < noArgs; i++) { // Again, reverse args - wxVariant& theVariant = INVOKEARG((noArgs-1) - i); - if (!ConvertVariantToOle(theVariant, oleArgs[i])) + if (!ConvertVariantToOle(INVOKEARG((noArgs-1) - i), oleArgs[i])) return FALSE; // TODO: clean up memory at this point } @@ -485,7 +515,7 @@ bool wxAutomationObject::CreateInstance(const wxString& classId) const } -bool wxAutomationObject::ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) +bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) { ClearVariant(&oleVariant); if (variant.IsNull()) @@ -509,7 +539,12 @@ bool wxAutomationObject::ConvertVariantToOle(const wxVariant& variant, VARIANTAR else if (type == "bool") { oleVariant.vt = VT_BOOL; + // 'bool' required for VC++ 4 apparently +#if defined(__WATCOMC__) || (defined(_MSC_VER) && (_MSC_VER <= 1000)) + oleVariant.bool = variant.GetBool(); +#else oleVariant.boolVal = variant.GetBool(); +#endif } else if (type == "string") { @@ -598,7 +633,7 @@ bool wxAutomationObject::ConvertVariantToOle(const wxVariant& variant, VARIANTAR #define VT_TYPEMASK 0xfff #endif -bool wxAutomationObject::ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) +bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) { switch (oleVariant.vt & VT_TYPEMASK) { @@ -633,7 +668,11 @@ bool wxAutomationObject::ConvertOleToVariant(const VARIANTARG& oleVariant, wxVar case VT_BOOL: { +#ifdef __WATCOMC__ + variant = (bool) (oleVariant.bool != 0); +#else variant = (bool) (oleVariant.boolVal != 0); +#endif break; } case VT_R8: @@ -680,6 +719,10 @@ bool wxAutomationObject::ConvertOleToVariant(const VARIANTARG& oleVariant, wxVar variant.MakeNull(); break; } + case VT_EMPTY: + { + break; // Ignore Empty Variant, used only during destruction of objects + } default: { wxLogError("wxAutomationObject::ConvertOleToVariant: Unknown variant value type"); @@ -723,7 +766,11 @@ BasicString::BasicString(const char *sz) { // get the size of required buffer UINT lenAnsi = strlen(sz); + #ifdef __MWERKS__ + UINT lenWide = lenAnsi * 2 ; + #else UINT lenWide = mbstowcs(NULL, sz, lenAnsi); + #endif if ( lenWide > 0 ) { m_wzBuf = new OLECHAR[lenWide + 1];