diff --git a/TestPlugin/lang/TestPlugin_zh_CN.ts b/TestPlugin/lang/TestPlugin_zh_CN.ts index f9fa955..3f25f62 100644 --- a/TestPlugin/lang/TestPlugin_zh_CN.ts +++ b/TestPlugin/lang/TestPlugin_zh_CN.ts @@ -306,12 +306,12 @@ - - - - - - + + + + + + InvalidParamsCount 无效参数个数 @@ -322,7 +322,7 @@ 非法参数 - + AllocArrayFailed 分配数组失败 diff --git a/TestPlugin/testplugin.cpp b/TestPlugin/testplugin.cpp index 3db12b7..3963e78 100644 --- a/TestPlugin/testplugin.cpp +++ b/TestPlugin/testplugin.cpp @@ -263,7 +263,7 @@ WingHex::UNSAFE_RET TestPlugin::colorTable(const QList ¶ms) { void *array = nullptr; QVector colors; for (auto &c : colorTable()) { - colors.append(new QColor(c)); + colors.append(&c); } auto invoked = @@ -271,7 +271,6 @@ WingHex::UNSAFE_RET TestPlugin::colorTable(const QList ¶ms) { qReturnArg(array), WingHex::MetaType::Meta_Color, colors); if (invoked) { if (array) { - qDeleteAll(colors); return array; } } diff --git a/lang/zh_CN/winghex_zh_CN.ts b/lang/zh_CN/winghex_zh_CN.ts index 7712af6..1f710e9 100644 --- a/lang/zh_CN/winghex_zh_CN.ts +++ b/lang/zh_CN/winghex_zh_CN.ts @@ -5467,18 +5467,18 @@ 为 AngelScript 脚本提供调用主机 API 能力的内部插件。 - + NotSupportedQMetaType: 不支持的 QT 数据元类型: - - + + Get Exception While ScriptCall: (%1) %2 脚本调用发生异常:(%1)%2 - + InvalidRetType: need 无效返回值:需要 diff --git a/lang/zh_TW/winghex_zh_TW.ts b/lang/zh_TW/winghex_zh_TW.ts index 5525bf5..4906916 100644 --- a/lang/zh_TW/winghex_zh_TW.ts +++ b/lang/zh_TW/winghex_zh_TW.ts @@ -5467,18 +5467,18 @@ 為 AngelScript 腳本提供調用主機 API 能力的內部插件。 - + NotSupportedQMetaType: 不支持的 QT 數據元類型: - - + + Get Exception While ScriptCall: (%1) %2 腳本調用發生異常:(%1)%2 - + InvalidRetType: need 無效返回值:需要 diff --git a/src/class/pluginsystem.cpp b/src/class/pluginsystem.cpp index 55f2fdf..7cecfe2 100644 --- a/src/class/pluginsystem.cpp +++ b/src/class/pluginsystem.cpp @@ -600,7 +600,7 @@ bool PluginSystem::invokeServiceImpl(const QObject *sender, const QString &puid, if (met.name() == method) { bool err = false; for (int i = 1; i < paramCount; ++i) { - if (met.parameterType(i) != metaTypes[i]->typeId) { + if (met.parameterTypeName(i).compare(metaTypes[i]->name)) { err = true; break; } diff --git a/src/class/wingangelapi.cpp b/src/class/wingangelapi.cpp index fd1c6fa..c4e8a86 100644 --- a/src/class/wingangelapi.cpp +++ b/src/class/wingangelapi.cpp @@ -1061,12 +1061,10 @@ QStringList WingAngelAPI::cArray2QStringList(const CScriptArray &array, QStringList buffer; buffer.reserve(array.GetSize()); - array.AddRef(); for (asUINT i = 0; i < array.GetSize(); ++i) { auto item = reinterpret_cast(array.At(i)); buffer.append(*item); } - array.Release(); return buffer; } @@ -1217,9 +1215,10 @@ void WingAngelAPI::qvariantCastOp( assignTmpBuffer(buffer, var.toULongLong()); fn(&buffer, type); break; - case QMetaType::QChar: - fn(new QChar(var.toChar()), type); - break; + case QMetaType::QChar: { + auto obj = var.toChar(); + fn(&obj, type); + } break; case QMetaType::Float: assignTmpBuffer(buffer, var.toULongLong()); fn(&buffer, type); @@ -1229,21 +1228,24 @@ void WingAngelAPI::qvariantCastOp( fn(&buffer, type); break; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - case QMetaType::Char16: - fn(new QChar(var.value()), type); - break; - case QMetaType::Char32: - fn(new QChar(var.value()), type); - break; + case QMetaType::Char16: { + auto obj = QChar(var.value()); + fn(&obj, type); + } break; + case QMetaType::Char32: { + auto obj = QChar(var.value()); + fn(&obj, type); + } break; #endif case QMetaType::UChar: case QMetaType::SChar: case QMetaType::Char: assignTmpBuffer(buffer, var.value()); break; - case QMetaType::QString: - fn(new QString(var.toString()), type); - break; + case QMetaType::QString: { + auto obj = var.toString(); + fn(&obj, type); + } break; case QMetaType::QByteArray: { auto value = var.toByteArray(); auto info = engine->GetTypeInfoByDecl("array"); @@ -1298,9 +1300,10 @@ void WingAngelAPI::qvariantCastOp( fn(arr, type); arr->Release(); } break; - case QMetaType::QColor: - fn(new QColor(var.value()), type); - break; + case QMetaType::QColor: { + auto obj = var.value(); + fn(&obj, type); + } break; case QMetaType::Void: break; default: @@ -2000,7 +2003,9 @@ void *WingAngelAPI::vector2AsArray(const WingHex::SenderInfo &sender, if (info) { auto len = content.length(); auto arr = CScriptArray::Create(info, len); - std::memcpy(arr->GetBuffer(), content.data(), len); + for (int i = 0; i < len; ++i) { + arr->SetValue(i, content.at(i)); + } return arr; } return nullptr; @@ -2009,37 +2014,8 @@ void *WingAngelAPI::vector2AsArray(const WingHex::SenderInfo &sender, void *WingAngelAPI::list2AsArray(const WingHex::SenderInfo &sender, WingHex::MetaType type, const QList &content) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) static_assert(std::is_same_v, QVector>); return vector2AsArray(sender, type, content); -#else - Q_UNUSED(sender); - auto typeStr = type2AngelScriptString(MetaType(type | MetaType::Meta_Array), - false, true); - if (typeStr.isEmpty()) { - return nullptr; - } - - auto engine = ScriptMachine::instance().engine(); - auto info = engine->GetTypeInfoByDecl(typeStr.toUtf8()); - if (info) { - auto len = content.length(); - auto arr = CScriptArray::Create(info, len); - for (decltype(len) i = 0; i < len; ++i) { - arr->SetValue(i, content.at(i)); - } - return arr; - } - return nullptr; -#endif -} - -void WingAngelAPI::deleteAsArray(const WingHex::SenderInfo &sender, - void *array) { - Q_UNUSED(sender); - if (array) { - reinterpret_cast(array)->Release(); - } } void *WingAngelAPI::newAsDictionary( @@ -2063,14 +2039,6 @@ void *WingAngelAPI::newAsDictionary( return dic; } -void WingAngelAPI::deleteAsDictionary(const WingHex::SenderInfo &sender, - void *dic) { - Q_UNUSED(sender); - if (dic) { - reinterpret_cast(dic)->Release(); - } -} - void WingAngelAPI::cleanUpHandles(const QVector &handles) { for (auto &h : _handles) { if (!handles.contains(h)) { diff --git a/src/class/wingangelapi.h b/src/class/wingangelapi.h index 01c2cd0..75e9b68 100644 --- a/src/class/wingangelapi.h +++ b/src/class/wingangelapi.h @@ -175,14 +175,10 @@ private: WING_SERVICE void *list2AsArray(const WingHex::SenderInfo &sender, WingHex::MetaType type, const QList &content); - WING_SERVICE void deleteAsArray(const WingHex::SenderInfo &sender, - void *array); WING_SERVICE void *newAsDictionary( const WingHex::SenderInfo &sender, const QHash> &content); - WING_SERVICE void deleteAsDictionary(const WingHex::SenderInfo &sender, - void *dic); // =========================================================