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

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

Страниц: [1] 2 3 ... 7   Вниз
  Печать  
Автор Тема: [4.3.0-win] Как быть с dll?  (Прочитано 53407 раз)
Icoz
Гость
« : Июль 27, 2007, 08:14 »

У меня есть dll, в которой объявлены несколько сотен функций и с десяток классов. Есть хидеры к ней.
Вопрос: как из dll сделать lib? Причем так, чтобы его ел mingw(там вроде нужно дополнительное конвертирование *.lib -> *.a)?
Делал так:
Код:
pexport -o my.dll > my.def
dlltool -dmy.def -Dmy.dll -lmy.a -A -p_imp

не помогает. Причем с -p (прописывание алиасов с префиксами) перепробовал по разному! Так хотя бы компилируется (после подправления ручками def-файла), но при запуске пишет, что функция такая-то не найдена по пути "..." и прочее...

PS. Очень хочется подключить данную dll статически, ибо тогда смогу заюзать классы, а не писать их реализацию самому...
PPS. Либо может кто расскажет, как из библиотеки подгрузить класс динамически с помощью QLibrary?
Записан
Alex Forth
Гость
« Ответ #1 : Июль 27, 2007, 09:21 »

Цитата: "Icoz"

PS. Очень хочется подключить данную dll статически, ибо тогда смогу заюзать классы, а не писать их реализацию самому...

DLL статически не подключаются! Файл библиотеки импорта для dll и файл статической библиотеки имеют одинаковые расширения, но на этом их сходство заканчивается.

Цитата: "Icoz"

PPS. Либо может кто расскажет, как из библиотеки подгрузить класс динамически с помощью QLibrary?

Так, как это написанно в хелпе по QLibrary.
Записан
Icoz
Гость
« Ответ #2 : Июль 27, 2007, 10:20 »

Цитата: "Alex Forth"
Цитата: "Icoz"

PS. Очень хочется подключить данную dll статически, ибо тогда смогу заюзать классы, а не писать их реализацию самому...

DLL статически не подключаются! Файл библиотеки импорта для dll и файл статической библиотеки имеют одинаковые расширения, но на этом их сходство заканчивается.

Хорошо, объясню иначе.
Функции из dll можно импортировать статически, а можно - динамически!
Статически это подключить lib-ку, а динамически - через LoadMoule и GetProcAddress(для winapi) или через QLibrary! Динамически классы не подрубаются. По крайней мере сколько я не искал по форумам, то так никто подрубить и не смог... Грустный
А то, про что вы говорите - это динамическая(dll) и статическая(когда библиотека целиком впихивается в exe-шник) линковки.
Записан
Alex Forth
Гость
« Ответ #3 : Июль 27, 2007, 10:49 »

Тогда посмотри доки/примеры по QPluginLoader
Записан
Icoz
Гость
« Ответ #4 : Июль 27, 2007, 13:22 »

Цитата: "Alex Forth"
Тогда посмотри доки/примеры по QPluginLoader

Plugin - это плагин! С ними я хорошо знаком, писал их уже несколько раз. Там идет специальный интерфейс qt, чтобы она могла спокойно все из dll подергать! Такого интерфеса в этой dll нету. Были бы сорцы dll без вопросов их каким-угодно способом подцепил. А так - dll сторонняя, а юзать надо.
Записан
Alex Forth
Гость
« Ответ #5 : Июль 27, 2007, 13:31 »

Можно сделать враппер на основе плагина. Правда тогда будет 2 dll но нужная функциональность будет достигнута.
Дергать напрямую методы из той самой первой dll конечно можно, но мне влом даже описывать все те приседания, которые при этом прийдеться делать.
Записан
Icoz
Гость
« Ответ #6 : Июль 27, 2007, 13:40 »

И вообще, народ, вас немного не туда понесло... Это не проблема qt, а скорее mingw

добавлено спустя 2 минуты:

 
Цитата: "Alex Forth"
Можно сделать враппер на основе плагина. Правда тогда будет 2 dll но нужная функциональность будет достигнута.
Дергать напрямую методы из той самой первой dll конечно можно, но мне влом даже описывать все те приседания, которые при этом прийдеться делать.

Не понял. Поподробнее, если можно...
Записан
Alex Forth
Гость
« Ответ #7 : Июль 27, 2007, 13:44 »

Спасибо за множественное число по отношению к моей скромной персоне Улыбающийся
Это не проблема mingw. Это скорее проблема самих dll. Дело в том, что dll хранит пары:  текстовый ключь - ядрес в памяти. При этом адрес пожет соответствовать переменной, функции, методу класса.... но сразу классу соответствовать не может. Тут разные уровни абстракций - в C++ класс - это неделимая единица, а в dll - это набор методов. Вот по этой причине динамическая загрузка dll с классом сопряжена с многими трудностями.

Цитировать
Не понял. Поподробнее, если можно...

Делаешь класс-посредник, интерфейс которого на все 100% соответствует целевому классу из dll, а с другой стороны этот класс является qt плагином. Dll плагина использует первоначальную dll  классическим методом.

Типа так
Код:

class ClassFromDLL
{
...
public:
int A();
int B();
...
}

class MyWrapper
{
    Q_OBJECT
     Q_INTERFACES(MyWrapperInterface)
  private:
  ClassFromDLL* instance;

public:
 virtual int A()
{
   return instance->A();
};
 virtual int B()
{
   return instance->B();
};

}
Записан
Icoz
Гость
« Ответ #8 : Июль 27, 2007, 13:52 »

Если я правильно понял, то в этом враппере мне все равно надо будет реализовывать функционал тех классов из dll и импортить нужные функции через qlibrary....
Но мне лень. Там большой объем работы! Должен же быть способ для нормального импорта инфы из библиотеки

добавлено спустя 3 минуты:

 
Цитата: "Alex Forth"

Делаешь класс-посредник, интерфейс которого на все 100% соответствует целевому классу из dll

То есть. Написать с нуля реализацию класса, пользуясь простыми функциями?
Цитата: "Alex Forth"

а с другой стороны этот класс является qt плагином. Dll плагина использует первоначальную dll  классическим методом.

Как же он тогда ее использует? Скажи этот классический метод и я придумаю, как обойтись без плугина! Подмигивающий
Записан
Alex Forth
Гость
« Ответ #9 : Июль 27, 2007, 13:52 »

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

Классический метод - это загрузка dll во время старта твоего приложения с помощью загрузчика ситемы. ТОесть это то, от чего ты пытаешся уйти

ЗЫ: если владеешь скриптовыми языками, то можно кодогенератор написать. На входе он будет принимать хидер, с которым поставляется твоя DLL, а на выходе будет выдавать исходники врапера. Это вполне реальная штука. Во врапере весь код однообразен. Непосредственное вмешательство человека потребуется в редких случаях
Записан
Icoz
Гость
« Ответ #10 : Июль 27, 2007, 14:11 »

знаешь, для меня классический метод - это подрубить хидер, в файл *.pro добавить:
LIB += mylib
которая потом станет ключом -lmylib для псс
И ВСЕ!
Записан
Alex Forth
Гость
« Ответ #11 : Июль 27, 2007, 14:18 »

Цитата: "Icoz"
знаешь, для меня классический метод - это подрубить хидер, в файл *.pro добавить:
LIB += mylib
которая потом станет ключом -lmylib для псс
И ВСЕ!

Именно это я и имел ввиду Улыбающийся
Записан
SABROG
Гость
« Ответ #12 : Июль 27, 2007, 14:18 »

Писал как-то wrapper для mysql dllки, которая была собрана на MSVC, а юзать я ее должен был на BCB. Занятие нудное и долгое. implib помогает не всегда.
Записан
Icoz
Гость
« Ответ #13 : Июль 27, 2007, 14:20 »

Цитата: "Alex Forth"

Не реализовывать, а вызывать.

Вот я и спрашиваю, как вызывать? У меня в dll лежит класс, который реализует свою работу на основе сотен функций, которые лежат в ней же.
Динамически через qlibrary я могу вызывать только эти сотни функций, ЗНАЧИТ я должен буду реализовать работу этого класса сам. Более того, мне сильно не улыбается руками писать сотни описаний функций типа:
Код:

typedef struct1* (*myfunc1)(int param1, char * param2);
....
typedef struct1* (*myfuncN)(int param1);


Цитата: "Alex Forth"

Текста конечно много прийдется натоптать Грустный

ЗЫ: если владеешь скриптовыми языками, то можно кодогенератор написать. На входе он будет принимать хидер, с которым поставляется твоя DLL, а на выходе будет выдавать исходники врапера. Это вполне реальная штука. Во врапере весь код однообразен. Непосредственное вмешательство человека потребуется в редких случаях

Владею, только класс можно генерить, имея какие-то данные, у меня же только дока(в ворде), а как из этой доки выдирать объявления функций я себе плохо представляю. Опять же руками? Тогда и скрипт не нужен... Только если для адаптации.

добавлено спустя 35 секунд:

 
Цитата: "SABROG"
Писал как-то wrapper для mysql dllки, которая была собрана на MSVC, а юзать я ее должен был на BCB. Занятие нудное и долгое. implib помогает не всегда.

ВСВ - это что?

добавлено спустя 45 секунд:

 C++ Builder что ли?
Записан
Alex Forth
Гость
« Ответ #14 : Июль 27, 2007, 14:21 »

Хидеры для использования dll-ки есть? Без них дело совем плохо.

Плагин с dll-кой связываешь классически. Приложение имеет дело только с плагином.
Записан
Страниц: [1] 2 3 ... 7   Вверх
  Печать  
 
Перейти в:  


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