Всем знатокам 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 руб ;)
обычно нельзя смешивать программы/dll Qt собраные разными компиляторами.
если в 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(); // !!!
}
вот хорошая статья про dll в windows: http://www.progz.ru/forum/index.php?showforum=89
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)