Я должен использовать ActiveQt (QT 4.8.6 Windows7). У меня проблема с сервером вне процесса (.exe). Он успешно зарегистрирован, он отвечает на сигналы контейнера своими слотами, но я не могу заставить сервер испускать сигналы (или заставить контейнер принимать их).
Про файл:
TARGET = object_mkpa
TEMPLATE = app
CONFIG += qt warn_off qaxserver
RC_FILE = qaxserver.rc
DEF_FILE = qaxserver.def
SOURCES += src/object_mkpa.cpp \
src/main.cpp
HEADERS += src/object_mkpa.h
заголовок:
#include <QObject>
#include <QAxBindable>
class Object_mkpa : public QObject, public QAxBindable
{
Q_OBJECT
Q_CLASSINFO("RegisterObject", "yes")
public:
Object_mkpa(QObject* parent = 0 );
public slots:
...
signals:
...
};
источник:
#include "object_mkpa.h"#include <QAxFactory>
Object_mkpa::Object_mkpa(QObject* parent) : QObject(parent) { }
QAXFACTORY_DEFAULT(Object_mkpa, //widget class
"{69dfccf5-697f-497f-8aa9-d1ecfb64c1bf}", //class ID
"{e276cc69-3bf8-4932-b341-bdcb1045901b}", //interface ID
"{60b215f0-7f16-4f79-bac8-6b8d3cb14a00}", //event interface
"{110d3945-cfe7-4ae7-872c-02757e8dde91}", //type library ID
"{88dec6e0-4a5a-4c0b-bcdd-3f18dea9d86d}") //app ID
...
и главное, что на самом деле не является существенным (оно даже выполняется? ..)
#include "object_mkpa.h"#include <QApplication>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
return app.exec();
}
Я протестировал внутрипроцессный сервер (dll) и там работают сигналы, но у него есть другая проблема — он создает экземпляр COM-объекта для каждого контейнера, который использует dll. Я думаю, что так и должно быть (что противоположно тому, что мне нужно), но если вы знаете какой-нибудь взлом — пожалуйста, скажите мне.
разница с внешними процессами заключается в отсутствии main.cpp и немного измененного файла .pro
TARGET = object_mkpa_dll
TEMPLATE = lib
CONFIG += qt warn_off dll qaxserver
RC_FILE = qaxserver.rc
DEF_FILE = qaxserver.def
LIBS += -lQAxServerd
HEADERS += \
object_mkpa_dll.h
SOURCES += \
object_mkpa_dll.cpp
После сборки с использованием собственных шагов сборки qt creator я использую dumpcpp на .exe или .dll и копирую сгенерированные файлы в каталог клиента.
важная часть файла .pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TEMPLATE = app
CONFIG += qaxcontainer
Наконец, вот как я его использую:
object_mkpaLib::Object_mkpa interface; //this is in class declaration
QObject::connect(&interface, SIGNAL(test(int)), SLOT(testTester(int)));
QObject::connect(this, SIGNAL(test(QString)), &interface, SLOT(test2(QString)));
Задача ещё не решена.