<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'><id>tag:blogger.com,1999:blog-1702873441071265539.post7625352937635378534..comments</id><updated>2012-02-14T16:27:29.364+04:00</updated><category term='не делай так'/><category term='прочее'/><category term='Vista'/><category term='ты можешь это сделать'/><category term='роботы/киберпанк'/><category term='Королевство Delphi'/><category term='работа'/><category term='Delphi'/><category term='случайные мысли'/><category term='начинающим'/><category term='блог'/><category term='Коты'/><category term='7'/><category term='журнал'/><category term='EurekaLog'/><category term='задачки'/><category term='Windows'/><category term='Tiburon'/><category term='обработка ошибок'/><category term='x64'/><category term='TasksEx'/><category term='Статья'/><title type='text'>Comments on Блог GunSmoker-а: Разработка системы плагинов в Delphi</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.gunsmoker.ru/feeds/7625352937635378534/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default?start-index=26&amp;max-results=25'/><author><name>Александр Алексеев</name><uri>https://profiles.google.com/113168002104297556003</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-6255016714410143643</id><published>2012-02-14T16:27:29.364+04:00</published><updated>2012-02-14T16:27:29.364+04:00</updated><title type='text'>Молодец, Тверь.
Такие отличные статьи редко встрет...</title><content type='html'>Молодец, Тверь.&lt;br /&gt;Такие отличные статьи редко встретишь.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/6255016714410143643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/6255016714410143643'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1329222449364#c6255016714410143643' title=''/><author><name>Дмитрий</name><uri>http://ya.ru</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1374564858'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-8940656481406035665</id><published>2012-02-03T12:27:51.346+04:00</published><updated>2012-02-03T12:27:51.346+04:00</updated><title type='text'>Лениво править 7 демо-примеров... Исправление вста...</title><content type='html'>Лениво править 7 демо-примеров... Исправление вставлю в 8-й.&lt;br /&gt;&lt;br /&gt;Кстати, насколько я помню, это не единственный найденный и поправленный косяк - так что для практики лучше смотреть последний вариант примеров.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8940656481406035665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8940656481406035665'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1328257671346#c8940656481406035665' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-2708263739974530402</id><published>2012-02-03T12:19:21.086+04:00</published><updated>2012-02-03T12:19:21.086+04:00</updated><title type='text'>ЗЫ: Посмотрел исходники там тоже. :)</title><content type='html'>ЗЫ: Посмотрел исходники там тоже. :)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2708263739974530402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2708263739974530402'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1328257161086#c2708263739974530402' title=''/><author><name>Leechdraw</name><uri>http://www.blogger.com/profile/09763661695406190872</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05296815312962202983'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_I1okPUv72nY/S3A66DIHBLI/AAAAAAAAAag/FKTnrSA1iEs/S220/stfu-51136.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-857653626'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-2984335441855203588</id><published>2012-02-03T11:54:59.643+04:00</published><updated>2012-02-03T11:54:59.643+04:00</updated><title type='text'>Ага, перепутан.

Поправил.</title><content type='html'>Ага, перепутан.&lt;br /&gt;&lt;br /&gt;Поправил.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2984335441855203588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2984335441855203588'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1328255699643#c2984335441855203588' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-6384527923170688692</id><published>2012-02-03T11:51:10.086+04:00</published><updated>2012-02-03T11:51:10.086+04:00</updated><title type='text'>Я может чего-то не понял, но вот этот код меня сму...</title><content type='html'>Я может чего-то не понял, но вот этот код меня смущает.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;  if Length(FItems) &amp;gt;= FCount then // &amp;quot;Capacity&amp;quot;&lt;br /&gt;    SetLength(FItems, Length(FItems) + 64);&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Не перепутан ли тут знак &amp;gt; со знаком &amp;lt; ?</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/6384527923170688692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/6384527923170688692'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1328255470086#c6384527923170688692' title=''/><author><name>Leechdraw</name><uri>http://www.blogger.com/profile/09763661695406190872</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='05296815312962202983'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://2.bp.blogspot.com/_I1okPUv72nY/S3A66DIHBLI/AAAAAAAAAag/FKTnrSA1iEs/S220/stfu-51136.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-857653626'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-2294580049296622586</id><published>2012-01-30T13:03:50.275+04:00</published><updated>2012-01-30T13:03:50.275+04:00</updated><title type='text'>Хотя и тут радужно не получается.

Плагин не может...</title><content type='html'>Хотя и тут радужно не получается.&lt;br /&gt;&lt;br /&gt;Плагин не может сделать:&lt;br /&gt;AnotherPlugin.DoSomething(Self)&lt;br /&gt;а вынужден делать:&lt;br /&gt;AnotherPlugin.DoSomething(ICore.GetStub(Self))&lt;br /&gt;&lt;br /&gt;А в первом варианте получим трудноуловимые проблемы.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2294580049296622586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2294580049296622586'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1327914230275#c2294580049296622586' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-5345682077859174900</id><published>2012-01-30T12:58:44.900+04:00</published><updated>2012-01-30T12:58:44.900+04:00</updated><title type='text'>&lt;i&gt;&amp;gt;&amp;gt;&amp;gt; можно поступить проще: на каждый п...</title><content type='html'>&lt;i&gt;&amp;gt;&amp;gt;&amp;gt; можно поступить проще: на каждый плагин создать объект-переходник с тем же интефейсом(IPlugin)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;На словах мне нравится, но писанины будет... ого-го.&lt;br /&gt;&lt;br /&gt;А вообще в большинстве программ не перезапуск - это не проблема.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/5345682077859174900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/5345682077859174900'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1327913924900#c5345682077859174900' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-8382781501944212041</id><published>2012-01-21T17:42:32.500+04:00</published><updated>2012-01-21T17:42:32.500+04:00</updated><title type='text'>&amp;gt;&amp;gt;Такое решение упрощает разработку ядра, но...</title><content type='html'>&amp;gt;&amp;gt;Такое решение упрощает разработку ядра, но сильно затрудняет разработку самих плагинов.&lt;br /&gt;&lt;br /&gt;Честно говоря не сильно усложняет. Если плагин работает в контексте основного потока то вообще никакой сложности. Всю реализацию загрузки/выгрузки можно впихнуть в сдк.&lt;br /&gt;Если же плагин работает с несколькими потоками, то можно использовать Lock/Unlock в том же сдк при обращении к другим плагинам.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8382781501944212041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8382781501944212041'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1327153352500#c8382781501944212041' title=''/><author><name>MrShoor</name><uri>http://www.blogger.com/profile/14982166445380100334</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-75923568'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-343700744028881713</id><published>2012-01-16T21:00:26.279+04:00</published><updated>2012-01-16T21:00:26.279+04:00</updated><title type='text'>&amp;gt;&amp;gt;Для успешной выгрузки удобнее всего ответс...</title><content type='html'>&amp;gt;&amp;gt;Для успешной выгрузки удобнее всего ответственными за &amp;quot;перезагрузку&amp;quot; плагинов сделать сами плагины.&lt;br /&gt;Такое решение упрощает разработку ядра, но сильно затрудняет разработку самих плагинов. Код повсеместно становится жестко зависимым от архитектуры приложения, явное знание о плагинной структуре и сильные зависимости от конкретных версий конкретных плагинов (причем с возможностью исчезновения этих плагинов в любой момент) затрудняют как добавление функционала, так и его модификацию, и даже рефакторинг.&lt;br /&gt;Передо мной стояла задача с прямо противоположными приоритетами - превратить несколько монолитных приложений в модульные с общим ядром и пересекающимся составом плагинов с минимальными модификация существующего кода. Позднее были добавлены требования ослабления зависимости между плагинами, дабы имел значение только реализованный функционал, а сам плагин без ущерба можно было заменить аналогичным (или несколькими аналогичными).</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/343700744028881713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/343700744028881713'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326733226279#c343700744028881713' title=''/><author><name>Кирилл Маурин</name><uri>http://www.blogger.com/profile/07929105702896168924</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='03129842608021167188'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1917953964'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-2231946105382908766</id><published>2012-01-14T01:10:58.129+04:00</published><updated>2012-01-14T01:10:58.129+04:00</updated><title type='text'>&lt;i&gt;можно поступить проще: на каждый плагин создать...</title><content type='html'>&lt;i&gt;можно поступить проще: на каждый плагин создать объект-переходник с тем же интефейсом(IPlugin)&lt;/i&gt;&lt;br /&gt;При взаимодействии между плагинами как правило нужно больше чем просто интерфейс IPlugin. Например у меня есть IPopupPlugin через который осуществляется работа со всплывающими окошками, с кучей методов и свойств. На каждый плагин писать либо свой переходник, либо придумывать &amp;quot;хак&amp;quot; на ассемблерном уровне по маршалингу.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2231946105382908766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2231946105382908766'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326489058129#c2231946105382908766' title=''/><author><name>MrShoor</name><uri>http://www.blogger.com/profile/14982166445380100334</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-75923568'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-9002088151296665349</id><published>2012-01-13T21:45:49.868+04:00</published><updated>2012-01-13T21:45:49.868+04:00</updated><title type='text'>можно поступить проще: на каждый плагин создать об...</title><content type='html'>можно поступить проще: на каждый плагин создать объект-переходник с тем же интефейсом(IPlugin),&lt;br /&gt;он единственный будет общаться с плагином напрямую, а всем остальным модулям/плагинам отдавать ссылку на него&lt;br /&gt;тогда Unload/FixUp не нужны</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/9002088151296665349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/9002088151296665349'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326476749868#c9002088151296665349' title=''/><author><name>Anonymous</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-966290269'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-478375247223214499</id><published>2012-01-12T20:50:49.327+04:00</published><updated>2012-01-12T20:50:49.327+04:00</updated><title type='text'>Для успешной выгрузки удобнее всего отвественными ...</title><content type='html'>Для успешной выгрузки удобнее всего отвественными за &amp;quot;перезагрузку&amp;quot; плагинов сделать сами плагины. Вообще всю ответственность за поддержание &amp;quot;связей&amp;quot; возлагать на сами плагины.&lt;br /&gt;Просто в плагин добавляем пару методов:&lt;br /&gt;IPlugin = interface&lt;br /&gt;//.... некоторые методы&lt;br /&gt;procedure Unload(plugin: IPlugin); safecall;&lt;br /&gt;procedure FixUp(plugin: IPlugin); safecall;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;Менеджер перед выгрузкой плагина вызывает Unload у каждого загруженного плагина. Загруженный плагин должен сам определить использует ли он этот плагин или нет, если использует - освободить все ссылки на плагин. После менеджер может выгрузить dll с плагином, заменить, подгрузить обновленный плагин и вызывать FixUp передав новый плагин всем загруженным плагинам. Кому надо - получает ссылки на плагин.&lt;br /&gt;&lt;br /&gt;Проблемы доступа к плагину в момент перезагрузки я решил через критические секции. Обернул перезагрузку плагина в коде менеджера в критическую секцию, в реализации плагинов обращаюсь к плагинам только экранированно. Таким образом никаких проблем с перезагрузкой не возникает.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/478375247223214499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/478375247223214499'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326387049327#c478375247223214499' title=''/><author><name>MrShoor</name><uri>http://www.blogger.com/profile/14982166445380100334</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-75923568'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-1439713190713459175</id><published>2012-01-12T11:42:59.168+04:00</published><updated>2012-01-12T11:42:59.168+04:00</updated><title type='text'>Интересно.
Для меня главной проблемой выгрузки был...</title><content type='html'>Интересно.&lt;br /&gt;Для меня главной проблемой выгрузки было следующее: если функционалом плагина пользуются другие плагины, то как безболезненно выдернуть его из живой системы?</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/1439713190713459175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/1439713190713459175'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326354179168#c1439713190713459175' title=''/><author><name>Leo Bonart</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-225654290'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-7363454073863309343</id><published>2012-01-11T14:30:06.354+04:00</published><updated>2012-01-11T14:30:06.354+04:00</updated><title type='text'>На самом деле это только с виду тяжко. На практике...</title><content type='html'>На самом деле это только с виду тяжко. На практике все довольно просто реализуемо (добавлением пары методов в IPlugins), если интересно - могу рассказать. Код ядра по выдергиванию тоже довольно простой.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7363454073863309343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7363454073863309343'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326277806354#c7363454073863309343' title=''/><author><name>MrShoor</name><uri>http://www.blogger.com/profile/14982166445380100334</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-75923568'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-4150577339007724915</id><published>2012-01-11T13:17:57.355+04:00</published><updated>2012-01-11T13:17:57.355+04:00</updated><title type='text'>MrShoor ,
&amp;quot;Горячая&amp;quot; выгрузка - это очень...</title><content type='html'>MrShoor ,&lt;br /&gt;&amp;quot;Горячая&amp;quot; выгрузка - это очень жестко.&lt;br /&gt;У меня важно было другое - чтобы плагины минимально зависели друг от друга и способа загрузки с одной стороны и могли неограниченно пользоваться функционалом остальных плагинов - с другой, т.е. чистый конструктор лего.&lt;br /&gt;В итоге дошло до выражения зависимостей через интерфейсы, а ядро определяло порядок активации и вычисляло циклические зависимости.&lt;br /&gt;Горячей выгрузке, кстати, предлагаемая мной оптимизация не противоречит - просто добавляет новые обязанности, причем не к загрузчику - он тупой, а к ядру - оно обязано уметь выдергивать логический плагин из работающей системы на лету, что в любом случае тяжко.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/4150577339007724915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/4150577339007724915'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326273477355#c4150577339007724915' title=''/><author><name>Leo Bonart</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-225654290'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-3622616508480821954</id><published>2012-01-11T13:00:56.033+04:00</published><updated>2012-01-11T13:00:56.033+04:00</updated><title type='text'>Leo Bonart, я ни в коем случае не говорю что ваш п...</title><content type='html'>Leo Bonart, я ни в коем случае не говорю что ваш подход плох. Для ваших задач возможно так сделать удобнее и логичнее. Но если задача простая, то не обязательно её усложнять. У меня например была задача: простейшая система плагинов, но чтобы плагины могли обновлятся и перезагружаться &amp;quot;нагорячую&amp;quot;, без перезапуска приложения. Мне не нужна была гибкость, и меня вполне устраивала и устраивает система 1 модуль = 1 плагин. С фабрикой же будет 1 модуль = 1 фабрика = N плагинов. В этом случае мне нужно было бы предусмотреть выгрузку модуля через фабрику, а значит обучить фабрику выгружать созданные ей плагины, а ведь ссылки на IPlugin будут существовать за пределами модулей. И в данном случае фабрика будет только мешать, давая мне гибкость которая абсолютно мне не нужна.&lt;br /&gt;Поэтому прежде чем вводить какой-либо механизм, нужно подумать нужен ли он вам конкретно, его ведь еще обслуживать надо будет, ну и не переуседствовать с гибкостью :)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/3622616508480821954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/3622616508480821954'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326272456033#c3622616508480821954' title=''/><author><name>MrShoor</name><uri>http://www.blogger.com/profile/14982166445380100334</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-75923568'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-7889281204305046564</id><published>2012-01-11T10:45:23.070+04:00</published><updated>2012-01-11T10:45:23.070+04:00</updated><title type='text'>MrShoor, 
COM мне ни к чему: он для плагинов уровн...</title><content type='html'>MrShoor, &lt;br /&gt;COM мне ни к чему: он для плагинов уровня системы с его регистрацией в глобальном реестре, внешней автоматизации с маршалингом между процессами, различными потоковыми моделями и т.п. и т.д.&lt;br /&gt;Мои задачи - архитектура конкретного приложения на уровне разработки и сопровождения. И здесь разделение физики (загрузчик) и логики (плагины) очень помогает, причем в первую очередь для целей тестирования. &lt;br /&gt;И да, я это реализовал и оно используется в практике коммерческой разработки моего работодателя.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7889281204305046564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7889281204305046564'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326264323070#c7889281204305046564' title=''/><author><name>Leo Bonart</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-225654290'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-7087078231414418195</id><published>2012-01-11T01:25:27.378+04:00</published><updated>2012-01-11T01:25:27.378+04:00</updated><title type='text'>Leo Bonart, вы стали на путь изобретения COM. Сейч...</title><content type='html'>Leo Bonart, вы стали на путь изобретения COM. Сейчас &amp;quot;оптимизация&amp;quot; на фабрику класса... потом независимое размещение в дериктории, и поиск по записи в реестре...&lt;br /&gt;&lt;br /&gt;На мой взгляд иногда можно обойтись и без такой оптимизации. Нужно просто определить какие возможности действительно могут понадобится. Эдак можно до абсурда дойти и изобрести DCOM, изобрести dot.net... И дело не в том что оптимизация плохая, да, она гибкая, но поддержка такой гибкой оптимизации (которая возможно никогда не понадобится) требует документации, требует дополнительной реализации, дополнительного тестирования.&lt;br /&gt;Взять предложенную вами же реализацию через фабрики. Представим ситуацию, мы хотим плагины обновлять по интернету без перезапуска приложения, прямо на лету, а между плагинами есть допустим связи. Нужно разработать систему по выгрузке, и восстановления связей (fixup), а в случае с фабрикой нужно обучать фабрику каждого класса делать такой &amp;quot;финт&amp;quot;. Лишняя реализация в каждый плагин.&lt;br /&gt;&lt;br /&gt;Поэтому важно выбрать именно тот уровень гибкости архитектуры, который нужен именно в нашем случае и не переусердствовать.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7087078231414418195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7087078231414418195'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326230727378#c7087078231414418195' title=''/><author><name>MrShoor</name><uri>http://www.blogger.com/profile/14982166445380100334</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-75923568'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-8850724383910677627</id><published>2012-01-09T15:26:52.822+04:00</published><updated>2012-01-09T15:26:52.822+04:00</updated><title type='text'>Маленькая оптимизация:
1. Пусть библиотека плагино...</title><content type='html'>Маленькая оптимизация:&lt;br /&gt;1. Пусть библиотека плагинов экспортирует одну функцию, которая возвращает одну интерфейсную ссылку, экспортирующую фабрику плагинов.&lt;br /&gt;2. Тогда функции для явной зачистки писать не надо - достаточно специфицировать для ядра удержание ссылки на фабрику до выгрузки, а финализацию либы выполнять в деструкторе фабрики.&lt;br /&gt;3. Появляется возможность размещать плагины буквально где угодно - загрузчику достаточно уметь получать ссылку на фабрику, а каким способом - всего остального кода не касается. Например, помещение плагинов в один исполняемый файл полезно для предотвращения излишних модификаций конечными пользователями и облегчения тестирования и отладки (утечки памяти много проще искать для одного файла и Delphi 2007 очень любит падать при отладке dll и bpl)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8850724383910677627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8850724383910677627'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1326108412822#c8850724383910677627' title=''/><author><name>Leo Bonart</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1153442752'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-8415419602860009212</id><published>2011-12-28T08:28:47.914+04:00</published><updated>2011-12-28T08:28:47.914+04:00</updated><title type='text'>Romkin, почему-то в Delphi интерфейсы используются...</title><content type='html'>Romkin, почему-то в Delphi интерфейсы используются повсеместно совершенно без ссылок на COM. К чему-бы это? Потому что интерфейс - это просто запись (record) с указателями на методы.&lt;br /&gt;&lt;br /&gt;BSTR (который в WideString) аналогично совершенно спокойно используется в WinAPI (который новый), снова без всяких посылок к COM (в функциях).&lt;br /&gt;&lt;br /&gt;HRESULT (который safecall) - это практически де-факто (современный) стандарт обработки ошибок на кодах ошибок. Используется, опять же, повсеместно - не только в WinAPI (и снова - в функциях), но и API сторонних разработчиков.&lt;br /&gt;&lt;br /&gt;Понятно, что вместе с COM это всё безусловно тоже используется, но я привёл примеры того, что мой подход - это не что-то из рамок вон выходящее, а вполне себе обычная ситуация.&lt;br /&gt;&lt;br /&gt;(Насчёт библиотеки типов примеров привести не могу.)&lt;br /&gt;&lt;br /&gt;Почему в таких случаях не выбирают COM? Потому что это больше, чем требуется в данном конкретном случае. Вот почему не выбрал его здесь и я.&lt;br /&gt;&lt;br /&gt;Разумеется, сколько людей - столько и мнений. И кто-то другой вполне может выбрать для своей реализации COM - ради бога. Я совершенно согласен, что если ты попробуешь предусмотреть всё-всё-всё, то просто переизобретёшь COM (и тогда тебе изначально надо было бы его использовать). Но эта статья - про другой подход. Возможно, когда-нибудь много позже я напишу и про другие подходы (но - навряд ли). А кому интересно сейчас - я ссылочки в начале статьи привёл.&lt;br /&gt;&lt;br /&gt;Основная причина, как я уже сказал, - кривая обучения. Если ты делаешь систему на базе COM, тебе мало того, что придётся объяснять всё то, что я уже тут сказал, так ещё и объяснять новые вещи, связанные с COM, про которые я не говорил. И мне кажется, что не все из них тривиальны.&lt;br /&gt;&lt;br /&gt;В моей же статье из нетривиальностей разве что библиотека типов. WideString ведёт себя как обычная строка. Интерфейсы - это вообще родной механизм под Delphi (к примеру, интерфейсы не существуют в C++, там они представляются абстрактными классами). Вроде у меня ничего особо сложного нет.&lt;br /&gt;&lt;br /&gt;Почему это имеет значение? Эта статья предполагается для начинающих. Основная её цель - дать пинок в нужную сторону. Потому что лично меня задолбало видеть доморощенные API в системах, построенные с использованием PChar, самоделкиных функций управления памятью и самоизобретёнными же способами обработки ошибок. И это в 2011-м году!&lt;br /&gt;&lt;br /&gt;Эти люди не понимают, что те вещи, которые они &lt;i&gt;обычно&lt;/i&gt; замечают в WinAPI (PChar-ы и т.п.), находятся там только потому, что этот API был сделан более 20 лет назад - он тянется из 16-битных Windows, а некоторый - ещё из OS\2! Определённо, за 20 лет правила изменились. Вам не нужно думать об &lt;a href="http://www.transl-gunsmoker.ru/2009/05/shgetmalloc-shalloc-cogetmalloc.html" rel="nofollow"&gt;этом&lt;/a&gt;, &lt;a href="http://www.transl-gunsmoker.ru/2010/07/windows.html" rel="nofollow"&gt;этом&lt;/a&gt; или &lt;a href="http://www.transl-gunsmoker.ru/2009/04/hinstance-hmodule.html" rel="nofollow"&gt;этом&lt;/a&gt; и сотне других вещей. Поэтому, эта статья - попытка что-то с этим сделать.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8415419602860009212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8415419602860009212'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1325046527914#c8415419602860009212' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-3899885875684464304</id><published>2011-12-27T20:32:48.800+04:00</published><updated>2011-12-27T20:32:48.800+04:00</updated><title type='text'>У варианта системы плагинов с библиотекой типов ес...</title><content type='html'>У варианта системы плагинов с библиотекой типов есть еще то преимущество, что при необходимости плагин можно вынести в отдельный процесс, COM сможет выполнить маршалинг.&lt;br /&gt;Например, у меня возникла такая ситуация: по мере развития программы появилось множество плагинов от разных авторов, причем самого разного качества. Некоторые плагины портят память, в некоторых есть проблемы с загрузкой/выгрузкой в DllMain других DLL и т.п. В основном это все редко используемые плагины.&lt;br /&gt;Чтобы повысить стабильность работы приложения, менеджер плагинов может запускать некоторые плагины в отдельных процессах.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/3899885875684464304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/3899885875684464304'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1325003568800#c3899885875684464304' title=''/><author><name>Chaa</name><uri>http://www.blogger.com/profile/14387721107858333063</uri><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1955961515'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-8597632261171447092</id><published>2011-12-27T17:51:59.254+04:00</published><updated>2011-12-27T17:51:59.254+04:00</updated><title type='text'>&amp;gt;&amp;gt;&amp;gt; &lt;i&gt;Это всё - достаточно легковесные в...</title><content type='html'>&amp;gt;&amp;gt;&amp;gt; &lt;i&gt;Это всё - достаточно легковесные вещи, которые от COM, считай, не зависят, а используются повсеместно. Поэтому их легко понять, с ними легко работать. И кривая для изучения будет плавной.&lt;/i&gt;&lt;br /&gt;Не факт. В реализации того же COM в Delphi уже многое предусмотрено, та же обработка ошибок, к примеру. Да и статей куча, достаточно не описывать все досконально, а просто дать ссылки.&lt;br /&gt;А здесь все вручную придется делать. SafeCallException перекрываться будет?&lt;br /&gt;На мой взгляд как раз в этом варианте потребуется более глубокое понимание механизмов Delphi, что, впрочем, полезно.&lt;br /&gt;COM же недаром вводит вещи, которые требуют изучения. Вот планируется UI, а как будет решаться вопрос с тем, что вызов к этому UI может идти из разных приложений, из разных потоков? Взять хотя бы случай когда запущены два экземпляра приложения. То же самое касается и обратных вызовов. А если захочется плагин-синглетон? Например, для доступа к COM-портам, к оборудованию.&lt;br /&gt;Вообще с нетерпением жду следующей части :)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8597632261171447092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/8597632261171447092'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1324993919254#c8597632261171447092' title=''/><author><name>Romkin</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1448852668'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-7380833744284172620</id><published>2011-12-27T16:49:52.958+04:00</published><updated>2011-12-27T16:49:52.958+04:00</updated><title type='text'>&lt;i&gt; &amp;gt;&amp;gt;&amp;gt; С самого начала возник вопрос, по...</title><content type='html'>&lt;i&gt; &amp;gt;&amp;gt;&amp;gt; С самого начала возник вопрос, почему вместо массива плагинов не использовать TInterfaceList?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Да, почему я его не использовал: у меня всего два действия: добавить и удалить. Очень просто. Собственно мне показалось, что это немного и можно и написать. С учётом, что никаких других возможностей я не использую. Хотя с отдельным классом, конечно, правильнее.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7380833744284172620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7380833744284172620'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1324990192958#c7380833744284172620' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-2394266797294737034</id><published>2011-12-27T16:44:39.080+04:00</published><updated>2011-12-27T16:44:39.080+04:00</updated><title type='text'>&lt;i&gt; &amp;gt;&amp;gt;&amp;gt; Но это, все равно морока, было бы...</title><content type='html'>&lt;i&gt; &amp;gt;&amp;gt;&amp;gt; Но это, все равно морока, было бы интересно узнать про замену оберток&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Обёртки нужны в любом случае, вне зависимости от выбранной схемы реализации плагинов. Исключение не должно выйти за пределы возбудившего его модуля.&lt;br /&gt;&lt;br /&gt;Другое дело, кто эти обёртки делает - вы или среда.&lt;br /&gt;&lt;br /&gt;Я ещё поговорю про обработку ошибок.&lt;br /&gt;&lt;br /&gt;Кстати, мне кажется вы отчёт неверно трактуете. Я поясню логику в следующей статье.&lt;br /&gt;&lt;br /&gt;&lt;i&gt; &amp;gt;&amp;gt;&amp;gt; С самого начала возник вопрос, почему вместо массива плагинов не использовать TInterfaceList?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Да никаких причин нет, можно использовать.&lt;br /&gt;&lt;br /&gt;&lt;i&gt; &amp;gt;&amp;gt;&amp;gt; если все на базе COM, то почему бы сразу не взять все механизмы, ту же обработку ошибок, COM категории и так далее?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Я от COM взял только три вещи:&lt;br /&gt;- Интерфейсы&lt;br /&gt;- BSTR/WideSrtring&lt;br /&gt;- Библиотеку типов&lt;br /&gt;&lt;br /&gt;Это всё - достаточно легковесные вещи, которые от COM, считай, не зависят, а используются повсеместно. Поэтому их легко понять, с ними легко работать. И кривая для изучения будет плавной.&lt;br /&gt;&lt;br /&gt;Если же делать COM-объекты, то нужно учить именно COM: threading model, apartments, masrshaling, in-proc/out-proc, ... кучу вещей. Понятно, экспертом быть не нужно, но надо будет иметь обо всём этом какое-то представление, чтобы понимать что ты делаешь при создании и регистрации объектов. Согласись, что это существенно сложнее чем интерфейсы, строки и заголовочники.&lt;br /&gt;&lt;br /&gt;Само собой, если делать приложение размера MS Word, то COM тут практически без альтернатив. Но для меньших программ - какие плюсы компенсируют сложность COM для изучения?&lt;br /&gt;&lt;br /&gt;Это личное мнение - понятно, могу ошибаться.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2394266797294737034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/2394266797294737034'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1324989879080#c2394266797294737034' title=''/><author><name>Александр Алексеев</name><uri>http://www.blogger.com/profile/15611696588191431330</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='13148942647851058340'/><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-aUMttZQBsuI/AAAAAAAAAAI/AAAAAAAAC3Y/QuZ7K9t_WzE/s512-c/photo.jpg'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-882382456'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-7276932382264594179</id><published>2011-12-27T15:57:41.785+04:00</published><updated>2011-12-27T15:57:41.785+04:00</updated><title type='text'>Спасибо, очень интересно.
С самого начала возник в...</title><content type='html'>Спасибо, очень интересно.&lt;br /&gt;С самого начала возник вопрос, почему вместо массива плагинов не использовать TInterfaceList?&lt;br /&gt;Тогда не придется писать добавление и удаление. TPluginManager.UnloadPlugin вообще выглядит очень подозрительно, в первый момент я даже подумал что он ошибочен.&lt;br /&gt;И второе, если все на базе COM, то почему бы сразу не взять все механизмы, ту же обработку ошибок, COM категории и так далее?</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7276932382264594179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/7625352937635378534/comments/default/7276932382264594179'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2011/12/delphi.html?showComment=1324987061785#c7276932382264594179' title=''/><author><name>Romkin</name><email>noreply@blogger.com</email><gd:image xmlns:gd='http://schemas.google.com/g/2005' rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img1.blogblog.com/img/blank.gif'/></author><thr:in-reply-to xmlns:thr='http://purl.org/syndication/thread/1.0' href='http://www.gunsmoker.ru/2011/12/delphi.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-7625352937635378534' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/7625352937635378534' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1448852668'/></entry></feed>
