¿Lo estoy haciendo bien?Usando una DLL basada en Qt en una aplicación que no es Qt
Un cliente mío tiene un grupo en el que estoy desarrollando cosas de servidor-cliente basadas en Qt con muchas cosas divertidas para widgets.
Otro grupo de la empresa desea utilizar una versión empaquetada de las clases de proveedor de datos de cliente basadas en QTcpSocket. (Lo cual hace básicamente lo que suena, proporciona datos del servidor a las pantallas del cliente)
Sin embargo, ese grupo tiene una gran aplicación construida principalmente con MFC, y eso simplemente no va a cambiar pronto. La DLL basada en Qt también carga el retraso para que pueda implementarse sin esta característica en ciertas configuraciones.
Lo tengo funcionando, pero es un poco hacky. Aquí está mi solución en este momento:
El constructor de la clase contenedora DLL llama a QCoreApplication :: instance() para ver si es NULL o no. Si es NULL, se supone que está en una aplicación no Qt, y se crea una instancia QCoreApplication de su propia:
if (QCoreApplication::instance() == NULL)
{
int argc = 1;
char* argv[] = { "dummy.exe", NULL };
d->_app = new QCoreApplication(argc, argv); // safe?
}
else
d->_app = NULL;
A continuación, pondrá en marcha un temporizador ventanas para llamar de vez en cuando 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);
}
La devolución de llamada simplemente llama a la función processEvents() utilizando timerID como un puntero a la instancia de clase. SetTimer() dice que cuando HWND es NULL ignora el ID de tiempo, por lo que parece ser perfectamente válido.
VOID CALLBACK BLAHBLAH_TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
((BLAHBLAH*)idEvent)->processEvents(); // basically just calls d->_app->processEvents();
}
Luego destruyo la instancia de QCoreApplication como la última cosa en el destructor.
BLAHBLAH::~BLAHBLAH()
{
.. other stuff
QCoreApplication* app = d->_app;
d->_app = NULL;
delete d;
if (app != NULL)
delete app;
}
Si la aplicación host desea medir el tiempo de las llamadas a processEvents() en sí, puede pasar 0 en eventTimerInterval para llamar y blahblah :: processEvents() en sí.
¿Alguna idea de esto? Transferir esa aplicación a Qt no es una opción. No es nuestro
Parece que funciona, pero probablemente haya varias suposiciones que se rompen aquí. ¿Puedo simplemente construir una QCoreApplication con argumentos ficticios como ese? ¿La cola de eventos es segura para operar de esta manera?
No quiero que me explote en la cara más tarde. ¿Pensamientos?
estoy recurriendo a hacer esto por mí mismo. Qt 3 aparentemente tenía soporte para crear dlls de plugins - p. Complementos tipo npapi para navegadores basados en safari de cromo y mozilla. Pero eso parece haber sido eliminado de Qt 4. –
¡Gracias por hacer la pregunta! ¿Sabes si este es el mejor enfoque ahora en 4.8 o hay una mejor manera? En realidad, ejecuto un QThread por separado y creo y ejecuto QCoreApplication allí (global argc y argv). QThread no necesita QCoreApplication, solo algunos mensajes a nivel de sistema, como el temporizador, necesitan el despachador. – dashesy