X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d980b3e1f4b22b92a7101432ae4e02598cc9e0d4..dbcbe229628c7667da2b6257198467d4f09ab28d:/src/msw/ole/automtn.cpp diff --git a/src/msw/ole/automtn.cpp b/src/msw/ole/automtn.cpp index 2d94102905..ac4e48776d 100644 --- a/src/msw/ole/automtn.cpp +++ b/src/msw/ole/automtn.cpp @@ -20,15 +20,53 @@ #pragma hdrstop #endif +#include "wx/defs.h" + +// Watcom C++ gives a linker error if this is compiled in. +// With Borland C++, all samples crash if this is compiled in. +#if wxUSE_OLE &&!defined(__WATCOMC__) && !(defined(__BORLANDC__) && (__BORLANDC__ < 0x520)) && !defined(__CYGWIN10__) + #include "wx/log.h" #include "wx/msw/ole/automtn.h" +#include "wx/msw/private.h" -#include -#include -#include #include #include +#include +#include +#include +#define _huge +#include +#include + +// 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); @@ -47,12 +85,11 @@ static wxString ConvertStringFromOle(BSTR bStr); static int rgMonthDays[13] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}; +#if wxUSE_TIMEDATE static BOOL OleDateFromTm(WORD wYear, WORD wMonth, WORD wDay, WORD wHour, WORD wMinute, WORD wSecond, DATE& dtDest); static BOOL TmFromOleDate(DATE dtSrc, struct tm& tmDest); -static void TmConvertToStandardFormat(struct tm& tmSrc); -static double DoubleFromDate(DATE dt); -static DATE DateFromDouble(double dbl); +#endif // wxUSE_TIMEDATE static void ClearVariant(VARIANTARG *pvarg) ; static void ReleaseVariant(VARIANTARG *pvarg) ; @@ -163,8 +200,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 } @@ -397,17 +433,13 @@ WXIDISPATCH* wxAutomationObject::GetDispatchProperty(const wxString& property, i wxVariant retVariant; if (Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, args)) { - if (retVariant.GetType() == "void*") + if (retVariant.GetType() == wxT("void*")) { return (WXIDISPATCH*) retVariant.GetVoidPtr(); } - else - { - return (WXIDISPATCH*) NULL; - } } - else - return (WXIDISPATCH*) NULL; + + return (WXIDISPATCH*) NULL; } // A way of initialising another wxAutomationObject with a dispatch object @@ -433,23 +465,23 @@ bool wxAutomationObject::GetInstance(const wxString& classId) const CLSID clsId; IUnknown * pUnk = NULL; - BasicString unicodeName((const char*) classId); + BasicString unicodeName(classId.mb_str()); if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) { - wxLogWarning("Cannot obtain CLSID from ProgID"); + wxLogWarning(wxT("Cannot obtain CLSID from ProgID")); return FALSE; } if (FAILED(GetActiveObject(clsId, NULL, &pUnk))) { - wxLogWarning("Cannot find an active object"); + wxLogWarning(wxT("Cannot find an active object")); return FALSE; } if (pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &m_dispatchPtr) != S_OK) { - wxLogWarning("Cannot find IDispatch interface"); + wxLogWarning(wxT("Cannot find IDispatch interface")); return FALSE; } @@ -464,20 +496,19 @@ bool wxAutomationObject::CreateInstance(const wxString& classId) const return FALSE; CLSID clsId; - IUnknown * pUnk = NULL; - BasicString unicodeName((const char*) classId); + BasicString unicodeName(classId.mb_str()); if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) { - wxLogWarning("Cannot obtain CLSID from ProgID"); + wxLogWarning(wxT("Cannot obtain CLSID from ProgID")); return FALSE; } // start a new copy of Excel, grab the IDispatch interface if (FAILED(CoCreateInstance(clsId, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_dispatchPtr))) { - wxLogWarning("Cannot start an instance of this class."); + wxLogWarning(wxT("Cannot start an instance of this class.")); return FALSE; } @@ -485,7 +516,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()) @@ -496,28 +527,35 @@ bool wxAutomationObject::ConvertVariantToOle(const wxVariant& variant, VARIANTAR wxString type(variant.GetType()); - if (type == "long") + if (type == wxT("long")) { oleVariant.vt = VT_I4; oleVariant.lVal = variant.GetLong() ; } - else if (type == "double") + else if (type == wxT("double")) { oleVariant.vt = VT_R8; oleVariant.dblVal = variant.GetDouble(); } - else if (type == "bool") + else if (type == wxT("bool")) { oleVariant.vt = VT_BOOL; + // 'bool' required for VC++ 4 apparently +#if defined(__WATCOMC__) || (defined(__VISUALC__) && (__VISUALC__ <= 1000)) + oleVariant.bool = variant.GetBool(); +#else oleVariant.boolVal = variant.GetBool(); +#endif } - else if (type == "string") + else if (type == wxT("string")) { wxString str( variant.GetString() ); oleVariant.vt = VT_BSTR; oleVariant.bstrVal = ConvertStringToOle(str); } - else if (type == "date") +// For some reason, Watcom C++ can't link variant.cpp with time/date classes compiled +#if wxUSE_TIMEDATE && !defined(__WATCOMC__) + else if (type == wxT("date")) { wxDate date( variant.GetDate() ); oleVariant.vt = VT_DATE; @@ -526,7 +564,7 @@ bool wxAutomationObject::ConvertVariantToOle(const wxVariant& variant, VARIANTAR 0, 0, 0, oleVariant.date)) return FALSE; } - else if (type == "time") + else if (type == wxT("time")) { wxTime time( variant.GetTime() ); oleVariant.vt = VT_DATE; @@ -535,12 +573,13 @@ bool wxAutomationObject::ConvertVariantToOle(const wxVariant& variant, VARIANTAR time.GetHour(), time.GetMinute(), time.GetSecond(), oleVariant.date)) return FALSE; } - else if (type == "void*") +#endif + else if (type == wxT("void*")) { oleVariant.vt = VT_DISPATCH; oleVariant.pdispVal = (IDispatch*) variant.GetVoidPtr(); } - else if (type == "list" || type == "stringlist") + else if (type == wxT("list") || type == wxT("stringlist")) { oleVariant.vt = VT_VARIANT | VT_ARRAY; @@ -598,7 +637,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) { @@ -610,7 +649,8 @@ bool wxAutomationObject::ConvertOleToVariant(const VARIANTARG& oleVariant, wxVar } case VT_DATE: { - struct tm tmTemp; +#if wxUSE_TIMEDATE + struct tm tmTemp; if (!TmFromOleDate(oleVariant.date, tmTemp)) return FALSE; @@ -618,7 +658,9 @@ bool wxAutomationObject::ConvertOleToVariant(const VARIANTARG& oleVariant, wxVar wxTime time(date, tmTemp.tm_hour, tmTemp.tm_min, tmTemp.tm_sec); variant = time; - break; +#endif + + break; } case VT_I4: { @@ -633,7 +675,19 @@ bool wxAutomationObject::ConvertOleToVariant(const VARIANTARG& oleVariant, wxVar case VT_BOOL: { +#if defined(__WATCOMC__) || (defined(_MSC_VER) && (_MSC_VER <= 1000) && !defined(__MWERKS__) ) //GC +#ifndef HAVE_BOOL // Can't use bool operator if no native bool type + variant = (long) (oleVariant.bool != 0); +#else + variant = (bool) (oleVariant.bool != 0); +#endif +#else +#ifndef HAVE_BOOL // Can't use bool operator if no native bool type + variant = (long) (oleVariant.boolVal != 0); +#else variant = (bool) (oleVariant.boolVal != 0); +#endif +#endif break; } case VT_R8: @@ -680,9 +734,13 @@ 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"); + wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type")); return FALSE; } } @@ -699,7 +757,7 @@ static BSTR ConvertStringToOle(const wxString& str) for (i=0; i < len; i++) s[i*2] = str[i]; */ - BasicString bstr((const char*) str); + BasicString bstr(str.mb_str()); return bstr.Get(); } @@ -707,7 +765,7 @@ static wxString ConvertStringFromOle(BSTR bStr) { int len = SysStringLen(bStr) + 1; char *buf = new char[len]; - int i = wcstombs( buf, bStr, len); + (void)wcstombs( buf, bStr, len); wxString str(buf); delete[] buf; @@ -723,7 +781,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]; @@ -919,6 +981,8 @@ DoTime: return TRUE; } +// this function is not used +#if 0 void TmConvertToStandardFormat(struct tm& tmSrc) { // Convert afx internal tm to format expected by runtimes (_tcsftime, etc) @@ -951,6 +1015,7 @@ DATE DateFromDouble(double dbl) double temp = floor(dbl); // dbl is now whole part return temp + (temp - dbl); } +#endif // 0 /* * ClearVariant @@ -1008,7 +1073,7 @@ static void ReleaseVariant(VARIANTARG *pvarg) } else { - wxLogWarning("ReleaseVariant: Array contains non-variant type"); + wxLogWarning(wxT("ReleaseVariant: Array contains non-variant type")); } // Free the array itself. @@ -1035,7 +1100,7 @@ static void ReleaseVariant(VARIANTARG *pvarg) break; default: - wxLogWarning("ReleaseVariant: Unknown type"); + wxLogWarning(wxT("ReleaseVariant: Unknown type")); break; } } @@ -1106,3 +1171,5 @@ void ShowException(LPOLESTR szMember, HRESULT hr, EXCEPINFO *pexcep, unsigned in #endif +#endif // __WATCOMC__ +