Есть класс (например):
class ForScripting : public QObject
{
Q_OBJECT
protected:
Need* m_pNeed;
QString m_sElementId;
public:
ForScripting(Need* need, const QString& elementId);
virtual ~Switch();
public slots:
QString getNeedName() const;
QString getElementName() const;
Connection* getInConnection();
}
Указатель на объект класса Need используется для конструирования:
Слоты класса используют класс:
class Connection : public QObject
{
Q_OBJECT
protected:
QString mFolderPath;
...
public:
Connection();
Connection(const Connection& connection);
Connection& operator=(const Connection& connection);
virtual ~Connection(){};
public slots:
QString getName() const;
...
}
Теперь задача:
Необходимо чтобы программа могла выполнить VBScript типа такого
Function jobExecute(ForScripting s)
Dim StrId
StrId = s.getNeedName()
jobArrived = StrId
End Function
то есть, что можно было вызывать слоты класса ForScripting в скрипте.
Это все реализовано, но для JavaScript.
С помощью QSA все просто:
QSInterpreter* interpreter = new QSInterpreter();
interpreter->addTransientObject(forscriptobj);
forscriptobj - объект класса ForScripting
Для класса Connection наследуемся от QSObjectFactory, создаем объект этого класса наследника (factory) и:
interpreter->addObjectFactory( factory );
и в итоге:
interpreter->evaluate(код скрипта);
С VBScript оказалось сложнее.
Решил создать из класса ForScripting COM сервер.
В итоге у меня есть много вопросов:
1. Во всех примерах, классы, которые делаются COM сервером, имеют конструктор типа такого Application(QObject *parent = 0);
Я так и не разобрался, как же создать объект, если у него конструктор типа ForScripting (Need* need, const QString& elementId);
Допустим я добавлю в ForScripting конструктор без параметров. Зарегистрировал сервер.
Используем его. Создаем объект:
QAxBase* axSwitch = new QAxObject("{C3428B01-5D5B-4c92-BB64-0129B3C39FC3}");
Как теперь передать с объект данные, которые обычно передаются в конструктор? Можно добавить в класс функцию типа
void ForScripting::setInitData(Need* need, const QString& elementId);
Но как ее теперь вызвать? Как получить интерфейс моего сервера?
2. Чтобы слоты могли оперировать указателями на Connection, необходимо реализовывать этот класс как в примере COM App Example реализованы классы Document и DocumentList?
3. Как реализовывать классы ForScripting и Connection, как в примере Wrapper Example, то есть наследоваться от QAxFactory и переопределять функции
QStringList featureList() const
QObject *createObject(const QString &key)
const QMetaObject *metaObject( const QString &key ) const
QUuid classID( const QString &key ) const
QUuid interfaceID( const QString &key ) const
QUuid eventsID( const QString &key ) const
и использовать макрос QAXFACTORY_EXPORT
или как в примере COM App Example:
в классах пишем макросы:
Q_CLASSINFO("ClassID", "{b50a71db-c4a7-4551-8d14-49983566afee}")
Q_CLASSINFO("InterfaceID", "{4a427759-16ef-4ed8-be79-59ffe5789042}")
Q_CLASSINFO("RegisterObject", "yes")
и потом в конце файла макрос:
QAXFACTORY_BEGIN("{edd3e836-f537-4c6f-be7d-6014c155cc7a}", "{b7da3de8-83bb-4bbe-9ab7-99a05819e201}")
QAXCLASS(ForScripting)
QAXTYPE(Connection)
QAXFACTORY_END()
4. Надо ли использовать The dumpcpp Tool ? В каких случаях ее вообще нужно использовать?
Кто знает подскажите, пожалуйста, потому что я уже в тупике...