Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование QtScript
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Script. Интеграция WebKit
faustin
Здравствуйте, есть библиотека для вызова вызова нативных функций из ПО вызывается примерно таким методом:
Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
Natives::AddScore(playerIndex, 1000);


так же существует хранилище с нативами их около 3000
namespace Natives
{
static void AddScore(Player playerIndex, int score) { NativeInvoke::Invoke<NATIVE_ADD_SCORE, ScriptVoid>(playerIndex, score); }
...
}

Так как постоянно компилировать огромное количества кода не есть гуд понадобилось использование скриптов с доступом ко всем нативным функциям....
Не подскажите как под это дело прикрутить QtScript?
Заранее спасибо!


Здравствуйте, есть библиотека для вызова вызова нативных функций из ПО вызывается примерно таким методом:
Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
Natives::AddScore(playerIndex, 1000);


так же существует хранилище с нативами их около 3000
namespace Natives
{
static void AddScore(Player playerIndex, int score) { NativeInvoke::Invoke<NATIVE_ADD_SCORE, ScriptVoid>(playerIndex, score); }
...
}

Так как постоянно компилировать огромное количества кода не есть гуд понадобилось использование скриптов с доступом ко всем нативным функциям....
Не подскажите как под это дело прикрутить QtScript?
Заранее спасибо!
PAFOS
Если не смущает описать врапер на каждую функцию, то могу предложить такой вариант:

enum FuncName
{
   Func_AddScore, ....
};

struct FuncInfo
{
  
   int ArgumentsCount;
   FuncName Name;

   FuncInfo( int a, FuncName n ):ArgumentsCount(a),Name(n){}
};

QHash<QString,int> functionArguments;
functionArguments["AddScore", FuncInfo(1,Func_AddScore)];
...
...

QScriptValue NativesCaller(QScriptContext* c, QScriptEngine *engine)
{
   // Первый аргумент - имя вызываемой функции
   QString funcName = context->argument(0).toString();

   if( !functionArguments.contains(funcName) )
   {
         // Если не найдена вызываемая функция, бросаем исключение
         return c->throwError( QString("No such function %0").arg(funcName) );
   }

   FuncInfo inf = functionArguments[funcName];
   if( inf.ArgumentsCount != c->argumentsCount()-1 )
   {
        // Если не совпадает кол-во аргументов для функции, бросаем исключение
        return c->throwError( "arguments count mismatch" );
   }

   QScriptValue retVal;
   switch( inf.FuncName )
   {
   case Func_AddScore:
        {
            int score = c->argument(1).toNumber();
            Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
            Natives::AddScore(playerIndex, 1000);
            break;
        }
   }

   return retVal;
}

....
// Регистрация функции в скриптах
// myEngine имеет тип QStringEngine
QScriptValue fun = myEngine.newObject(NativesCaller);
myEngine.globalObject().setProperty("NativesCaller",fun);


// Работа с функцией в скрипте
try
{
   NativesCaller( "AddScore", 1000 );
}
catch( e )
{
  alert( e.description );
}
faustin
Большое спасибо!
Только вот при компиляции выдает ошибку в троке:
functionArguments["AddScore", FuncInfo(1,Func_AddScore)];

такого содержания:
C2143:синтаксическая ошибка : отсутствие "]" перед ","
PAFOS
ну да, все правильно))

functionArguments["AddScore"] = FuncInfo(1,Func_AddScore);


вот так надо)
faustin
Большое спасибо!
Ахаха я чета сразу и не догнал)))... Все побежал пробовать!

Теперь по этой же строчки вышел ряд ошибок:
C2057: требуется константное выражение
C2466: невозможно выделить память для массива постоянного нулевого размер
C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
C2040: functionArguments: "int []" отличается по уровням косвенного обращения от "QHash<Key,T>"
with
[
    Key=QString,
    T=int
]
C2440: инициализация: невозможно преобразовать "FuncInfo" в "int []"
Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
PAFOS
QHash<QString,FuncInfo> functionArguments;


Товарищ! Будьте внимательнее)) Я пример привел не проверяя его на компилябельность, так что там еще может быть много мин).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.