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

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

Страниц: 1 2 [3] 4 5 ... 7   Вниз
  Печать  
Автор Тема: [4.3.0-win] Как быть с dll?  (Прочитано 53465 раз)
Alex Forth
Гость
« Ответ #30 : Июль 29, 2007, 20:43 »

Цитировать

То есть ты мне предлагаешь вернуться к тому, с чего начали??? Я не хочу писать то, что уже написано. Да и зачем тогда это делать в библиотеке? Если уж напишу, то буду юзать сразу по месту требования.

Ты все понял неверно!
Сейчас у тебя есть враппер?  Вот я и предлагаю его:
1) перенести в свою dll
2) Офигенно упростить

ЗЫ: Щас поужинаю и набросаю примерчик такого подхода.

ЗЗЫ: Если не секрет, то зачем тебе эту DLL обязательно подгружать в динамике???

Обещанный пример:
Пусть в чужой библиотеке (A.dll) есть такой класс
Код:

class A
{
...
public:
      A(char*);
     ~A();
      int  foo1(int);
      int  foo2(int);
      int  foo3(int);
}


Делаем свою wrapA.dll c таким классом:
Код:

class WrapA
{
     A*     impl;
public:
      WrapA(char* a)
     {
         impl = new A(a);
     }

      ~WrapA()
      {
         delete impl;
      };

      virtual int  foo1(int a)
      {
          return impl->foo1(a);
      };

      virtual int  foo2(int a)
      {
          return impl->foo2(a);
      };

      virtual int  foo3(int a)
      {
          return impl->foo3(a);
      };
}

//функция спец-враппер для конструктора
WrapA* createWrapA(char* a)
{
  return new WrapA( a );
}


Твоя программа будет иметь дело только с wrapA.dll (Будет ее динамически подгружать и дергать все необходимые методы).
Записан
Icoz
Гость
« Ответ #31 : Июль 31, 2007, 13:29 »

Цитата: "Alex Forth"

Ты все понял неверно!
Сейчас у тебя есть враппер?

Нет. Есть только несколько "свраппеных" функций чисто для теста, как оно работает. Всего в dll порядка 10-15 классов(от 40 до 150 функций в каждом), около 500-700 просто функций. Короче, в pexports мне пишет 3500 с чем-то экспортируемых строк.
Цитата: "Alex Forth"

ЗЗЫ: Если не секрет, то зачем тебе эту DLL обязательно подгружать в динамике???

А как еще? У меня на руках только dll. Lib от нее я сделать так и не смог. В принципе с этого и начиналась эта тема: "как правильно сделать либу?".
Цитата: "Alex Forth"

Обещанный пример:
...
Твоя программа будет иметь дело только с wrapA.dll (Будет ее динамически подгружать и дергать все необходимые методы).

Вопрос: а если у меня все равно будет враппер, то зачем мне его в dll пихать? Или dll у dll сама все выдергивает и мне не надо писать враппер?
По-моему, выхода здесь два:
1) сделать нормальную либу, чтобы не делать враппер
2) сделать враппер, а потом на основе него объект qobject и наследовать далее... И без dll.
Записан
Alex Forth
Гость
« Ответ #32 : Июль 31, 2007, 15:11 »

Цитировать
А как еще? У меня на руках только dll. Lib от нее я сделать так и не смог. В принципе с этого и начиналась эта тема: "как правильно сделать либу?".

Как-то я вначале тебя не понял Грустный ,  думал тебе надо обязательно в динамике грузить.
При таком раскладе надо копать создание библиотеки импорта. По другому тяжелее.
ЗЫ: почитай еще за формат def файла  и посмотри в сторону утилитки c++filt
Записан
Icoz
Гость
« Ответ #33 : Июль 31, 2007, 16:04 »

так. перечитай внимательно всю эту тему. Там уже написано, что я пробовал делать с def-ом. Может чего подскажешь?
утилитку поищу...
Записан
Alex Forth
Гость
« Ответ #34 : Июль 31, 2007, 16:35 »

Цитировать
Там уже написано, что я пробовал делать с def-ом. Может чего подскажешь?

Имена функций наверное по разному заманглены, вот и не работает.
Попробуй сначала сделать тестовую dll с помощью gcc и распотрошить ее c pexport и dlltool.
Записан
Icoz
Гость
« Ответ #35 : Август 05, 2007, 21:48 »

Цитата: "Alex Forth"
Цитировать
Там уже написано, что я пробовал делать с def-ом. Может чего подскажешь?

Имена функций наверное по разному заманглены, вот и не работает.
Попробуй сначала сделать тестовую dll с помощью gcc и распотрошить ее c pexport и dlltool.

Не понял. А причем тут dll на gcc? У меня есть конкретная dll, походу на Delphi. Какое имя он хочет увидеть, линкер пишет. Прочитай подробнее предыдущие посты. Написано тут: http://prog.org.ru/forum/ptopic_26588.html#26588
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #36 : Август 05, 2007, 22:35 »

http://www.softsoft.ru/development/components-libraries/12322.htm

Цитировать

DLL to Lib – это магическая сервисная программа, которая преобразует DLL файл в его эквивалент статичного файла библиотеки. После этого, вы можете переместить настоящий DLL файл с статичным файлом библиотеки, перестроить это приложение и распространять с DLL файлом! Самая важная особенность это то, что процесс обработки не требует каких-либо источников кодов DLL файлов! Все работы происходят из двоичного в двоичный. DLL to Lib интегрируется со многими утилитами, включая "Import Library Reference Information Generator", "Symbol Finder" и т.д. для того, чтобы вы были уверены, что процесс конверсии успешен.



Оно?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Alex Forth
Гость
« Ответ #37 : Август 06, 2007, 09:31 »

Цитата: "Icoz"

Не понял. А причем тут dll на gcc? У меня есть конкретная dll, походу на Delphi. Какое имя он хочет увидеть, линкер пишет.

dll на gcc - это чтобы потренироваться Улыбающийся
Ты в первом посте писал:
Цитата: "Icoz"

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

Отсюда я делаю вывод, что pexport и dlltool dll успешно разобрали, но в библиотеке импорта они сгенерировали некоректные для твоей dll имена. Следовательно, копай в эту сторону.
Записан
Icoz
Гость
« Ответ #38 : Август 06, 2007, 11:13 »

Цитата: "Alex Forth"

Отсюда я делаю вывод, что pexport и dlltool dll успешно разобрали, но в библиотеке импорта они сгенерировали некоректные для твоей dll имена. Следовательно, копай в эту сторону.

Вывод правильный. Как только имена "правильные" и оно компилится, то тут же и не запускается! А пишет, что не найдено!!!
Так что у меня только 2 варианта получилось:
1) не компилится, ибо имя "неправильное"
2) компилится, но не находит функцию, ибо для gcc имя "правильное", а вот винда его в библиотеке не находит! Грустный
Записан
Alex Forth
Гость
« Ответ #39 : Август 06, 2007, 16:30 »

Ищи третий вариант, когда и компилится и запускается Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #40 : Август 07, 2007, 00:08 »

Пробовали утилитку таки?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Icoz
Гость
« Ответ #41 : Август 09, 2007, 12:15 »

нет еще. Никак руки не дойдут.
Записан
Icoz
Гость
« Ответ #42 : Август 11, 2007, 22:16 »

попробовал. Программка конвертит DLL в LIB для статической линковки, а при этом требует некие IMPLIB, откуда он собственно хочет взять то, что я раньше здесь называл "lib для неявного подключения dll к exe".
Кароче, прога делает статическую либу, которую можно будет подцепить так, чтобы dll вообще не была нужна - она внутри exe.
Тогда вопрос, откуда тогда взять IMPLIB?
Точнее мне достаточно просто IMPLIB
PS. Чтобы дальше не было недоразумений по поводу терминологии: IMPLIB - import library, LIB - static library, DLL - dynamic library

ИТАК, мне надо IMPLIB!

добавлено спустя 3 часа:

 Делаю вот так:
Код:
pexports -h include\mapacces.h my.dll > my.def
dlltool -Dmapacces.dll -dmapacces.def -llibmapacces.a -k

Прога компилится, но не запускается, пишет, что не могу найти "mapOpenMap@8". В самой dll лежит просто "mapOpenMap", но gcc ищет при линковке именно "mapOpenMap@8".
Как быть? Как заставить gcc линковать правильно?

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

 Мдя
http://www.geocities.com/yongweiwu/stdcall.htm
Записан
Icoz
Гость
« Ответ #43 : Август 12, 2007, 20:47 »

скрипт на перле для автоматического создания хидера и cpp для враппера уже готов наполовину! Улыбающийся
IMPLIB я так и не смог сделать... gcc упорно ищет func@N вместо func!
А про классы я вообще молчу! Там он такие кракозябры запрашивает!!!
Записан
Alex Forth
Гость
« Ответ #44 : Август 13, 2007, 08:23 »

Для эксперимента была взята первая попавшаяся dll из c:/windows/system32 ею оказалась ALut.dll.
Далее:
Код:

pexports ALut.dll > alut.def

alut.def правлю вручную до состояния:
Код:

LIBRARY ALUT.dll
EXPORTS
alutExit@0 =  alutExit @3
alutInit@0 = alutInit @3
.... и т д согласно правилам именования stdcall ( правда я не понял, почему не нужен символ  "_"? :( )

потом
Код:

dlltool -DALut.dll -dalut.def -llibalut.a

в срр файле пишу так:
Код:

extarn "C" __stdcall void alutInit();

int main(int argc, char** argv)
{
alutInit();
}

Все работает Улыбающийся
Записан
Страниц: 1 2 [3] 4 5 ... 7   Вверх
  Печать  
 
Перейти в:  


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