X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e90c1d2a19361551eb07778280f22be3e759cf64..9045ad9dfc9d205ad645e6d496bec9ccddd91ced:/src/msw/ole/automtn.cpp diff --git a/src/msw/ole/automtn.cpp b/src/msw/ole/automtn.cpp index 5f83323c4c..9596ceea35 100644 --- a/src/msw/ole/automtn.cpp +++ b/src/msw/ole/automtn.cpp @@ -20,15 +20,20 @@ #pragma hdrstop #endif -#include "wx/log.h" +#include "wx/defs.h" -#include -#include +// 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__) +#define _FORCENAMELESSUNION +#include "wx/log.h" #include "wx/msw/ole/automtn.h" - #include "wx/msw/private.h" +#include +#include + #include #include #include @@ -81,9 +86,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); +#endif // wxUSE_TIMEDATE static void ClearVariant(VARIANTARG *pvarg) ; static void ReleaseVariant(VARIANTARG *pvarg) ; @@ -177,6 +184,8 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, if (FAILED(hr)) { // ShowException(szMember, hr, NULL, 0); + delete[] argNames; + delete[] dispIds; return FALSE; } @@ -195,7 +204,12 @@ bool wxAutomationObject::Invoke(const wxString& member, int action, { // Again, reverse args if (!ConvertVariantToOle(INVOKEARG((noArgs-1) - i), oleArgs[i])) - return FALSE; // TODO: clean up memory at this point + { + delete[] argNames; + delete[] dispIds; + delete[] oleArgs; + return FALSE; + } } dispparams.rgdispidNamedArgs = dispIds + 1; @@ -261,6 +275,16 @@ wxVariant wxAutomationObject::CallMethod(const wxString& member, int noArgs, wxV return retVariant; } +wxVariant wxAutomationObject::CallMethodArray(const wxString& member, int noArgs, const wxVariant **args) +{ + wxVariant retVariant; + if (!Invoke(member, DISPATCH_METHOD, retVariant, noArgs, NULL, args)) + { + retVariant.MakeNull(); + } + return retVariant; +} + wxVariant wxAutomationObject::CallMethod(const wxString& member, const wxVariant& arg1, const wxVariant& arg2, const wxVariant& arg3, const wxVariant& arg4, @@ -308,6 +332,15 @@ wxVariant wxAutomationObject::CallMethod(const wxString& member, } // Get/Set property +wxVariant wxAutomationObject::GetPropertyArray(const wxString& property, int noArgs, const wxVariant **args) const +{ + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, NULL, args)) + { + retVariant.MakeNull(); + } + return retVariant; +} wxVariant wxAutomationObject::GetProperty(const wxString& property, int noArgs, wxVariant args[]) const { wxVariant retVariant; @@ -374,6 +407,16 @@ bool wxAutomationObject::PutProperty(const wxString& property, int noArgs, wxVar return TRUE; } +bool wxAutomationObject::PutPropertyArray(const wxString& property, int noArgs, const wxVariant **args) +{ + wxVariant retVariant; + if (!Invoke(property, DISPATCH_PROPERTYPUT, retVariant, noArgs, NULL, args)) + { + return FALSE; + } + return TRUE; +} + bool wxAutomationObject::PutProperty(const wxString& property, const wxVariant& arg1, const wxVariant& arg2, const wxVariant& arg3, const wxVariant& arg4, @@ -427,19 +470,34 @@ WXIDISPATCH* wxAutomationObject::GetDispatchProperty(const wxString& property, i wxVariant retVariant; if (Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, args)) { - if (retVariant.GetType() == T("void*")) + if (retVariant.GetType() == wxT("void*")) { return (WXIDISPATCH*) retVariant.GetVoidPtr(); } - else + } + + return (WXIDISPATCH*) NULL; +} + +// Uses DISPATCH_PROPERTYGET +// and returns a dispatch pointer. The calling code should call Release +// on the pointer, though this could be implicit by constructing an wxAutomationObject +// with it and letting the destructor call Release. +WXIDISPATCH* wxAutomationObject::GetDispatchProperty(const wxString& property, int noArgs, const wxVariant **args) const +{ + wxVariant retVariant; + if (Invoke(property, DISPATCH_PROPERTYGET, retVariant, noArgs, NULL, args)) + { + if (retVariant.GetType() == wxT("void*")) { - return (WXIDISPATCH*) NULL; + return (WXIDISPATCH*) retVariant.GetVoidPtr(); } } - else - return (WXIDISPATCH*) NULL; + + return (WXIDISPATCH*) NULL; } + // A way of initialising another wxAutomationObject with a dispatch object bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& property, int noArgs, wxVariant args[]) const { @@ -453,6 +511,19 @@ bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& prop return FALSE; } +// A way of initialising another wxAutomationObject with a dispatch object +bool wxAutomationObject::GetObject(wxAutomationObject& obj, const wxString& property, int noArgs, const wxVariant **args) const +{ + WXIDISPATCH* dispatch = GetDispatchProperty(property, noArgs, args); + if (dispatch) + { + obj.SetDispatchPtr(dispatch); + return TRUE; + } + else + return FALSE; +} + // Get a dispatch pointer from the current object associated // with a class id bool wxAutomationObject::GetInstance(const wxString& classId) const @@ -467,19 +538,19 @@ bool wxAutomationObject::GetInstance(const wxString& classId) const if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) { - wxLogWarning(T("Cannot obtain CLSID from ProgID")); + wxLogWarning(wxT("Cannot obtain CLSID from ProgID")); return FALSE; } if (FAILED(GetActiveObject(clsId, NULL, &pUnk))) { - wxLogWarning(T("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(T("Cannot find IDispatch interface")); + wxLogWarning(wxT("Cannot find IDispatch interface")); return FALSE; } @@ -499,14 +570,14 @@ bool wxAutomationObject::CreateInstance(const wxString& classId) const if (FAILED(CLSIDFromProgID((BSTR) unicodeName, &clsId))) { - wxLogWarning(T("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(T("Cannot start an instance of this class.")); + wxLogWarning(wxT("Cannot start an instance of this class.")); return FALSE; } @@ -525,17 +596,26 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) wxString type(variant.GetType()); - if (type == T("long")) + + if (type == wxT("long")) { oleVariant.vt = VT_I4; oleVariant.lVal = variant.GetLong() ; } - else if (type == T("double")) + // cVal not always present +#ifndef __GNUWIN32__ + else if (type == wxT("char")) + { + oleVariant.vt=VT_I1; // Signed Char + oleVariant.cVal=variant.GetChar(); + } +#endif + else if (type == wxT("double")) { oleVariant.vt = VT_R8; oleVariant.dblVal = variant.GetDouble(); } - else if (type == T("bool")) + else if (type == wxT("bool")) { oleVariant.vt = VT_BOOL; // 'bool' required for VC++ 4 apparently @@ -545,13 +625,15 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) oleVariant.boolVal = variant.GetBool(); #endif } - else if (type == T("string")) + else if (type == wxT("string")) { wxString str( variant.GetString() ); oleVariant.vt = VT_BSTR; oleVariant.bstrVal = ConvertStringToOle(str); } - else if (type == T("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; @@ -560,7 +642,7 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) 0, 0, 0, oleVariant.date)) return FALSE; } - else if (type == T("time")) + else if (type == wxT("time")) { wxTime time( variant.GetTime() ); oleVariant.vt = VT_DATE; @@ -569,12 +651,13 @@ bool ConvertVariantToOle(const wxVariant& variant, VARIANTARG& oleVariant) time.GetHour(), time.GetMinute(), time.GetSecond(), oleVariant.date)) return FALSE; } - else if (type == T("void*")) +#endif + else if (type == wxT("void*")) { oleVariant.vt = VT_DISPATCH; oleVariant.pdispVal = (IDispatch*) variant.GetVoidPtr(); } - else if (type == T("list") || type == T("stringlist")) + else if (type == wxT("list") || type == wxT("stringlist")) { oleVariant.vt = VT_VARIANT | VT_ARRAY; @@ -644,7 +727,8 @@ bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) } case VT_DATE: { - struct tm tmTemp; +#if wxUSE_TIMEDATE + struct tm tmTemp; if (!TmFromOleDate(oleVariant.date, tmTemp)) return FALSE; @@ -652,7 +736,9 @@ bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) wxTime time(date, tmTemp.tm_hour, tmTemp.tm_min, tmTemp.tm_sec); variant = time; - break; +#endif + + break; } case VT_I4: { @@ -673,8 +759,12 @@ bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) #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; } @@ -728,7 +818,7 @@ bool ConvertOleToVariant(const VARIANTARG& oleVariant, wxVariant& variant) } default: { - wxLogError(T("wxAutomationObject::ConvertOleToVariant: Unknown variant value type")); + wxLogError(wxT("wxAutomationObject::ConvertOleToVariant: Unknown variant value type")); return FALSE; } } @@ -751,12 +841,15 @@ static BSTR ConvertStringToOle(const wxString& str) static wxString ConvertStringFromOle(BSTR bStr) { +#if wxUSE_UNICODE + wxString str(bStr); +#else int len = SysStringLen(bStr) + 1; char *buf = new char[len]; (void)wcstombs( buf, bStr, len); - - wxString str(buf); + wxString str(buf); delete[] buf; +#endif return str; } @@ -1061,7 +1154,7 @@ static void ReleaseVariant(VARIANTARG *pvarg) } else { - wxLogWarning(T("ReleaseVariant: Array contains non-variant type")); + wxLogWarning(wxT("ReleaseVariant: Array contains non-variant type")); } // Free the array itself. @@ -1088,7 +1181,7 @@ static void ReleaseVariant(VARIANTARG *pvarg) break; default: - wxLogWarning(T("ReleaseVariant: Unknown type")); + wxLogWarning(wxT("ReleaseVariant: Unknown type")); break; } } @@ -1159,3 +1252,5 @@ void ShowException(LPOLESTR szMember, HRESULT hr, EXCEPINFO *pexcep, unsigned in #endif +#endif // __WATCOMC__ +