Название: QSocket в DLL Отправлено: Demonn от Январь 26, 2006, 12:34 Добрый день!
Есть необходимость создания dll, которая бы полностью занималась сокетным соединением. Возможно ли это? Дело в том, что когда вызываю функцию, которая должна создать объект QSocket и вернуть на него указатель - программа просто вылетает. DLL пишеться на VC++ 6.0, QT 3.3.3; клиент, который ее использует - на Delphi Название: QSocket в DLL Отправлено: Dendy от Январь 26, 2006, 16:05 Кхммм... Возвращать указатель на сторонний класс - плохой стиль. Советую сделать свой класс, в котором буит скрьІт QSocket или вовсе С-шньІй стиль работьІ с DLL.
Название: QSocket в DLL Отправлено: Demonn от Январь 26, 2006, 16:36 > Dendy
вообще-то так и делается, т.е. вот вырезка. так вот в конструкторе и происходит вылет сразу после создания сокета fSocket = new QSocket(); т.ч. в длл вызывается функция, создающая класс Client и возвращающаяя на него указатель, который будет является одним из параметров других функций этой длл, вот и все, т.ч. в delphi с ним никаких операций проводится не будет class Client : public QObject { Q_OBJECT public: Client(); ~Client(); ............. private: QSocket * fSocket; metadataType fastGetMessageType(const QString & message); void sendConfirmFromXML(xmlParser * xml); void sendErrorXMLFromXML(xmlParser * xml); }; Название: QSocket в DLL Отправлено: Dendy от Январь 26, 2006, 19:31 Как минимум для работьІ собьІтийного механизма нужно ещё создать класс приложения QСoreApplication. Желательно до создания обьекта (хотя мож можна и после). И из основной програмьІ вьІзьІвать периодически QCoreApplication::processEvents(). При завершении работьІ с DLL - прибить QCoreApplicatio::instance().
Если енто вьІшее - интерфейс, то он негадицца. Нуна чёт типа: Код: void init() { new QCoreApplication(); } Попробуй с инициалицазией приложения. Если буит валиться - нуна искать грабли в другом месте. Название: QSocket в DLL Отправлено: Demonn от Январь 27, 2006, 10:45 > Dendy
А что за класс QCoreApplication? В qt 3.3.3 не нашел такого? И чем он отличается от QApplication? Название: QSocket в DLL Отправлено: Dendy от Январь 27, 2006, 12:11 Упссс... отето я намешал. :D Для твоих целей - ето аналог QApplication в Qt3, только без Gui.
Название: QSocket в DLL Отправлено: Demonn от Январь 27, 2006, 16:20 >Dendy
Вот что имеем QApplication * pApp; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { int argc = 0; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: pApp = new QApplication(argc, 0, false); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: pApp->~QApplication(); break; } return TRUE; } этого вполне достаточно, чтобы вызывающее приложение "заморозилось". т.е. контролы не работают, максимум можно перетаскивать по экрану и закрыть. в чем может быть дело? Название: QSocket в DLL Отправлено: Dendy от Январь 27, 2006, 17:00 С DllMain делов не имел. Навскидку: указатель хранить не нужно, он и так есть в глобальной переменной qApp.
Код: pApp->~QApplication(); Перраз вижу такое чудо. Юзай delete qApp. Всё же рекомендую использовать сишньІе функции для инициализации/деинициализации приложения и всех обьектов. Название: QSocket в DLL Отправлено: Racheengel от Январь 27, 2006, 17:14 ИМХО, лучше, когда возможно, чтобы сама Qt все прибивала (посредством parent в конструкторах).
Название: QSocket в DLL Отправлено: Demonn от Январь 27, 2006, 17:26 > Dendy
дело не в чуде, дело в том, почему все "мерзнет"! пусть будет delete pApp, пусть создание QApplication в init'e - дела то не меняет, вызвающее приложение - все контролы недоступны |