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

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

Страниц: 1 ... 3 4 [5] 6 7   Вниз
  Печать  
Автор Тема: [4.3.0-win] Как быть с dll?  (Прочитано 53376 раз)
Icoz
Гость
« Ответ #60 : Сентябрь 09, 2007, 17:28 »

так скачай новую версию либы, я там посмотрел у них даже qt проскакивает, за общайся с авторами... может они тебе помогут?
Не понял:
1) Скачать новую версию DeDe? Или моей либы, которую пытаюсь распотрошить?
2) Авторы опять же DeDe или моей либы? Если авторами моей либы - то нет, пробовали уже. Дохлый номер, народ пытается нам тупо втюхать другой свой продукт. Нам же надо работать с ЭТОЙ dll. Так что обновить версию ее невозможно.
Записан
Icoz
Гость
« Ответ #61 : Сентябрь 16, 2007, 21:19 »

поднимаю наверх, проблема не решена.
Записан
Tonal
Гость
« Ответ #62 : Сентябрь 17, 2007, 05:39 »

Создай новую тему, опиши в краце что хочешь сделать и что не получается.
А то искать среди 5и страниц что же тебе надо как-то в лом. ;-)
Записан
Icoz
Гость
« Ответ #63 : Сентябрь 17, 2007, 13:45 »

Вкратце не выйдет! Тем более мне опять напишут те самые 5 страниц, что можно сделать!
Так ты хоть ознакомишься с тем, что предложили, проверили и отвергли.

А суть проблемы: надо в винде подключить dll к проге. Есть dll, есть хидеры, к ней НЕТ lib (import library).
QLibrary отпадает, ибо там куча классов. Всего порядка 3500 экспортируемых функций.
Подробнее читай предыдущие посты
Записан
Icoz
Гость
« Ответ #64 : Сентябрь 23, 2007, 16:25 »

еще раз поднимаю.
Проблема все еще имеется в наличии
Записан
Tonal
Гость
« Ответ #65 : Сентябрь 23, 2007, 18:23 »

Если компилишь mingw и либа слинкована им же, или имеет только С экспорты - можно просто указать её в списке либ.
Если нет - то всё сильно зависит от...
Записан
Icoz
Гость
« Ответ #66 : Сентябрь 24, 2007, 19:57 »

Почитай посты в самом начале (штуки 3-4) и 3-5 с конца, чтобы достаточно вникнуть в проблему.
Dll сделана в borland'е, скорее всего Borland C++ 5.02. ImpLib к ней нету.
Надо ее подрубить к проге.
Записан
Tonal
Гость
« Ответ #67 : Сентябрь 24, 2007, 20:35 »

Если используется экспорт классов, то напрямую подрубить - дохлый номер.
Проще сделать так:
1) Найти компилятор, которым это чудо собрано.
2) Собрать им dll-переходник которая импортирует твою, а экспортирует чистый С-ишный апи.
3) Подцепить переходник из мингвы.

В принципе, вместо/вместе с чистым С, если согласовать выравнивания, можно обмениваться интерфейсами. Я так делал.

Можно ещё COM прикрутить, но это уже для мазахистов, т.к. ни для багланда ни для мингвы нормальных лёгких библиотек нету... Подмигивающий

P.S. насчёт DeDe - бред. Подмигивающий
Записан
Icoz
Гость
« Ответ #68 : Сентябрь 25, 2007, 19:24 »

Если используется экспорт классов, то напрямую подрубить - дохлый номер.
Читай выше, кое-что подрубается. Через QLibrary я смог поштучно подрубать все функции класса, явно передавая в них (обычно неявный) указатель this. Слишком тяжело, ибо там 10-15 классов крупных (по 100-150 функций) и с десяток помельче (10-30 функций). Руками анрил, после скрипта все равно много работы.

Проще сделать так:
1) Найти компилятор, которым это чудо собрано.
2) Собрать им dll-переходник которая импортирует твою, а экспортирует чистый С-ишный апи.
3) Подцепить переходник из мингвы.
Допустим проблему с 1 и 3 я решу. А про п.2 по-подробнее рассказать можешь? Пример кода что ли?...
Скажем для класса(только с условием, что там по 100-150 функций... как-то по рациональней что ли...):
Код:
class Test{
public:
int func1(int,double);
void func2(int) inline; // или как там? короче с инлайн функциями
};
Записан
Tonal
Гость
« Ответ #69 : Сентябрь 26, 2007, 06:57 »

Если используется экспорт классов, то напрямую подрубить - дохлый номер.
Читай выше, кое-что подрубается. Через QLibrary я смог поштучно подрубать все функции класса, явно передавая в них (обычно неявный) указатель this. Слишком тяжело, ибо там 10-15 классов крупных (по 100-150 функций) и с десяток помельче (10-30 функций). Руками анрил, после скрипта все равно много работы.
А кто сказал, что функции из дллки выдернуть незя?
А вот глюков при этом  отловить - запросто. Самые очевидные:
1) Если есть исключения - будет глючить.
2) Если память выделяется в разных модулях - будет глючить (например память выделилась в обычной функции а удалилась в инлайне)
3) Если попытаешся отнаследоваться - будет глючить.
4) Если будешь использовать dynamic_cast - будет глючить.
5) Если в параметрах/возвратах используются не только POD типы - будет глючить.
Это только на вскидку...

Теоретически, всё это можно разрулить...
Практически - я бы взялся, за "многа денгаф" и без каких-либо гарантий. ;-)

2) Собрать им dll-переходник которая импортирует твою, а экспортирует чистый С-ишный апи.
Допустим проблему с 1 и 3 я решу. А про п.2 по-подробнее рассказать можешь? Пример кода что ли?...
Скажем для класса(только с условием, что там по 100-150 функций... как-то по рациональней что ли...):
Код:
class Test{
public:
int func1(int,double);
void func2(int) inline; // или как там? короче с инлайн функциями
};
Довольно просто.
Заголовок будет выглядеть так:
Код:
extern "C" {
typedef void* HTest;
HTest test_create();
void test_destroy(HTest);
int test_func1(HTest, int, double);
void test_func2(HTest, int);
}
Реализация - тривиально.

Если объем классов очень уж большой, то можно нарисовать скриптик (python, perl, ets) который по исходному заголовочнику быстро соорудит заготовку. Дальше допиливаешь неоднозначности, разруливаешь перегрузки, и собираешь.
Записан
Icoz
Гость
« Ответ #70 : Сентябрь 26, 2007, 21:47 »

Если объем классов очень уж большой, то можно нарисовать скриптик (python, perl, ets) который по исходному заголовочнику быстро соорудит заготовку. Дальше допиливаешь неоднозначности, разруливаешь перегрузки, и собираешь.
Хидеры у меня родные есть, только не помогают.
Пока так и делаю, только скрипт написать так, чтобы он прямо по хидеру работал, для меня тяжко (там парсер нехилый нужен). Поэтому я сначала руками специально готовлю хидер (что тоже тяжко, ибо хидеры почти полметра весят! их там файлов 40-45), чтобы его кушал мой скрипт.
Так что, к сожалению, ты мне ничего нового (кроме как обширный список глюков) не сказал.

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

Есть ли способ получить implib для этой dll?
Записан
Tonal
Гость
« Ответ #71 : Сентябрь 27, 2007, 06:27 »

Яж таби и объясняю, что подрубить можно, но работать оно не будет.
Никакой implib не спасёт, т.к. глюки лезут от несовместимости внутренних механизмов разных компиляторов.

Единственное, что можно сделать, это нарисовать б/м "умный" набор скриптов.

P.S. Ещё можно подождать до выхода следующего стандарта С++, или лучше послеследующего. Там вопросам совместимости некоторое внимание начали уделять. ;-)
Записан
Icoz
Гость
« Ответ #72 : Сентябрь 27, 2007, 12:43 »

Смешно. Грустный Меня начальство уже сейчас трясет...  В замешательстве
Записан
Icoz
Гость
« Ответ #73 : Октябрь 16, 2007, 23:16 »

UP Улыбающийся
Записан
T800
Гость
« Ответ #74 : Октябрь 17, 2007, 00:11 »

Единственный реальный способ когда все будет работать -
1. Создать в том же компиляторе на котором написана библиотека либ-файл по принципу - заколовок  плюс .cpp в котором все методы есть но они пустые.
2. Создать СOM+ библиотеку врапперов всего чего там есть НА ТОМ ЖЕ КОМПИЛЯТОРЕ
3. А вот с помощью ее MIDL-ов пользоваться этими COM-бъектами уже из под той среды, что тебе нужна.
Очень много работы и без скриптов  не обойдешся (займет  при том объеме который заявлен порядка квартала в одиночу плюс съеденный бессонницей мозг)
Большой минус такой реализации - потеря быстродейсвия
Записан
Страниц: 1 ... 3 4 [5] 6 7   Вверх
  Печать  
 
Перейти в:  


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