Использование библиотеки на основе Qt в не-Qt-приложении

Я делаю это правильно?

У моего клиента есть группа, в которой яЯ разрабатываю основанные на Qt клиент-серверные вещи с множеством забавных вещей для виджетов и сокетов.

Другая группа в компании хочет использовать упакованную версию классов провайдеров клиентских данных на основе QTcpSocket. (Что делает в основном то, на что это похоже, предоставляет данные с сервера на клиентские дисплеи)

Однако у этой группы есть огромное приложение, построенное в основном из MFC, и это просто не изменится в ближайшее время. DLL-библиотека на основе Qt также загружается с задержкой, поэтому ее можно развернуть без этой функции в определенных конфигурациях.

у нас это работает, но этонемного хакерский Вот'Мое решение на данный момент:

Конструктор класса оболочки DLL вызывает QCoreApplication :: instance (), чтобы проверить,S NULL или нет. Если оно'NULL, это предполагаетs в приложении, отличном от Qt, и создает его экземпляр QCoreApplication 's собственной:

if (QCoreApplication::instance() == NULL)
{
    int argc = 1;
    char* argv[] = { "dummy.exe", NULL };
    d->_app = new QCoreApplication(argc, argv);  // safe?
}
else
    d->_app = NULL;

Затем он настроит таймер Windows для периодического вызова processEvents ():

if (eventTimerInterval > 0)
{
    // STATE: start a timer to occasionally process the Qt events in the event queue
    SetTimer(NULL, (UINT_PTR)this, eventTimerInterval, CDatabaseLayer_TimerCallback);
}

Обратный вызов просто вызывает функцию processEvents (), используя timerID в качестве указателя на экземпляр класса. Документы SetTimer () говорят, что когда HWND равен NULL, он игнорирует timerID, так что это выглядит совершенно корректно.

VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    ((BLAHBLAH*)idEvent)->processEvents(); // basically just calls d->_app->processEvents();
}

Затем я уничтожаю экземпляр QCoreApplication как самую последнюю вещь в деструкторе.

BLAHBLAH::~BLAHBLAH()
{
    .. other stuff

   QCoreApplication* app = d->_app;
   d->_app = NULL;
   delete d;
   if (app != NULL)
       delete app;
}

Если хост-приложение желает синхронизировать вызовы самого processEvents (), оно может передать 0 для eventTimerInterval и вызвать BLAHBLAH :: processEvents ().

Есть мысли по этому поводу? Портирование этого приложения на Qt не вариант. Это'не наши.

Кажется, это работает, но, возможно, здесь нарушено несколько предположений. Могу ли я просто создать QCoreApplication с фиктивными аргументами, подобными этому? Безопасно ли работать таким образом в очереди событий?

Я нене хочу, чтобы это взорвалось мне в лицо позже. Мысли?

Ответы на вопрос(2)

Ваш ответ на вопрос