Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.14;
Скачать: CL | DM;

Вниз

создание объекта в DLL   Найти похожие ветки 

 
Dmitriy   (2010-08-17 14:39) [0]

Здравствуйте!
Занимаюсь вопросом поддержки плагинов в своем приложении. Интересует, можно ли создать объекты в DLL и использовать их в основном приложении. Если можно, то как?


 
Dennis I. Komarov ©   (2010-08-17 14:55) [1]

длл бывают разные, да и объекты тоже...
и создавать можно, и использовать можно...


 
~AQUARIUS~ ©   (2010-08-17 14:55) [2]

Нельзя, если не использовать пакеты (.bpl). Видите ли, библиотека - это отдельная от исполняемого файла сущность; в ней есть отдельные копии того, что есть в ехе, в том числе и RTTI. Ехе не знает об RTTI библиотеки, и наоборот. Кроме того, если компилировать обе части разными компиляторами, нет гарантии что они сохранят ту же последовательность полей и методов. Плюс остется вопрос, что же делать с компиляторами других языков (например, тот же С++ поддерживает множественное наследование, а в Дельфи такого даже в помине нет. Как прикажете использовать такие обьекты?). Пакеты некоторым образом решают первые две проблемы, а так же некоторые другие, которые появляются при попытке использовать VCL в библиотеке. Но они так же делают очень жесткую привязку к языку и даже к конкретной версии компилятора. Как альтернативу можно еще предложить использовать интерфейсы. Думаю вам интересно будет почитать это: http://www.gunsmoker.ru/2008/12/1.html - очень подробно расписано все что я сказал ранее


 
12 ©   (2010-08-17 14:55) [3]

не стоит так делать лучше, имхо 6)

но как-то раз делал так
create в dll, передаем указатель, по указателю приравниваем
глюков м.б. - много


 
Petr V. Abramov ©   (2010-08-17 15:44) [4]


> Видите ли, библиотека - это отдельная от исполняемого файла
> сущность; в ней есть отдельные копии того, что есть в ехе,
>  в том числе и RTTI. Ехе не знает об RTTI библиотеки, и
> наоборот.

если билдить с рантайм-пакетами, что все прекрасно знает и ничего не глючит, единственно, все созданные в dll объекты должны быть мануально :) уничтожены ДО выгрузки dll, иначе AV при закрытии программы.

с остальным согласен.


 
Германн ©   (2010-08-17 15:46) [5]


> если билдить с рантайм-пакетами, то все прекрасно знает
> и ничего не глючит

Тогда это ничем не лучше bpl.


 
Ega23 ©   (2010-08-17 16:45) [6]


> ~AQUARIUS~ ©   (17.08.10 14:55) [2]
> Нельзя, если не использовать пакеты (.bpl).


Я бы не стал вот так вот совсем категорично утверждать.


 
~AQUARIUS~ ©   (2010-08-17 17:23) [7]


> Ega23
> Я бы не стал вот так вот совсем категорично утверждать.

Мотивируйте. Свои аргументы я привел выше


 
Игорь Шевченко ©   (2010-08-17 17:55) [8]

~AQUARIUS~ ©   (17.08.10 17:23) [7]


> Мотивируйте.


Опыт пойдет в качестве мотива ?


 
Ega23 ©   (2010-08-17 19:50) [9]


> Мотивируйте. Свои аргументы я привел выше


А если я напишу код, где создаю объект некоего класса в рамках DLL, а в основном приложении его спокойно использую, то что мне за это будет?


 
~AQUARIUS~ ©   (2010-08-17 20:04) [10]


> Ega23
> А если я напишу код, где создаю объект некоего класса в
> рамках DLL, а в основном приложении его спокойно использую,
>  то что мне за это будет?

Договоримся ;-) Только условие - приложение - на Дельфи, длл - на С++, класс - с использованием множественного наследования. Идет? ;-)


 
Игорь Шевченко ©   (2010-08-17 20:12) [11]

~AQUARIUS~ ©   (17.08.10 20:04) [10]

И это можно. Описывалось еще со времен Delphi 2


 
~AQUARIUS~ ©   (2010-08-17 20:20) [12]


> Игорь Шевченко ©   (17.08.10 20:12) [11]
> ~AQUARIUS~ ©   (17.08.10 20:04) [10] И это можно. Описывалось
> еще со времен Delphi 2

У меня только один вопрос остается - насколько это стабильно? ;-)


 
Игорь Шевченко ©   (2010-08-17 21:54) [13]

~AQUARIUS~ ©   (17.08.10 20:20) [12]


> У меня только один вопрос остается - насколько это стабильно?
>  ;-)


Я странного не желал, поэтому в 1996 году поверил авторам статей в Dr. Bob"s Journal

Ничего принципиально невозможного не вижу, биты - они независимы от языка.


 
Leonid Troyanovsky ©   (2010-08-17 22:23) [14]


> Игорь Шевченко ©   (17.08.10 21:54) [13]

> Ничего принципиально невозможного не вижу, биты - они независимы
> от языка.

Есть и принципиальные, независимые от языка, msdn.

--
Regards, LVT.


 
Ega23 ©   (2010-08-17 22:37) [15]


> Договоримся ;-) Только условие - приложение - на Дельфи,
>  длл - на С++, класс - с использованием множественного наследования.
>  Идет? ;-)


Сходу: реализуем в dll интерфейс, в приложении его используем.
Может и ещё как, через там объектник какой можно.

Просто хочу напомнить:

> ~AQUARIUS~ ©   (17.08.10 14:55) [2]
>
> Нельзя, если не использовать пакеты (.bpl).


 
~AQUARIUS~ ©   (2010-08-18 21:53) [16]


> Сходу: реализуем в dll интерфейс, в приложении его используем.
> Может и ещё как, через там объектник какой можно.

Да нетушки ;-) Надо именно обьект ;-) В этом собственно и состоит тема спора )


 
Игорь Шевченко ©   (2010-08-18 22:05) [17]

~AQUARIUS~ ©   (18.08.10 21:53) [16]

Ты поищи статью-то. Занятно.


> В этом собственно и состоит тема спора


Спорить не о чем - некоторые объекты можно передавать между DLL и EXE, некоторые нельзя. Нельзя использовать проверку типов, так как переданный объект хранит указатель на отличную от имеющейся в модуле VMT, с памятью надо аккуратно обращаться, еще ряд нюансов есть, например, атомы у контролов разные, глобальные объекты разные, о чем-то сейчас могу не вспомнить, а примеры писать лень.

Но в целом, заявлять, что "ни за что, если не использовать run-time пакетов" хорошо для проповеди, а не для программирования.

Впрочем, и проповеди иной раз полезны :)



Страницы: 1 вся ветка

Текущий архив: 2010.11.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
3-1247562063
ziArt
2009-07-14 13:01
2010.11.14
Сортировка и SQL


15-1280996881
abun
2010-08-05 12:28
2010.11.14
Как программно отследить события


10-1169798225
tytus
2007-01-26 10:57
2010.11.14
ExcelApplication.RemoteMachineName


2-1281521447
unknow
2010-08-11 14:10
2010.11.14
Как избежать повторного ввода данных в базу?


8-1207866845
Olya
2008-04-11 02:34
2010.11.14
Как вырезать часть изображения?