Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

Экспорт / импорт (dll) функций из класса   Найти похожие ветки 

 
parovoZZ ©   (2006-06-27 05:35) [0]

К примеру, запись
exports
TMyClass.myFunc name "MyFunc";

ошибочна. А как быть?


 
atruhin ©   (2006-06-27 06:17) [1]

Создать процедуры "обертки"
function CreateClass : TMyClass;
....
function myFunc(Class : TMyClass) : .....
begin  
 result := Class.myFunc;
end;
......
procedure DestroyClass(Class : TMyClass);
....


 
Amoeba ©   (2006-06-27 12:07) [2]

Следует заметить, что одноименные классы в DLL и основной программе будут (если компилировались без пакетов) "разными", т.е. будут иметь не общую, а разные VMT.


 
parovoZZ ©   (2006-06-27 16:35) [3]


> Создать процедуры "обертки"function CreateClass : TMyClass;
> ....function myFunc(Class : TMyClass) : .....begin    result
> := Class.myFunc;end;......procedure DestroyClass(Class :
>  TMyClass);

Хм, я так и думал. Тогда классы в dll мало чего дают.


 
Игорь Шевченко ©   (2006-06-27 16:51) [4]


> Хм, я так и думал. Тогда классы в dll мало чего дают.


Классы много чего дают в bpl


 
Romkin ©   (2006-06-27 17:53) [5]

А еще больше дает ActiveX library :-Р


 
Пусик ©   (2006-06-27 21:00) [6]


> parovoZZ ©   (27.06.06 16:35) [3]
> > Создать процедуры "обертки"function CreateClass : TMyClass;
> > ....function myFunc(Class : TMyClass) : .....begin    result
> > := Class.myFunc;end;......procedure DestroyClass(Class
> :>  TMyClass);Хм, я так и думал. Тогда классы в dll мало
> чего дают.


Как и везде, классы дают именно то, для чего предназначены - преимущества ООП.


 
Leonid Troyanovsky ©   (2006-06-27 21:40) [7]


> Пусик ©   (27.06.06 21:00) [6]

> Как и везде, классы дают именно то, для чего предназначены


Для работы в dll классы не предназначены.
Потому как dll есть совершенно особый вид PE, не ориентированный
на объектную модель. За исключением специальных случаев,
упомянутых ранее [4, 5].

--
Regards, LVT.


 
Пусик ©   (2006-06-27 21:42) [8]


> Leonid Troyanovsky ©   (27.06.06 21:40) [7]
> > Пусик ©   (27.06.06 21:00) [6] > Как и везде, классы дают
> именно то, для чего предназначены Для работы в dll классы
> не предназначены.


Это нужно понимать так, что в DLL не рекомендуется использовать ООП?


 
Leonid Troyanovsky ©   (2006-06-27 21:52) [9]


> Пусик ©   (27.06.06 21:42) [8]

> Это нужно понимать так, что в DLL не рекомендуется использовать
> ООП?


[4] - для дельфийского применения (однако, bpl "приивязаны" к exe).
[5] - универсально (ес-но, с недельфийской объектной моделью).

--
Regards, LVT.


 
Шпиён   (2006-06-27 23:51) [10]


> Leonid Troyanovsky ©   (27.06.06 21:40) [7]
>
>
> Для работы в dll классы не предназначены.


Ж%-О Не понял....


 
Leonid Troyanovsky ©   (2006-06-27 23:59) [11]


> Шпиён   (27.06.06 23:51) [10]

> > Для работы в dll классы не предназначены.

> Ж%-О Не понял....


Дык, не стесняйся, спрашивай.

--
Regards, LVT.


 
Шпиён   (2006-06-28 00:10) [12]


> Leonid Troyanovsky ©   (27.06.06 23:59) [11]

Так и спрашиваю.... что такого особенного в классах, что противопоказано для dll (если, конечно, не экспортировать их оттуда)???


 
Leonid Troyanovsky ©   (2006-06-28 00:23) [13]


> Шпиён   (28.06.06 00:10) [12]

> Так и спрашиваю.... что такого особенного в классах, что
> противопоказано для dll (если, конечно, не экспортировать
> их оттуда)???


А если их не экспортировать оттуда, т.е., если можно
обмениваться лишь простыми (необъектными) типами,
то, нет никакой нужды в использовании этих объектов.
Особенно - VCL, не рассчитанной на работу в dll.

--
Regards, LVT.


 
Шпиён   (2006-06-28 01:25) [14]

Ну не знаю. Если мне для решения задачи удобнее использовать классы - я все равно их использую, кошерно это или нет. А если обоснованно потребуется goto - использую goto...кто бы что об этом ни говорил.
ps А причем тут VCL? ООП, imho, все же нечто большее, чем VCL...


 
Leonid Troyanovsky ©   (2006-06-28 06:49) [15]


> Шпиён   (28.06.06 01:25) [14]

> Ну не знаю. Если мне для решения задачи удобнее использовать
> классы - я все равно их использую


Пример удобного использования объекта в dll в студию, плиз.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-06-28 06:52) [16]


> Шпиён   (28.06.06 01:25) [14]

> ps А причем тут VCL? ООП, imho, все же нечто большее, чем
> VCL...


"Особенно - VCL" = "для некоторой (особой) части ООП".

--
Regards, LVT.


 
Пусик ©   (2006-06-28 09:33) [17]


> Leonid Troyanovsky ©   (28.06.06 06:49) [15]
> Пример удобного использования объекта в dll
> в студию, плиз.


Да примеров полно.

- Класс-наследник TStrings с дополнительными функциями поиска файлов, обработки(например, копирования).
- Специализированные классы-обертки Winsock.

Продолжать список бессмысленно, так спектр возможных задач настолько широк, насколько широки вообще потребности в ЛЮБЫХ программах.

Говорить о том, что ООП не предназначено для использования в DLL - то же самое, что говорить, будто бензин предназначен только для использования в мотоциклах.


 
Fay ©   (2006-06-28 09:47) [18]

2 Пусик ©   (28.06.06 9:33) [17]
> Да примеров полно.

Не вижу ни одного примера. Только декларация их существования.


 
Шпиён   (2006-06-28 09:48) [19]


> Leonid Troyanovsky ©   (28.06.06 06:49) [15]
>
>
> Пример удобного использования объекта в dll в студию, плиз.
>


Пример:
Дано:
1) "Сторонний" (соседнего отдела) скриптовый интерпретатор с поддержкой плагинов-расширений (в виде подключаемых dll).
2) Готовые и отлаженные smpp-компоненты (другой разработчик).

Задача: Создать плагин для реализации "скриптового" smpp-клиента.


 
Игорь Шевченко ©   (2006-06-28 09:48) [20]


> Говорить о том, что ООП не предназначено для использования
> в DLL - то же самое, что говорить, будто бензин предназначен
> только для использования в мотоциклах.


До тех пор, пока ООП присутствует внутри DLL и не вылезает наружу о каком-то использовании его говорить не стоит. Мало ли, что там у DLL внутри.


 
Пусик ©   (2006-06-28 10:22) [21]


> Игорь Шевченко ©   (28.06.06 09:48) [20]
>До тех пор, пока
> ООП присутствует внутри DLL и не вылезает наружу о каком-
> то использовании его говорить не стоит.


Так все же, используется ООП внутри DLL или не используется?

Если его нельзя/не рекомендуется использовать, то почему?
Если же ООП в DLL используется, то почему нельзя говорить об этом? Это секретная информация?


 
Пусик ©   (2006-06-28 10:22) [22]


> Fay ©   (28.06.06 09:47) [18]
> 2 Пусик ©   (28.06.06 9:33) [17]> Да примеров полно.Не вижу
> ни одного примера. Только декларация их существования.


Практическую реализацию я оставлю на твое усмотрение.


 
Пусик ©   (2006-06-28 10:23) [23]

Удалено модератором
Примечание: Offtopic


 
Fay ©   (2006-06-28 10:30) [24]

Удалено модератором
Примечание: Offtopic


 
Игорь Шевченко ©   (2006-06-28 10:31) [25]

Пусик ©   (28.06.06 10:22) [21]

Дело в том, что DLL не является чем-то самостоятельным. С точки зрения программы, использующей DLL, DLL представляет только набор процедур, которые надо вызывать, поэтому как реализованы внутренности DLL, программе неинтересно. Вот в C++, например, можно в DLL объявить базовые классы и в основной программе наследоваться от них, здесь уже можно говорить про ООП с использованием DLL. Тоже самое с пакетами в Delphi.


 
Fay ©   (2006-06-28 10:35) [26]

2 Leonid Troyanovsky ©   (27.06.06 21:52) [9]
> однако, bpl "приивязаны" к exe
В смысле?


 
Игорь Шевченко ©   (2006-06-28 10:37) [27]

Fay ©   (28.06.06 10:35) [26]


> В смысле?


В смысле, что ниоткуда, кроме как из EXE той же версии Delphi, их использовать не получится.


 
Fay ©   (2006-06-28 10:41) [28]

2 Игорь Шевченко ©   (28.06.06 10:37) [27]
Ах в этом смысле... 8) Наверное так и нужно было сказать.
Я, конечно, не допускаю мысли, что Leonid Troyanovsky думал то же, что написал, но не уточнить не мог 8)


 
Пусик ©   (2006-06-28 10:56) [29]


> Игорь Шевченко ©   (28.06.06 10:31) [25]
> Пусик ©   (28.06.06 10:22) [21] Дело в том, что DLL не является
> чем-то самостоятельным.


Но DLL, однако, является самодостаточной.
И имеет ценность сама по себе, а не только в составе какой-либо отдельной программы.
То, что внешней по отношению к DLL программе не интересно, что у нее внутри, еще не означает, что программирование кода в DLL должно быть без использования методов ООП.

Я думаю, что LVT весьма неосторожновысказал фразу о том, что ООП не предназначено для использования в DLL.
Методы ООП прекрасно помогают писать код как в обычной программе, так и в DLL.
И мне непонятно, к каким негативным последствиям может привести сложный код, реализованный с использование ООП в DLL.
Именно о отрицательных сторонах использования ООП в DLL и хотелось бы услышать в подтверждение своих слов от Леонида Трояновского.


 
Adder ©   (2006-06-28 11:04) [30]


> Игорь Шевченко ©   (28.06.06 10:31) [25]

Хм... однако

"ООП с использованием DLL" и "Использование в DLL"

абсолютно разные вещи (imho).


 
Игорь Шевченко ©   (2006-06-28 11:11) [31]

Пусик ©   (28.06.06 10:56) [29]


> Но DLL, однако, является самодостаточной.
> И имеет ценность сама по себе, а не только в составе какой-
> либо отдельной программы.


Это как ? Объясни пожалуйста. DLL ведь нельзя запустить на выполнение.


> Методы ООП прекрасно помогают писать код как в обычной программе,
>  так и в DLL.


Я могу еще раз сказать, что программе безразлично, каким образом написан код в DLL, лишь бы процедурный интерфейс DLL выполнял свои функции. DLL с классами внутре может быть смело заменена на DLL без классов внутре, с точки зрения контракта между основной программой и DLL ничего не изменится. В языках, где классы можно экспортировать из DLL, такие действия не пройдут.


 
Игорь Шевченко ©   (2006-06-28 11:14) [32]

Adder ©   (28.06.06 11:04) [30]

А тему ветки поглядеть не судьба ?


 
Adder ©   (2006-06-28 11:21) [33]


> Игорь Шевченко ©   (28.06.06 11:14) [32]

А причем тут тема ветки... Тему ветки забудут, а фразу запомнят..
И еще и повторять будут с умным видом в самых не подходящих для этого случаях.


 
Пусик ©   (2006-06-28 11:22) [34]


> Это как ? Объясни пожалуйста. DLL ведь нельзя запустить
> на выполнение.


Можно. Например, использовать RunDll32.exe для выполнения некоторой функции из DLL.


> DLL с классами внутре может быть смело заменена на DLL без
> классов внутре,


Зачем? Для чего отказываться от ООП в DLL? Какие есть для этого причины?


 
Игорь Шевченко ©   (2006-06-28 11:24) [35]

Adder ©   (28.06.06 11:21) [33]

Так это и буквы писать не стоит - а то запомнят и будут повторять в разных сочетаниях :)
В Delphi ООП с использованием DLL не реализуемо в чистом виде, собственно, об этом и речь. А переводить дискуссию на то, что сама реализация интерфейса DLL может быть написана с использованием ООП есть отход от темы ветки, только и всего.


 
Игорь Шевченко ©   (2006-06-28 11:30) [36]

Пусик ©   (28.06.06 11:22) [34]


> для выполнения некоторой функции из DLL


Ты сказал! (с) Евангелие

Именно функции, а не метода какого-либо объекта.


> Зачем? Для чего отказываться от ООП в DLL? Какие есть для
> этого причины?


Например, написав DLL на языке, не имеющем средств ООП. И тем не менее, такая DLL будет исправно выполнять свой контракт, описанный в ейном интерфейсе. Я к тому, что реализация DLL с использованием ООП или без использования его не влияет на внешние по отношению к DLL программы.

"Мало ли, что там у DLL внутри" (с)


 
Пусик ©   (2006-06-28 11:35) [37]

Удалено модератором


 
ЕГыук   (2006-06-28 16:44) [38]

> DLL ведь нельзя запустить на выполнение.

rundll


 
Игорь Шевченко ©   (2006-06-28 16:58) [39]

ЕГыук   (28.06.06 16:44) [38]

[36]


 
Leonid Troyanovsky ©   (2006-06-28 19:31) [40]


> Пусик ©   (28.06.06 10:56) [29]


> И имеет ценность сама по себе, а не только в составе какой-
> либо отдельной программы.

Dll не имеет никакой самостоятельной ценности, т.е. вне хоста.
Просто, это такая примитивная форма модели клиент-сервер.

>  что у нее внутри, еще не означает, что программирование
> кода в DLL должно быть без использования методов ООП.

Я пока не видел аргументов за использование ООП в dll.
(Впрочем, как, собс-но, и обоснований необходимости использования dll).

Допустим даже, что у нас есть доводы за dll.
Как, собс-но, мы должны применить ООП?
Видимо:
1. Создать объект
2. Заполнить его поля некоторыми простых типами,
переданными из хоста.
3. Сделать некоторые пассы.
4. Вернуть хосту нужные простые типы из полей.
5. Разрушить объект.

Налицо некоторые overheads. Т.е., все это совершенно спокойно
можно свести к неким преобразованиям простых типов,
без мучительных раздумий, как уследить за распределенной
в длл памяти, что будет, если будет повторный вызов в промежутке
между 1 - 6 и т.д.

> Я думаю, что LVT весьма неосторожновысказал фразу о том,
>  что ООП не предназначено для использования в DLL.

Конечно, не предназначены. Какая уж тут осторожность.
Максимум ООП, что можно выжать из dll есть COM (см. [5])

> и хотелось бы услышать в подтверждение своих слов от Леонида
> Трояновского.

Извольте-с.
Не используйте объекты в длл и будет вам счастье.
И, вообще, не используйте длл, если без оной можно обойтись.

--
Regards, LVT.



Страницы: 1 2 3 4 5 вся ветка

Форум: "Основная";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.045 c
2-1153197410
S46E
2006-07-18 08:36
2006.08.13
Потоки и пинг


15-1153261002
Каг дила?
2006-07-19 02:16
2006.08.13
Погомгите с длл


2-1153899362
jeka_t
2006-07-26 11:36
2006.08.13
Как можно у TreeView показать разным шрифтом TreeNodes?


15-1152946131
SerJaNT
2006-07-15 10:48
2006.08.13
Мастерам JavaScript


2-1153808000
ctudent
2006-07-25 10:13
2006.08.13
Настройка модема





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский