<?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.post5777257077220706959..comments</id><updated>2012-01-11T01:10:22.062+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, часть 2: раз...</title><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.gunsmoker.ru/feeds/5777257077220706959/comments/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html'/><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>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-8388565065200138610</id><published>2012-01-11T01:10:22.062+04:00</published><updated>2012-01-11T01:10:22.062+04:00</updated><title type='text'>Окей, будем считать так: в статье взят IStream, чт...</title><content type='html'>Окей, будем считать так: в статье взят IStream, чтобы было меньше писать кода, а у себя - пишите свой аналог. :)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/8388565065200138610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/8388565065200138610'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326229822062#c8388565065200138610' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-8298089840908249913</id><published>2012-01-11T00:55:00.201+04:00</published><updated>2012-01-11T00:55:00.201+04:00</updated><title type='text'>По поводу IStream и TStream. Когда-то напоролся на...</title><content type='html'>По поводу IStream и TStream. Когда-то напоролся на такой &amp;quot;подводный камень&amp;quot;. Дело в том что на TStreamAdapter-е не реализован метод IStream.Clone. На практике этот метод довольно часто используется сторонними модулями (особенно написанными на других языках), когда IStream нужно хранить некоторое время на стороне модуля т.к. позволяет работать со своим seek без дублирования ресурса.&lt;br /&gt;Почему-то очень часто проверку HResult на Clone опускают :( В результате подсовываешь адаптер - и получаешь эксепшн.&lt;br /&gt;&lt;br /&gt;А самое печальное во всем этом то, что нельзя реализовать свой TStreamAdapter с IStream.Clone, в силу неправильно заложенной архитектуры (видимо не задумались когда-то разработчики делфи, а потом переделывать не стали).&lt;br /&gt;Клонирование нужно делать на уровне каждого вида ресурса (TFileStream/TMemoryStream/TКакойтоStream). &lt;br /&gt;Текущая архитектура скрывает сам ресурс (хендл, указатель памяти и т.п.) внутри самого TStream наследника, а значит и не возможно нормальное клонирование. Решение - выносить ресурс отдельно с подсчетом ссылок.&lt;br /&gt;&lt;br /&gt;Поэтому прежде чем использовать повсеместно стандартные TStream наследники и TStreamAdapter нужно хорошенько подумать понадобится ли вам Clone, и если да - то реализовывать свои TStream наследники, а так же TStreamAdapter.&lt;br /&gt;&lt;br /&gt;Я помнится хорошенько так попал, когда 80% кода было написано :)</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/8298089840908249913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/8298089840908249913'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326228900201#c8298089840908249913' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-3697286943168313529</id><published>2012-01-10T22:40:45.962+04:00</published><updated>2012-01-10T22:40:45.962+04:00</updated><title type='text'>Поясню, почему был выбран IStream - потому что это...</title><content type='html'>Поясню, почему был выбран IStream - потому что это хоть какой-то стандарт. &lt;br /&gt;&lt;br /&gt;Например, в Delphi есть готовые классы-переходники. Подозреваю, что аналогичные вещи есть и в других языках. Т.е. если использовать IStream - то вам придётся писать меньше кода, поскольку код уже написан.&lt;br /&gt;&lt;br /&gt;Но никто не запрещает не использовать IStream. Вполне можно было бы создать свой интерфейс по аналогии (скажем, гипотетический IDataStream), и по аналогии же написать переходники к TStream.&lt;br /&gt;&lt;br /&gt;Плюсы: нет проблем с библиотекой типов, т.к. интерфейс свой. Минусы: писать больше кода (как разработчику программы, так и разработчикам плагинов).&lt;br /&gt;&lt;br /&gt;Так что выбирайте любой подход, какой больше нравится.&lt;br /&gt;&lt;br /&gt;&lt;i&gt; &amp;gt; лучше использовать IServiceProvider &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Не уверен, что понял мысль.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/3697286943168313529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/3697286943168313529'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326220845962#c3697286943168313529' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-8356624227113006224</id><published>2012-01-09T17:36:27.946+04:00</published><updated>2012-01-09T17:36:27.946+04:00</updated><title type='text'>Явный доступ к плагинам - таки не айс. Если будет ...</title><content type='html'>Явный доступ к плагинам - таки не айс. Если будет нужда перераспределить обязанности плагинов, использовать в одних плагинах другие, управлять порядком загрузки оных - лучше использовать IServiceProvider. &lt;br /&gt;В этом случае неважно, кто реализует функционал: ядро, плагин или мок - клиентский код останется прежним.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/8356624227113006224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/8356624227113006224'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326116187946#c8356624227113006224' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-2756133284858004634</id><published>2012-01-09T17:23:38.313+04:00</published><updated>2012-01-09T17:23:38.313+04:00</updated><title type='text'>Я бы предложил выкинуть IStream - он слишком мощны...</title><content type='html'>Я бы предложил выкинуть IStream - он слишком мощный, большинство реализаций все равно не смогут поддерживать этот интерфейс в полном объеме.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/2756133284858004634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/2756133284858004634'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326115418313#c2756133284858004634' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-1722227763201560723</id><published>2012-01-09T00:13:05.420+04:00</published><updated>2012-01-09T00:13:05.420+04:00</updated><title type='text'>К стати об TOleStream. Одно упоминание Vcl.AxCtrls...</title><content type='html'>К стати об TOleStream. Одно упоминание Vcl.AxCtrls.pas в котором он описан, раздувает размер библиотеки на метр с лишним. Пришлось вырезать в отдельный файл, благо совсем немного. А то получалось, что при размере хоста в 400 КБ, плагин весил 1,5 МБ.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/1722227763201560723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/1722227763201560723'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326053585420#c1722227763201560723' title=''/><author><name>HeMet</name><uri>http://jiyuu-vn.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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1171394341'/></entry><entry><id>tag:blogger.com,1999:blog-1702873441071265539.post-373573384186586137</id><published>2012-01-09T00:04:19.869+04:00</published><updated>2012-01-09T00:04:19.869+04:00</updated><title type='text'>Исследовал такой вариант: я скомпилировал IDL файл...</title><content type='html'>Исследовал такой вариант: я скомпилировал IDL файл с подключенным objidl.idl в TLB файл.&lt;br /&gt;&lt;br /&gt;IStreamTLB.idl:&lt;br /&gt;&lt;br /&gt;import &amp;quot;objidl.idl&amp;quot;;&lt;br /&gt;[&lt;br /&gt;    uuid(81DF4D4E-C82D-49FF-B9ED-EA3E93175479),&lt;br /&gt;    version(1.0),&lt;br /&gt;    helpstring(&amp;quot;IStream declaration&amp;quot;)&lt;br /&gt;]&lt;br /&gt;library IStreamTLB&lt;br /&gt;{&lt;br /&gt;    importlib(&amp;quot;stdole32.tlb&amp;quot;);&lt;br /&gt;    importlib(&amp;quot;stdole2.tlb&amp;quot;);&lt;br /&gt;&lt;br /&gt;[&lt;br /&gt;    object,&lt;br /&gt;    uuid(30014161-581B-462C-B110-D99BCD789F99),&lt;br /&gt;    pointer_default(unique),&lt;br /&gt;    helpstring(&amp;quot;Dummy interface&amp;quot;)&lt;br /&gt;]&lt;br /&gt;interface IMyDummyStream : IUnknown&lt;br /&gt;{&lt;br /&gt;    HRESULT UseIStream( [in] IStream* Stream&lt;br /&gt;                        );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;Build.bat:&lt;br /&gt;@echo off&lt;br /&gt;call &amp;quot;c:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat&amp;quot;&lt;br /&gt;midl &amp;quot;C:\IStreamTLB.Idl&amp;quot; /out C:\ /h &amp;quot;TestHeader.hpp&amp;quot;&lt;br /&gt;&lt;br /&gt;Получил IStreamTLB.tlb. Что интересно - в заголовочнике была верно указана ссылка на первоисточник (objidl.h).&lt;br /&gt;&lt;br /&gt;Далее я зарегистрировал этот файл в системе (я воспользовался Component/Import Component/Import Type Library/Add - это автоматически зарегистрирует библиотеку типов, после чего мастер импорта можно закрыть (понятно, что для регистрации IDE должна быть запущена под администратором). Альтернативно, можно использовать утилиты regtlib.exe или regtlibv12.exe от Microsoft-а.&lt;br /&gt;&lt;br /&gt;После регистрации библиотека типов доступна в списке всех библиотек и мы можем отметить её галочкой. После чего у нас появится возможность использовать IStream.&lt;br /&gt;&lt;br /&gt;Однако, если потом эту библиотеку типом импортировать в Delphi - она создаст заголовочник без ссылки на существующее объявление IStream, а вместо этого добавит новое определение. В связи с чем мы получим проблемы из-за несовместимости типов IStream из стандартного модуля и нашего заголовочника. Причём это же происходит и с Microsoft-скими библиотеками типов при импорте их в Delphi.&lt;br /&gt;&lt;br /&gt;Понятно, что автосгенерированные заголовочники можно легко подправить: вписать в uses модуль ActiveX, а дублирующееся объявление IStream удалить. Но... это будет ручная обработка, которой я и хотел избежать.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/373573384186586137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/373573384186586137'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326053059869#c373573384186586137' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-9085173270507156862</id><published>2012-01-08T21:36:56.887+04:00</published><updated>2012-01-08T21:36:56.887+04:00</updated><title type='text'>Посмотрел примеры TLB от Microsoft - в них IStream...</title><content type='html'>Посмотрел примеры TLB от Microsoft - в них IStream вполне себе используется. Например, в imapi2.tlb. Только он не импортируется, а объявлен прямо в этой же библиотеке типов. Исходник этой библиотеки типов (imapi2.idl) содержит строку &lt;br /&gt;&lt;br /&gt;import &amp;quot;objidl.idl&amp;quot;;&lt;br /&gt;&lt;br /&gt;Т.е. в &amp;quot;нашу&amp;quot; библиотеку типов импортируется файл objidl.idl. Таким образом, получается, что это - правильное решение.&lt;br /&gt;&lt;br /&gt;Правда, я без понятия, как это сделать с редактором библиотек типов Delphi. &lt;br /&gt;&lt;br /&gt;Поэтому предлагаю попробовать сделать такой финт ушами: библиотеки типов типа imapi2.tlb (или других, где есть определение IStream) - они стандартные. Т.е. они уже зарегистрированы в системе. И в них есть нужное нам определение. Поэтому, когда мы создали в Delphi библиотеку типов, можно перейти на вкладку &amp;quot;Uses&amp;quot;, щёлкнуть по списку правой кнопкой мыши и выбрать пункт меню &amp;quot;Show all type libraries&amp;quot;, после чего отыскать в списке стандартную библиотеку типов с IStream (например, &amp;quot;Microsoft IMAP2 Base Functionality&amp;quot;) и установить напротив неё галочку. После этой нехитрой операции во всех полях выбора типов появится IStream* и другие типы, определённые в выбранной нами библиотеке типов.&lt;br /&gt;&lt;br /&gt;Список стандартных библиотек типов с определением IStream:&lt;br /&gt;&lt;br /&gt;cordebug.tlb&lt;br /&gt;imapi2.tlb&lt;br /&gt;imapi2fs.tlb&lt;br /&gt;metahost.tlb&lt;br /&gt;mscoree.tlb&lt;br /&gt;msvidctl.tlb&lt;br /&gt;SearchAPI.tlb&lt;br /&gt;tuner.tlb&lt;br /&gt;wdstptmgmt.tlb</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/9085173270507156862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/9085173270507156862'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326044216887#c9085173270507156862' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-3210377892105224456</id><published>2012-01-08T21:06:25.579+04:00</published><updated>2012-01-08T21:06:25.579+04:00</updated><title type='text'>Хм, про это я не знал.

Действительно, IStream нет...</title><content type='html'>Хм, про это я не знал.&lt;br /&gt;&lt;br /&gt;Действительно, IStream нет в стандартных библиотеках типов, потому что он не предназначен для маршалинга. Гм, мы не используем маршалинг, так что иметь его хотелось бы...&lt;br /&gt;&lt;br /&gt;Как я это вижу, правильное решение здесь - включить в наш IDL файл файл objidl.idl (в нём находится определение IStream). Проблема тут в том, что в редакторе библиотеки типов Delphi такое не сделать (или я не нашёл?).&lt;br /&gt;&lt;br /&gt;Нормальное (но не слишком удобное решение) с редактором Delphi - использовать IUnknown вместо IStream. Разработчик плагинов после импорта TLB может просто подключить (уже существующий) objidl.h и выполнить запрос IStream у IUnknown (о том, что это надо сделать, будет написано в документации). Это проще всего, но немного неудобно в использовании со стороны плагина (две лишние строчки кода на каждый параметр типа IStream).&lt;br /&gt;&lt;br /&gt;Ну или включить IStream в свою библиотеку типов, т.е. переописать его самому. Необязательно, кстати, делать это в отдельной библиотеке типов, можно и в основной. Тут есть два варианта - ввести новый тип или полностью продублировать старый (вместе с GUID). Как-то у меня есть сомнения в правильности последнего. Наверняка это будет работать, но ведь TLB планируется использовать для генерации заголовочников. Поэтому у нас появится новый что-то-там.h, где будет определение IStream. Получится, что у нас будет два файла (стандартный objidl.h и что-то-там.h), где определён IStream. Если же пойти по первому пути, то придётся написать свой TOleStream и свой TStreamAdapter (чтобы они работали с новым IMyStream). Это же нужно будет сделать и со стороны плагина. Так что вроде как с этим подходом в целом получается существенно больше проблем, чем с первыми двумя.&lt;br /&gt;&lt;br /&gt;Что здесь лучше всего сделать - я без понятия. Буду благодарен, если кто-то поделится своими мыслями/опытом. &lt;br /&gt;&lt;br /&gt;Я бы рекомендовал для начала использовать подход с IUnknown. Две строчки лишнего кода - не большая плата за уже написанный стандартный код. А в дальнейшем надо посмотреть на возможность подключения objidl.idl.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/3210377892105224456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/3210377892105224456'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326042385579#c3210377892105224456' 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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' 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-2590460270116515722</id><published>2012-01-08T18:26:27.212+04:00</published><updated>2012-01-08T18:26:27.212+04:00</updated><title type='text'>По поводу передачи файлов через IStream. Этот инте...</title><content type='html'>По поводу передачи файлов через IStream. Этот интерфейс описан в ObjIdl.h, но, по-видимому, не предназначен для импорта &lt;a href="http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/81f16da4-f62e-4454-8c86-4e83e67a1256" rel="nofollow"&gt;[ссылка]&lt;/a&gt;, т.е. его нет в списке доступных типов в редакторе библиотеки типов. Там описан способ решения, но тогда придется таскать повсюду свою библиотеку типов, единственная цель которой —  экспорт IStream, и регистрировать её. Да и ссылаться полученный код будет, если я правильно понял, на наше объявление IStream. Либо передавать в параметре IUnknown, а потом приводить его в IStream, что тоже по-моему не очень. Либо изобретать что-то своё.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/2590460270116515722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1702873441071265539/5777257077220706959/comments/default/2590460270116515722'/><link rel='alternate' type='text/html' href='http://www.gunsmoker.ru/2012/01/delphi-2-api.html?showComment=1326032787212#c2590460270116515722' title=''/><author><name>HeMet</name><uri>http://jiyuu-vn.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/2012/01/delphi-2-api.html' ref='tag:blogger.com,1999:blog-1702873441071265539.post-5777257077220706959' source='http://www.blogger.com/feeds/1702873441071265539/posts/default/5777257077220706959' type='text/html'/><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='blogger.itemClass' value='pid-1171394341'/></entry></feed>
