crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> динамическая загрузка Qt dll-библиотеки в filename.exe проекте собранном в VisualStudio 2008
ssdmt
  опции профиля:
сообщение 9.11.2009, 10:43
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.11.2009
Пользователь №: 1214

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем знатокам Qt однозначно привет!!! ))

Входные данные:
-------------------------
первое - у меня есть проект dll библотеки в Qt.
второе - в этой dll экспортируется ф-ия
extern "С" CMyClass* CreateDynamicMyClass(); ,которая динамически создаёт класс CMyClass
третье - этот класс(CMyClass) наследуется от QTcpServer и имеет СИГНАЛЫ и СЛОТЫ, т.е. макрос Q_OBJECT ;)
четвёртое - если filename.exe(тестовый проект без QCoreApplication - ПОЛНОСТЬ ГОЛЫЙ только LoadLibrary и GetProcAddress, console applic.)
компилирую gcc, функция CreateDynamicMyClass() возвращает объект CMyClass и
из него отрабатывает метод start()
пример: CMyClass* class = dll->CreateDynamicMyClass(); // думаю мысль понятна :)
class->start(); // ВСЁ ОТРАБАТЫВАЕТ КОРРЕКТНО!!!
пятое - если filename.exe скомпилировать в Visual Studio 2008(так же полность "голый"), то всё - при вызове class->start() .. start имеет адресс по которому нельзя обратиться - код ошибки 5! ..

ВОПРОСЫ:
- кто нибудь сталкивался с такой ситуацией? почему таблица виртальных функций слетает?? в Visual Studio?

P.S. не предлагать компилить в gcc, так как проект сам в Visual Studio и собрать его с помощью gcc просто нереально :( ... идея моя в том, чтобы сделать dll-qt библиотеку в которая даёт класс для работы с сокетами! для VisualStudio проекта! .. вот

кто поможет на сотыч кину 200 руб ;)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.11.2009, 11:22
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


обычно нельзя смешивать программы/dll Qt собраные разными компиляторами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssdmt
  опции профиля:
сообщение 9.11.2009, 11:29
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.11.2009
Пользователь №: 1214

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 9.11.2009, 13:22) *
обычно нельзя смешивать программы/dll Qt собраные разными компиляторами.


ваще капец
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DmP
  опции профиля:
сообщение 9.11.2009, 12:01
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 61
Регистрация: 11.3.2008
Пользователь №: 116

Спасибо сказали: 15 раз(а)




Репутация:   2  


Цитата(ssdmt @ 9.11.2009, 11:29) *
ваще капец

Из библиотеки экспортируй Сишные функции типа:
extern "С"
{
void* CreateClass();
void RunClass(void*);
}
Должно работать.

Сообщение отредактировал DmP - 9.11.2009, 12:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ssdmt
  опции профиля:
сообщение 9.11.2009, 12:39
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 9.11.2009
Пользователь №: 1214

Спасибо сказали: 0 раз(а)




Репутация:   0  


если в dll я сделаю видимыми ф-ии уже логики класса, то это будет неверно идеологически, нафик оно через одно место опять-то нужно? :) ведь хотели как лучше ... патаму есть тока одна ф-ия CreateMyClass(), а вот из него уже через абстрактный и тягаю нужную бизнесс-логику :), а вот она то как раз(ф-ии класса) и не хачит отрабатывать если filename.exe собрано в visual studio... балян-калян.

вот как оно полное выглядит(очень приближённо):

[b]Interface.h[/b]

class IServer
{
    virtual void Start() = 0;
}

[b]Server.h (dll)[/b]
#include "IServer.h"
class CServer : public IServer
{
   void Start();
}

[b]Server.cpp[/b]
#include "Server.h"
void CServer::Start()
{
    printf("Ура товарищи!!!");
}

[b]xxx.h[/b]
#include "IServer.h"
extern "C" IServer*    __declspec(dllexport) Create_Server_ClassInstance();

[b]xxx.cpp[/b]
#include "main.h"
#include <windows.h>
IServer* __declspec(dllexport) Create_Server_ClassInstance()
{
    return new CServer;
}

/////////////////////////////////////////////////////////////////////////////
[b]main.cpp[/b]  - это либо в [b]gcc.exe[/b] либо в [b]cl.exe[/b](MS VS2008)
#include "IServer.h"
// куча других инклудов;)

void main()
{
    MODULE dll = LoadLibrary("xxx.dll");
    
     typedef IServer* (*pCreateClass)();
             pCreateClass Create = NULL;
    
     IServer* pServer = NULL;
    
     HMODULE dll = LoadLibrary("xxx.dll");
     Create  = (pCreateClass)GetProcAddress(dll, "Create_Server_ClassInstance");
    
     pServer = Create();
    
     // вот тут после gcc Всё идёт после  VS2008 валится
     pServer->Start(); // !!!
    
    
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DmP
  опции профиля:
сообщение 9.11.2009, 13:02
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 61
Регистрация: 11.3.2008
Пользователь №: 116

Спасибо сказали: 15 раз(а)




Репутация:   2  


Цитата(ssdmt @ 9.11.2009, 12:39) *
если в dll я сделаю видимыми ф-ии уже логики класса, то это будет неверно идеологически

Не обязательно делать видимой логику. Можно сделать структуры в нее засунуть все сишные обертки над абстрактным классом IServer, саму структуру засунуть в что то типа #pragma pack, и клиенту возвращать ссылку на эту таблицу, тогда будет некая гарантия что все сойдется и ошибок не будет.

Сообщение отредактировал DmP - 9.11.2009, 13:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rnd
  опции профиля:
сообщение 9.11.2009, 21:45
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 54
Регистрация: 22.7.2009
Пользователь №: 930

Спасибо сказали: 1 раз(а)




Репутация:   0  


вот хорошая статья про dll в windows: ссылка
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.6.2020, 6:08