Russian Qt Forum
Ноябрь 23, 2024, 21:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSocket в DLL  (Прочитано 6185 раз)
Demonn
Гость
« : Январь 26, 2006, 12:34 »

Добрый день!

Есть необходимость создания dll, которая бы полностью занималась сокетным соединением. Возможно ли это? Дело в том, что когда вызываю функцию, которая должна создать объект QSocket и вернуть на него указатель - программа просто вылетает.

DLL пишеться на VC++ 6.0, QT 3.3.3; клиент, который ее использует - на Delphi
Записан
Dendy
Гость
« Ответ #1 : Январь 26, 2006, 16:05 »

Кхммм... Возвращать указатель на сторонний класс - плохой стиль. Советую сделать свой класс, в котором буит скрьІт QSocket или вовсе С-шньІй стиль работьІ с DLL.
Записан
Demonn
Гость
« Ответ #2 : Январь 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);
};
Записан
Dendy
Гость
« Ответ #3 : Январь 26, 2006, 19:31 »

Как минимум для работьІ собьІтийного механизма нужно ещё создать класс приложения QСoreApplication. Желательно до создания обьекта (хотя мож можна и после). И из основной програмьІ вьІзьІвать периодически QCoreApplication::processEvents(). При завершении работьІ с DLL - прибить QCoreApplicatio::instance().

Если енто вьІшее - интерфейс, то он негадицца. Нуна чёт типа:

Код:
void init() { new QCoreApplication(); }
void uninit() { delete QCoreApplication::instance(); }

void * createSocket() { return new QSocket(); } // return handle to socket
void destroySocket( void * handle ) { delete (QSocket *)handle; }

void doSomething( void * handle, /* params */ )
{
  QSocket * s = (QSocket *)handle;
  // blah blah
}


Попробуй с инициалицазией приложения. Если буит валиться - нуна искать грабли в другом месте.
Записан
Demonn
Гость
« Ответ #4 : Январь 27, 2006, 10:45 »

> Dendy

А что за класс QCoreApplication? В qt 3.3.3 не нашел такого? И чем он отличается от QApplication?
Записан
Dendy
Гость
« Ответ #5 : Январь 27, 2006, 12:11 »

Упссс... отето я намешал. Веселый  Для твоих целей - ето аналог QApplication в Qt3, только без Gui.
Записан
Demonn
Гость
« Ответ #6 : Январь 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;
}

этого вполне достаточно, чтобы вызывающее приложение "заморозилось". т.е. контролы не работают, максимум можно перетаскивать по экрану и закрыть. в чем может быть дело?
Записан
Dendy
Гость
« Ответ #7 : Январь 27, 2006, 17:00 »

С DllMain делов не имел. Навскидку: указатель хранить не нужно, он и так есть в глобальной переменной qApp.

Код:
pApp->~QApplication();


Перраз вижу такое чудо. Юзай delete qApp.

Всё же рекомендую использовать сишньІе функции для инициализации/деинициализации приложения и всех обьектов.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Январь 27, 2006, 17:14 »

ИМХО, лучше, когда возможно, чтобы сама Qt все прибивала (посредством parent в конструкторах).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Demonn
Гость
« Ответ #9 : Январь 27, 2006, 17:26 »

> Dendy
дело не в чуде, дело в том, почему все "мерзнет"! пусть будет delete pApp, пусть создание QApplication в init'e - дела то не меняет, вызвающее приложение - все контролы недоступны
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.