From 3d3b0abf45ad4bf6abd82d022e01080cd423c1c5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 10 Feb 2016 09:56:41 +0100 Subject: Introduce helper functions for ITypeInfo::GetNames(). Move code to axutils. Change-Id: I149d72bba2f250a2c11e144b449b55385fe280e2 Reviewed-by: Joerg Bornemann --- src/activeqt/container/qaxbase.cpp | 74 ++++++++-------------------------- src/activeqt/control/qaxserverbase.cpp | 12 ++---- src/activeqt/shared/qaxutils.cpp | 28 +++++++++++++ src/activeqt/shared/qaxutils_p.h | 3 ++ 4 files changed, 52 insertions(+), 65 deletions(-) diff --git a/src/activeqt/container/qaxbase.cpp b/src/activeqt/container/qaxbase.cpp index acc319e..fb1351e 100644 --- a/src/activeqt/container/qaxbase.cpp +++ b/src/activeqt/container/qaxbase.cpp @@ -663,13 +663,10 @@ QByteArray QAxEventSink::findProperty(DISPID dispID) if (!typeinfo) return propname; - BSTR names; - UINT cNames; - typeinfo->GetNames(dispID, &names, 1, &cNames); - if (cNames) { - propname = QString::fromWCharArray(names).toLatin1(); - SysFreeString(names); - } + + const QByteArray propnameI = qaxTypeInfoName(typeinfo, dispID); + if (!propnameI.isEmpty()) + propname = propnameI; typeinfo->Release(); QByteArray propsignal(propname + "Changed("); @@ -2298,17 +2295,9 @@ void MetaObjectGenerator::readEnumInfo() int value = vardesc->lpvarValue->lVal; int memid = vardesc->memid; // Get the name of the value - BSTR valuename; - QByteArray valueName; - UINT maxNamesOut; - enuminfo->GetNames(memid, &valuename, 1, &maxNamesOut); - if (maxNamesOut) { - valueName = QString::fromWCharArray(valuename).toLatin1(); - SysFreeString(valuename); - } else { + QByteArray valueName = qaxTypeInfoName(enuminfo, memid); + if (valueName.isEmpty()) valueName = "value" + QByteArray::number(valueindex++); - } - if (clashCheck.contains(QString::fromLatin1(valueName))) valueName += QByteArray::number(++clashIndex); @@ -2457,25 +2446,15 @@ void MetaObjectGenerator::readFuncsInfo(ITypeInfo *typeinfo, ushort nFuncs) if (!funcdesc) break; - QByteArray function; QByteArray type; QByteArray prototype; QList parameters; // parse function description - BSTR bstrNames[256]; - UINT maxNames = 255; - UINT maxNamesOut; - typeinfo->GetNames(funcdesc->memid, (BSTR*)&bstrNames, maxNames, &maxNamesOut); - QList names; - int p; - for (p = 0; p < (int)maxNamesOut; ++p) { - names << QString::fromWCharArray(bstrNames[p]).toLatin1(); - SysFreeString(bstrNames[p]); - } - + const QByteArrayList names = qaxTypeInfoNames(typeinfo, funcdesc->memid); + const int maxNamesOut = names.size(); // function name - function = names.at(0); + const QByteArray &function = names.at(0); if ((maxNamesOut == 3 && function == "QueryInterface") || (maxNamesOut == 1 && function == "AddRef") || (maxNamesOut == 1 && function == "Release") || @@ -2574,7 +2553,7 @@ void MetaObjectGenerator::readFuncsInfo(ITypeInfo *typeinfo, ushort nFuncs) bool defargs; do { QByteArray pnames; - for (p = 0; p < parameters.count(); ++p) { + for (int p = 0; p < parameters.count(); ++p) { pnames += parameters.at(p); if (p < parameters.count() - 1) pnames += ','; @@ -2640,24 +2619,17 @@ void MetaObjectGenerator::readVarsInfo(ITypeInfo *typeinfo, ushort nVars) } // get variable name - BSTR bstrName; - UINT maxNames = 1; - UINT maxNamesOut; - typeinfo->GetNames(vardesc->memid, &bstrName, maxNames, &maxNamesOut); - if (maxNamesOut != 1 || !bstrName) { + const QByteArray variableName = qaxTypeInfoName(typeinfo, vardesc->memid); + if (variableName.isEmpty()) { typeinfo->ReleaseVarDesc(vardesc); continue; } - QByteArray variableType; - QByteArray variableName; - uint flags = 0; - variableName = QString::fromWCharArray(bstrName).toLatin1(); - SysFreeString(bstrName); + uint flags = 0; // get variable type TYPEDESC typedesc = vardesc->elemdescVar.tdesc; - variableType = guessTypes(typedesc, typeinfo, variableName); + const QByteArray variableType = guessTypes(typedesc, typeinfo, variableName); // generate meta property if (!hasProperty(variableName)) { @@ -2798,29 +2770,17 @@ void MetaObjectGenerator::readEventInterface(ITypeInfo *eventinfo, IConnectionPo continue; } - QByteArray function; QByteArray prototype; QList parameters; - // parse event function description - BSTR bstrNames[256]; - UINT maxNames = 255; - UINT maxNamesOut; - eventinfo->GetNames(funcdesc->memid, (BSTR*)&bstrNames, maxNames, &maxNamesOut); - QList names; - int p; - for (p = 0; p < (int)maxNamesOut; ++p) { - names << QString::fromWCharArray(bstrNames[p]).toLatin1(); - SysFreeString(bstrNames[p]); - } + // parse event function description, get event function prototype + const QByteArrayList names = qaxTypeInfoNames(eventinfo, funcdesc->memid); - // get event function prototype - function = names.at(0); QByteArray type; // dummy - we don't care about return values for signals prototype = createPrototype(/*in*/ funcdesc, eventinfo, names, /*out*/type, parameters); if (!hasSignal(prototype)) { QByteArray pnames; - for (p = 0; p < parameters.count(); ++p) { + for (int p = 0; p < parameters.count(); ++p) { pnames += parameters.at(p); if (p < parameters.count() - 1) pnames += ','; diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp index 1402d32..583cb76 100644 --- a/src/activeqt/control/qaxserverbase.cpp +++ b/src/activeqt/control/qaxserverbase.cpp @@ -2290,15 +2290,11 @@ HRESULT WINAPI QAxServerBase::Invoke(DISPID dispidMember, REFIID riid, index = mo->indexOfProperty(name); } } else { - BSTR bname; - UINT cname = 0; - if (m_spTypeInfo) - m_spTypeInfo->GetNames(dispidMember, &bname, 1, &cname); - if (!cname) + if (!m_spTypeInfo) + return res; + name = qaxTypeInfoName(m_spTypeInfo, dispidMember); + if (name.isEmpty()) return res; - - name = QString::fromWCharArray(bname).toLatin1(); - SysFreeString(bname); } } diff --git a/src/activeqt/shared/qaxutils.cpp b/src/activeqt/shared/qaxutils.cpp index 9f94835..7c7e967 100644 --- a/src/activeqt/shared/qaxutils.cpp +++ b/src/activeqt/shared/qaxutils.cpp @@ -346,4 +346,32 @@ HRGN qaxHrgnFromQRegion(const QRegion ®ion, const QWidget *widget) #endif // QT_WIDGETS_LIB +QByteArray qaxTypeInfoName(ITypeInfo *typeInfo, MEMBERID memId) +{ + QByteArray result; + BSTR names; + UINT cNames = 0; + typeInfo->GetNames(memId, &names, 1, &cNames); + if (cNames && names) { + result = QString::fromWCharArray(names).toLatin1(); + SysFreeString(names); + } + return result; +} + +QByteArrayList qaxTypeInfoNames(ITypeInfo *typeInfo, MEMBERID memId) +{ + QByteArrayList result; + BSTR bstrNames[256]; + UINT maxNames = 255; + UINT maxNamesOut = 0; + typeInfo->GetNames(memId, reinterpret_cast(&bstrNames), maxNames, &maxNamesOut); + result.reserve(maxNamesOut); + for (UINT p = 0; p < maxNamesOut; ++p) { + result.append(QString::fromWCharArray(bstrNames[p]).toLatin1()); + SysFreeString(bstrNames[p]); + } + return result; +} + QT_END_NAMESPACE diff --git a/src/activeqt/shared/qaxutils_p.h b/src/activeqt/shared/qaxutils_p.h index acd0eb8..f2576c1 100644 --- a/src/activeqt/shared/qaxutils_p.h +++ b/src/activeqt/shared/qaxutils_p.h @@ -120,6 +120,9 @@ QRect qaxFromNativeRect(const RECT &r, const QWidget *w); HRGN qaxHrgnFromQRegion(const QRegion ®ion, const QWidget *widget); #endif // QT_WIDGETS_LIB +QByteArray qaxTypeInfoName(ITypeInfo *typeInfo, MEMBERID memId); +QByteArrayList qaxTypeInfoNames(ITypeInfo *typeInfo, MEMBERID memId); + QT_END_NAMESPACE Q_DECLARE_METATYPE(IDispatch**) -- cgit v1.2.3