crossplatform.ru

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


  Ответ в динамическая загрузка Qt dll-библиотеки в filename.exe проекте собранном в VisualStudio 2008
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
rnd Дата 9.11.2009, 21:45
  вот хорошая статья про dll в windows: ссылка
DmP Дата 9.11.2009, 13:02
 
Цитата(ssdmt @ 9.11.2009, 12:39) *
если в dll я сделаю видимыми ф-ии уже логики класса, то это будет неверно идеологически

Не обязательно делать видимой логику. Можно сделать структуры в нее засунуть все сишные обертки над абстрактным классом IServer, саму структуру засунуть в что то типа #pragma pack, и клиенту возвращать ссылку на эту таблицу, тогда будет некая гарантия что все сойдется и ошибок не будет.
ssdmt Дата 9.11.2009, 12:39
  если в 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, 12:01
 
Цитата(ssdmt @ 9.11.2009, 11:29) *
ваще капец

Из библиотеки экспортируй Сишные функции типа:
extern "С"
{
void* CreateClass();
void RunClass(void*);
}
Должно работать.
ssdmt Дата 9.11.2009, 11:29
 
Цитата(Litkevich Yuriy @ 9.11.2009, 13:22) *
обычно нельзя смешивать программы/dll Qt собраные разными компиляторами.


ваще капец
Litkevich Yuriy Дата 9.11.2009, 11:22
  обычно нельзя смешивать программы/dll Qt собраные разными компиляторами.
ssdmt Дата 9.11.2009, 10:43
  Всем знатокам 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 руб ;)

Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 1.8.2025, 0:00