tag:blogger.com,1999:blog-241760482024-02-28T09:08:58.665+02:00Alexander Bozhko Bold&ECO blogАлександр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.comBlogger47125tag:blogger.com,1999:blog-24176048.post-27111404079843262932011-06-05T23:30:00.003+03:002011-06-06T00:02:25.848+03:00Новые проекты # 1Еще один проект. Наверное, на сегодняшний день одно из самых успешных моих начинаний - <a href="http://visualstudiofeeds.com/">Visual Studio Feeds.</a> Чему посвящен этот сайт видно из названия. Идея все та же. Новостная лента блогов, или RSS агрегатор, если угодно.http://www.blogger.com/img/blank.gif<br />Но за 4 с небольшим месяца удалось выйти на 600-650 хостов в сутки. И далеко не всегда это поисковый трафик. Около сотни человек в сутки приходят сюда "напрямую", очевидно "за новостями". Что не может не радовать.<br /><br />В настоящий момент в ленте свыше трех сотен блогов и их число продолжает расти.<br /><br />Тематика, как вы понимаете довольно широкая. Это может быть и <span style="font-weight:bold;">.Net</span> и разработка для <span style="font-weight:bold;">WP7</span>, и <span style="font-weight:bold;">Azure</span>, и <span style="font-weight:bold;">SharePoint</span>...<br /><br />Имеется и <a href="http://visualstudiofeeds.com/index.php?option=com_blog_calendar&view=blogcalendar&Itemid=64">русскоязычный раздел</a>. К сожалению, там пока что немного блогов. Но работы в этом направлении ведутся.<br /><br />Так, что для тех, кто хочет быть в курсе того, что нового в технологиях разработки от <span style="font-weight:bold;">Microsoft</span> - милости прошу...Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-76220708717493997392011-04-24T00:14:00.008+03:002011-04-24T01:17:47.257+03:00Новые проекты # 0С удивлением обнаружил, что данный блог до сих пор посещается. Что вызвало у меня двоякое чувство. <br /><br />С одной стороны это и хорошо. Написал нечто, что люди читают до сих пор. С другой - не очень. Больше года не писал-то. А, как выяснилось, в комментариях к постам люди меня о чем-то спрашивали... И даже устраивали между собой дискуссии. Увы, не увидел, не прочел, не ответил.<br /><br />Еще раз напоминаю, что <a href="http://delphi2010.ru/">мой блог, посвященный <span style="font-weight:bold;">Delphi </span>переехал</a>. <br /><br />А поскольку сюда, все же кто-то заходит, есть повод рассказать о своих новых проектах.<br /><br />Их у меня появилось довольно много. Думаю, по одному на пост, будет нормально.<br /><br />Здесь я упоминал о попытке создать новостной агрегатор, посвященный Google Wave. Увы, Google Wave не оправдал ожидания разработчиков. И Google Wave Feeds, просто перестал пополняться новостями. Я решил отказаться от него полностью, и даже предложил домен одному знакомому SEO специалисту. На что он мне сказал, что сайт не плохой, и разбрасываться двухлетними доменами, да еще и с какими-то пузомерками не следует. Англоязычный трафик зарабатывается не так уж и просто.<br /><br />Подумав над его словами, я решил поступить примерно так, как поступил Google. А именно переориентировать сайт в сторону <span style="font-weight:bold;">Android</span>. И хотя домен немного и не соответствует названию, думаю проект получился интересный. А дабы не возникало сомнений относительно контента, назвал я его <a href="http://googlewavefeeds.com/">Android feeds</a>.<br /><br />Суть все та же. Практически в реальном режиме времени, 1 раз в 15 минут, проверяются RSS каналы блогов, посвященных <span style="font-weight:bold;">Android</span>. Заголовки новых постов публикуются на сайте.<br /><br />В данный момент активно наполняется <a href="http://googlewavefeeds.com/rusblogs.html">русскоязычный раздел</a>.<br /><br />Списки блогов находятся <a href="http://googlewavefeeds.com/ilinks.html">здесь</a>. Если вы знаете интересные блоги по теме, не сочтите за труд мне сообщить. А если проект вам понравился и вы изыщите возможность поставить на него ссылочку - буду крайне признателен. Признательность может быть выражена в виде постового, временной сквозной ссылки или ценного подарка - лицензии на <a href="http://litexsoft.com/">маленькую программу</a>, написанную собственными руками (О ней я расскажу в одном из следующих постов). <br /><br />Кстати, с момента запуска <a href="http://www.delphifeeds.ru/">DelphiFeeds.ru</a> я довольно серьезно поднаторел в создании новостных агрегаторов. Теперь собирать новости с 200 - 300 блогов не проблема. И сайт не валится и блоги не путаются. Пришлось даже написать программу и пару PHP скриптов для этой цели.<br /><br />Но об этом я расскажу в следующий раз.Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-42892392768680765262010-01-30T02:14:00.001+02:002010-01-30T02:20:38.864+02:00Отчет. Январь 2010.<p>Так уж получилось, что <a href="http://mda-delphi.blogspot.com" target="_blank">http://mda-delphi.blogspot.com</a> стал блогом о <a href="http://delphi2010.ru/" target="_blank">блоге</a>. А заодно и "вестником проекта <a href="http://delphifeeds.ru" target="_blank">DelphiFeeds.Ru</a>".</p> <p>За сим, очередная подборка новостей.</p> <p>1. Уступая многочисленным пожеланиям, мы изменили дизайн <a href="http://delphifeeds.ru" target="_blank">DelphiFeeds.Ru</a>. Смотрите оценивайте. Все пожелания фиксируются и потихоньку исполняются. </p> <p>2. Результаты опроса о <a href="http://www.delphifeeds.ru/index.php?option=com_poll&id=15:vip2010" target="_blank">наиболее значимом нововведении в Delphi 2010</a>. И, соответственно, <a href="http://www.delphifeeds.ru/index.php?option=com_poll&id=16:dver" target="_blank">новый опрос</a>.</p> <p>3. Наконец-то дошли руки, и я изменил дизайн своего <a href="http://delphi2010.ru/" target="_blank">Delphi блога</a>. Все равно это не совсем то, что я хочу. Но руками править темы - у меня просто нет времени.</p> <p>4. Перевод <a href="http://delphi2010.ru/?p=163" target="_blank">цикла статей Роберта Лава</a> хотя и медленно, но продвигается. 8 из 11 опубликованных статей переведено. Вероятно, по окончанию процесса придется их вычитать. К сожалению, не хватает времени попробовать это все на практике. Зато появилась идея для собственного развернутого примера, который бы на пальцах позволил бы сравнить трудоемкость получения одного и того же результата в <strong>Delphi 2010</strong> и, скажем, <strong>Delphi 2009. </strong></p> <p>5. В скором времени планирую выложить давно обещанную сагу о создании нового интерфейса для старого проекта. Для тех, кто не в курсе,  напомню... Мои работодатели приняли решение "немного оживить проект". Естественно, в таких случаях, простейшим вариантом является "прикрутить" Ribbon интерфейс и скины. Было принято решение для этой цели <a href="http://delphi2010.ru/?page_id=270" target="_blank">купить DevExpress</a>. Вот чем все это закончилось я и собираюсь написать.</p> <p>6. Попал под пагубное влияние <a href="http://www.tdelphiblog.com" target="_blank">Алексея</a> и <a href="http://www.webdelphi.ru" target="_blank">Влада</a>, в связи с чем решил перевести процесс блогинга на, так сказать,  "научную основу". Посмотрим, чем все это обернется...</p> <p>7. Увлекшись работой над <strong>Delphifeeds</strong>, решил параллельно запустить несколько аналогичных проектов, работающих на том же принципе. С одной стороны, на них можно обкатывать свежие идеи, пробовать плагины и т.д. С другой стороны - А может из них вырастет что-то толковое. Чуть позже я представлю эти проекты.</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4ef8823a-bd6b-4c05-8ada-497299317139" class="wlWriterSmartContent">Technorati Теги: <a href="http://technorati.com/tags/Delphi" rel="tag">Delphi</a>,<a href="http://technorati.com/tags/Delphi%202010" rel="tag">Delphi 2010</a>,<a href="http://technorati.com/tags/%d0%ba%d1%83%d0%bf%d0%b8%d1%82%d1%8c%20DevExpress" rel="tag">купить DevExpress</a></div> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com2tag:blogger.com,1999:blog-24176048.post-73331192344629572682009-11-15T03:41:00.003+02:002009-12-15T02:27:39.971+02:00DelphiFeeds.ru запущен в тестовом режиме<p>В тестовом режиме запущен сайт <a title="http://www.delphifeeds.ru/" href="http://www.delphifeeds.ru/">http://www.delphifeeds.ru/</a>. Русскоязычный аналог DelphiFeeds.com.</p> <p>На текущий момент собираются RSS ленты с десяти сайтов, и еще с трех - в ручном режиме.</p> <p>Предложения, пожелания, вопросы можно оставить здесь: <a title="http://www.delphifeeds.ru/index.php/feed" href="http://www.delphifeeds.ru/index.php/feed">http://www.delphifeeds.ru/index.php/feed</a>.</p> <p> <br /> <br />Вы можете поддержать проект, разместив у себя в блоге кнопку: <br /> <br /><a title="DelphiFeeds.ru - Все Delphi-блоги Рунета" href="http://www.delphifeeds.ru/"><img height="31" alt="DelphiFeeds.ru - Все Delphi-блоги Рунета" src="http://www.delphifeeds.ru/images/stories/baner8.png" width="81" /></a></p> <p><a href="<a href="http://www.delphifeeds.ru/"">http://www.delphifeeds.ru/"</a> title="DelphiFeeds.ru - Все Delphi-блоги Рунета"><img src="<a href="http://www.delphifeeds.ru/images/stories/baner8.png"">http://www.delphifeeds.ru/images/stories/baner8.png"</a> alt="DelphiFeeds.ru - Все Delphi-блоги Рунета" width="81" height="31"/></a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-68779272085768919142009-10-07T02:06:00.001+03:002009-10-07T02:06:24.209+03:00Обновления на блоге<h4><a href="http://delphi2010.ru/?p=142">Delphi 2010. Что нового? #5 </a></h4> <p>Изменения в дебаггере.</p> <h4><a href="http://delphi2010.ru/?p=155">Смесь бульдога с носорогом </a></h4> <p>о переводе Delphi проекта на DevExpress.</p> <h4><a href="http://delphi2010.ru/?p=163">Delphi 2010. RTTI и атрибуты </a></h4> Думаю, что в рамках обзора новых возможностей Delphi 2010 будет уместно привести перевод <a href="http://robstechcorner.blogspot.com/2009/09/so-what-is-rtti-rtti-is-acronym-for-run.html">материалов "из первых рук"</a>. <h4><a href="http://delphi2010.ru/?p=166">Delphi 2010 RTTI – Основы. </a></h4> Перевод<a href="http://robstechcorner.blogspot.com/2009/09/delphi-2010-rtti-basics.html"> первой части обзора</a> новых возможностей RTTI системы в Delphi 2010. Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-49391228515941607112009-09-11T00:07:00.001+03:002009-09-11T00:07:59.287+03:00Delphi 2010. Что нового? #3, #4<p><a href="http://delphi2010.ru/?p=135" target="_blank">Часть 4</a></p> <p><a href="http://delphi2010.ru/?p=124" target="_blank">Часть 3</a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-53544310718494013582009-08-14T04:30:00.001+03:002009-08-14T04:30:10.365+03:00Delphi 2010. Что нового? #2<p>Изменений в IDE новой версии Delphi достаточно много. Хотя большинство из них косметиеские, возможно, о большинстве из них не стоит и упоминать. И, тем не менее, есть среди них и полезные вещи.</p> <p><a href="http://delphi2010.ru/?p=110" target="_blank">Читать дальше...</a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-90154197437942842982009-08-13T03:51:00.001+03:002009-08-13T03:51:59.696+03:00Delphi 2010. Что нового? #1<p>К сожалению, явно не хватает времени плотно потестить бету. Но все же, ознакомиться с нововведениями очередной версии Delphi - дело святое.</p> <p><a href="http://delphi2010.ru/?p=94#more-94" target="_blank">Постараюсь по порядку.</a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-18315587274742557272009-08-06T03:52:00.001+03:002009-08-06T03:52:37.444+03:00Обновления в блоге<p><a href="http://delphi2010.ru/?p=83" target="_blank">Переопределение визуальных компонентов</a>.</p> <p>Немного собственных наблюдений.</p> <p><a href="http://delphi2010.ru/?p=87">Использование Microsoft Bing API в Delph</a>i</p> <p>Перевод статьи.</p> <p><a href="http://delphi2010.ru/?p=92" target="_blank">Дата выхода Delphi 2010</a></p> <p>Официальная информация от Embarcadero</p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-24311979217711389192009-07-22T04:19:00.000+03:002009-07-22T04:21:32.817+03:00Фреймы, как визуальные компоненты, изменение наследования<p>Фреймы в Delphi  - интересная штука, которая может создать проблемы "на ровном месте". Попытка перевода <a href="http://wiert.wordpress.com/2009/07/17/delphi-frames-as-visual-components-changing-your-inheritance/#">статьи</a> на эту тему.</p> <p><a href="http://delphi2010.ru/?p=71" target="_blank">http://delphi2010.ru/?p=71</a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-66466112586532343542009-07-18T10:59:00.000+03:002009-07-18T11:01:10.457+03:00Журналы, посвященные Delphi…<p>Небольшой обзор Delphi прессы. И несколько сумбурные мысли  по этому поводу...</p> <p><a href="http://delphi2010.ru/?p=65" target="_blank">Читать полный текст...</a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-56957311949064418592009-07-03T22:53:00.001+03:002009-07-03T22:53:51.227+03:00Будущее Delphi<p>Третьего дня мне попалась на глаза <a href="http://www.devia.be/news/article/the-future-of-delphi-looks-brighter-than-ever-before/">интересная статья</a> - отчет о выступлении Дэвида И (David I) в Бельгии. <a href="http://delphi2010.ru/?p=48" target="_blank">Вот попытка ее перевода</a>.</p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-25428896038058344822009-07-03T22:41:00.001+03:002009-07-03T22:41:04.367+03:00Переезд<p>Решил я перевести свой блог на собственный хостинг и домен.</p> <p>К тому же домен безхозный лежал так хорошо, вот я его и подобрал.</p> <p>Новый адрес блога: <a href="http://delphi2010.ru/" target="_blank">http://delphi2010.ru/</a></p> <p>Здесь же я буду некоторое время давать линки на посты в новом блоге.</p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-72719039656169275462009-06-30T03:39:00.001+03:002009-06-30T03:39:07.769+03:00Delphi 2009 Handbook бесплатно.<p><strike></strike></p> <p><a href="http://blog.marcocantu.com/">Марко Кэнту</a>, автор известных книг Mastering Delphi, в свое время жаловался, что его последняя книга, Delphi 2009 Handbook разошлась по файлообменникам. Он ее лично видел на Рапиде. Теперь ее можно получить бесплатно. Для этого следует просто посмотреть, что из себя представляет RAD Studio 2009 (это для тех, кто еще ее не видел :) ).</p> <p>Рекомендую.</p> <ol> <li><a href="http://downloads.embarcadero.com/free/rad_studio">Скачайте</a> <a href="http://downloads.embarcadero.com/free/rad_studio">RAD Studio 2009 trial</a></li> <li>Установите и зарегистрируйте триал</li> <li>Скачайте<a href="http://cc.embarcadero.com/item/26311"> the Delphi 2009 Handbook</a> (линк станет доступен после установки Rad Studio 2009) </li> </ol> <p><a href="http://edn.embarcadero.com/article/39629">Источник</a></p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com1tag:blogger.com,1999:blog-24176048.post-80173704763156112352009-04-30T17:53:00.002+03:002009-04-30T17:59:41.404+03:00ASProtect и Delphi 2009<p>В принципе все оказалось довольно не сложно.</p> <p><a href="http://aspack.com/asprotectske.aspx">ASProtect</a> вполне нормально работает с Delphi 2009. Естественно, нужно просто делать преобразование строк при вызове ASProtect API  функций.</p> <p>Вот преобразованная процедура из стандартного примера:<pre class="delphi" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">procedure</span> TfrmRegKey<span style="color: #000066;">.</span><span style="color: #006600;">btnRegOkClick</span><span style="color: #000066;">(</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span><br /><span style="color: #000000; font-weight: bold;">begin</span><br /> <br /><span style="color: #808080; font-style: italic;">// If CheckKeyAndDecrypt( PChar(eCode.Text), PChar(eName.Text), True ) then</span><br /> <br /><span style="color: #808080; font-style: italic;">// Для Delphi 2009 будет так:</span><br /><span style="color: #000000; font-weight: bold;">If</span> CheckKeyAndDecrypt<span style="color: #000066;">(</span> <span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">(</span><span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">(</span>eCode<span style="color: #000066;">.</span><span style="color: #006600;">Text</span><span style="color: #000066;">)</span><span style="color: #000066;">)</span><span style="color: #000066;">,</span> <span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">(</span><span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">(</span>eName<span style="color: #000066;">.</span><span style="color: #006600;">Text</span><span style="color: #000066;">)</span><span style="color: #000066;">)</span><span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">True</span> <span style="color: #000066;">)</span> <span style="color: #000000; font-weight: bold;">then</span><br /> <span style="color: #000000; font-weight: bold;">begin</span><br /> MessageBox<span style="color: #000066;">(</span>Handle<span style="color: #000066;">,</span> <span style="color: #ff0000;">'Thank you for your registration!'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Registration'</span><span style="color: #000066;">,</span> MB_ICONINFORMATION<span style="color: #000066;">)</span><span style="color: #000066;">;</span><br /> <span style="color: #000066;">Close</span><span style="color: #000066;">;</span><br /> <span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span><br /> MessageBox<span style="color: #000066;">(</span>Handle<span style="color: #000066;">,</span> <span style="color: #ff0000;">'Key is not valid, please contact manufacture!'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'Registration'</span><span style="color: #000066;">,</span> MB_ICONWARNING<span style="color: #000066;">)</span><span style="color: #000066;">;</span><br /> <br /><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></pre> <p>К слову, месяц назад вышел ASProtect SKE 2.5 Release. Так, что слухи о том, что продукт умер – преувеличены.</p> <ul> <li>Improved map-files parsing </li> <li>Various Help file corrections </li> <li>Fixed application termination instead of displaying Trial Reminder if no trial counters have been used </li> <li>Fixed aspr_ide crash under Delphi IDE.</li> </ul>Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com2tag:blogger.com,1999:blog-24176048.post-91488451855938836602009-04-04T03:43:00.002+03:002009-04-04T03:48:05.602+03:00Благими намерениямиВ одном из форумов вычитал...<br /><blockquote>Подскажите компонент для работы с фискальными кассовыми устройствами (IO). Желательно с сырцами. Спасибо.</blockquote><br />Тут же захотелось попросить компонент для посадки льва в клетку.<br />Хотя, может действительно есть и такие компоненты...<br />Но по -моему, подобные посты ни что иное, как нормальная идея, доведенная до абсурда.Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com3tag:blogger.com,1999:blog-24176048.post-41692200144549547472009-03-15T13:05:00.020+02:002009-04-30T18:56:25.238+03:00Использование Vista UAC в Delphi: Часть 3<p>Это заключительная часть серии из трех частей о UAC и Delphi. <br />Перейти к части 1<br />Перейти к части 2</p> <p>Здесь я затрону наиболее интересные подходы к обеспечению подлинного UAC соответствия – в том виде, в каком вероятно, следует реализовывать большинство Vista-совместимых приложений. </p> <p>Повышение прав по запросу с использованием COM Elevation Moniker</p><p>Первая вещь, которую в которой вы должны быть уверены, это то, что исполняемый файл приложения содержит UAC манифест. Манифест, практически идентичный тому, который вы могли видеть в части 2, с одним, но очень важным отличием: атрибут requestedExecutionLevel должен иметь значение "<b>asInvoker</b>":</p> <pre class="delphi" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><?xml version<span style="color: #000066;">=</span>"<span style="color: #0000ff;">1.0</span>" encoding<span style="color: #000066;">=</span>"UTF<span style="color: #000066;">-</span><span style="color: #0000ff;">8</span>" standalone<span style="color: #000066;">=</span>"yes"?></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><assembly xmlns<span style="color: #000066;">=</span>"urn<span style="color: #000066;">:</span>schemas<span style="color: #000066;">-</span>microsoft<span style="color: #000066;">-</span>com<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">asm</span><span style="color: #000066;">.</span><span style="color: #006600;">v1</span>" manifestVersion<span style="color: #000066;">=</span>"<span style="color: #0000ff;">1.0</span>"> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <assemblyIdentity</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> version<span style="color: #000066;">=</span>"1<span style="color: #000066;">.</span>0<span style="color: #000066;">.</span>0<span style="color: #000066;">.</span>0"</div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> processorArchitecture<span style="color: #000066;">=</span>"<span style="color: #000066;">*</span>"</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> name<span style="color: #000066;">=</span>"UACAwareApplication"</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">type</span><span style="color: #000066;">=</span>"win32"<span style="color: #000066;">/</span>> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <trustInfo xmlns<span style="color: #000066;">=</span>"urn<span style="color: #000066;">:</span>schemas<span style="color: #000066;">-</span>microsoft<span style="color: #000066;">-</span>com<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">asm</span><span style="color: #000066;">.</span><span style="color: #006600;">v3</span>"></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <security></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <requestedPrivileges></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <requestedExecutionLevel level<span style="color: #000066;">=</span>"asInvoker"<span style="color: #000066;">/</span>></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <<span style="color: #000066;">/</span>requestedPrivileges></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <<span style="color: #000066;">/</span>security></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <<span style="color: #000066;">/</span>trustInfo></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><<span style="color: #000066;">/</span>assembly></div></li></ol></pre><br /><p>Этот манифест заставляет Vista назначить процессу привилегии по умолчанию при запуске приложения. Если в этот момент уровень доступа более низким, приложение будет вынуждено запрашивать повышение привилегий, каждый раз, когда пользователь выполняет действия, требующие административных привилегий. Это именно то, чего мы пытались добиться ранее.</p><p>Прежде чем продолжить, я объясню, как повышение привилегий работает изнутри…</p><p>Когда процесс стартует, ему присваивается уровень доступа Windows, который контролирует то, что этот процесс может или не может сделать, с некоторыми объектами, такими как файлы и каталоги, имеющими списки управления доступом (Access Control Lists или ACL's, для краткости) к себе. Что здесь важно, так это то, что уровень доступа, который присваивается фактически единожды, в момент запуска процесса, не может быть изменен на более поздних этапах жизни процесса. Следовательно, повышение привилегий, возможно одним единственным способом - порождением нового процесса с более высоким уровнем привилегий. Зная об этом, менее требовательные приложения, которые не нуждаются в использовании сложных состояний пользовательского интерфейса, могут просто перезапускать себя в админском режиме и работать.</p><p>Для большинства приложений, однако, это не приемлемо, потму, что перезапуск обычно означает длительную паузу и сложности, связанные с сохранением и восстановлением состояний пользовательского интерфейса.</p><br /><p>Вместо этого, есть другое решение для таких случаев. Код приложения может быть разбит на две части – не привилегированный код размещается в основном исполняемом файле, в то время, как код, требующий привилегий выносится в отдельную dll, оформленную как один или несколько COM объектов. COM объекты могут вызываться COM посредствам Elevation Moniker в контексте выделенного COM-сервера, который и повышает привилегии.</p><p>Довольно теории. Выполним некоторые действия.</p><p>Здесь мы должны сделать следующее:</p><p>написать dll, которая будет загружаться выделенным COM – сервером;</p><p>добавить COM-объект, реализующий функциональность, требующую привилегий; </p><p>добавить COM class factory, которая будет использоваться для создания экземпляра COM объекта и регистрации библиотеки, и</p><p>написать какой-то код для вызова COM объекта из главного исполняемого файла, который изначально не обладает привилегиями.</p><p>До настоящего момента, ничего не говорилось о создании dll. Эта обычная COM библиотека может быть создана в Delphi путем следующих действий:</p><p>"New" -> "Other..." -> "Delphi Projects"\"ActiveX" -> "ActiveX Library", как это показано на скриншоте.</p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj44YAwAW_zUCYrjO6DSYOP7A_YkOqAhVIyEdIWGFevoWAfWlu-I6gMqCJ7uJF4YBQVZpAYewOnoTfFdnXuvqkpY44iJEhtSkwA3IHLdcptf0f8yD85yZt8if2ZdOcXFCuo_bVF/s1600-h/clip_image002%5B1%5D%5B2%5D.jpg"><img title="clip_image002[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="184" alt="clip_image002[1]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyCq3GqOaPSavuMuJ68JGKvq2Znq6aW-F5GlmnGU_gVujc58gfpy7pY7XbWp_WKBac1uZmsaJR5E6zeHcVc7GZYRaOgEoUb6V6gnY6zRkipKriMkVy7pMf0a3jxm9cI1MmaedM/?imgmax=800" width="244" border="0" /></a></p><p>Как только мы создали и сохранили новый COM library проект, нам необходимо добавить новый COM объект, в котором мы реализуем функционал повышения привилегий.</p><br /><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz5W-6G5UhCTgyZae0lIR8WcMt7_wpuRGfWvTPfhYgc9uzVBzF9Ppl21uK4X_tc4-gB8Bi6838c0KBXXVqK5hsyiIsIpbKWo18TtQkNs0n6dGlgEbv4A1vnj0bJhZlWyaAAogd/s1600-h/clip_image004%5B1%5D%5B2%5D.jpg"><img title="clip_image004[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="216" alt="clip_image004[1]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIMWW2aV1OpIcFmpzLsqbQC9k4bwcJW242HC4bj8UeVbPWuAb2F1l8g_YQbhIDotdsRCEpLWU9sECRAVJ_ZbKNRy2w4yoloZx0LeKmZiaZRKnEuWfidejK5dT6qcKd8jdBv4D/?imgmax=800" width="244" border="0" /></a></p><p>В демонстрационных целях мы определим единственный метод COM объекта, и опишем его с помощью интерфейса объекта по умолчанию:</p><br /><pre class="delphi" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">IMyPrivilegedObject <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">interface</span><span style="color: #000066;">(</span><span style="color: #000066; font-weight: bold;">IUnknown</span><span style="color: #000066;">)</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000066;">[</span><span style="color: #ff0000;">'{04004D01-2115-40D5-991F-D258C8CEF07E}'</span><span style="color: #000066;">]</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">function</span> CreateFile<span style="color: #000066;">(</span><span style="color: #000000; font-weight: bold;">const</span> aFileName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">WideString</span><span style="color: #000066;">)</span><span style="color: #000066;">:</span> HResult<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">stdcall</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li></ol></pre><p>Этот метод позволит нам проверить, действительно ли COM объект привязывается к процессу повышения привилегий.</p><p>Теперь нам нужно создать пользовательскую фабрику классов (Class Factory) для нашего COM объекта. Это нужно по той причине, что Class Factory отвечает за регистрацию и удаление (unregistering) COM объекта в системном реестре. Мы не можем просто по умолчанию использовать TTypedComObjectFactory, потому существуют некоторые специальные значения, которые должны быть прописаны в реестре, для того, чтобы сделать возможным размещение вне процесса и независимое повышение привилегий.</p><p>Приложения не могут просто запрашивать у Windows повышение привилегий подобно тому, как это делает любой OLE код. Если бы оно могло делать это, это была бы серьезная дыра в системе безопасности. Любой код, который должен быть выполнен с повышенными привилегиями, должен быть помещен в COM объект, расположенный в dll, который должен быть подготовлен к повышению привилегий.</p><p>Здесь основная часть реализации фабрики классов.</p><pre class="delphi" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">type</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> TPrivilegedClassFactory <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><span style="color: #000066;">(</span>TTypedComObjectFactory<span style="color: #000066;">)</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">private</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> fResourceId<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">public</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">constructor</span> Create<span style="color: #000066;">(</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">const</span> aResourceId<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aComServer<span style="color: #000066;">:</span> TComServerObject<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aTypedComClass<span style="color: #000066;">:</span> TTypedComClass<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">const</span> aClassID<span style="color: #000066;">:</span> TGUID<span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aInstancing<span style="color: #000066;">:</span> TClassInstancing<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aThreadingModel<span style="color: #000066;">:</span> TThreadingModel <span style="color: #000066;">=</span> tmSingle</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">procedure</span> UpdateRegistry<span style="color: #000066;">(</span>aRegister<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Boolean</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">override</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">implementation</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">constructor</span> TPrivilegedClassFactory<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">(</span><span style="color: #000000; font-weight: bold;">const</span> aResourceId<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aComServer<span style="color: #000066;">:</span> TComServerObject<span style="color: #000066;">;</span> aTypedComClass<span style="color: #000066;">:</span> TTypedComClass<span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">const</span> aClassID<span style="color: #000066;">:</span> TGUID<span style="color: #000066;">;</span> aInstancing<span style="color: #000066;">:</span> TClassInstancing<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aThreadingModel<span style="color: #000066;">:</span> TThreadingModel<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">begin</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">inherited</span> Create<span style="color: #000066;">(</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aComServer<span style="color: #000066;">,</span> aTypedComClass<span style="color: #000066;">,</span> aClassID<span style="color: #000066;">,</span> aInstancing<span style="color: #000066;">,</span> aThreadingModel</div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #808080; font-style: italic;">{ Save the id of the string resource, that holds the application name. }</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> fResourceId <span style="color: #000066;">:</span><span style="color: #000066;">=</span> aResourceId<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">procedure</span> TPrivilegedClassFactory<span style="color: #000066;">.</span><span style="color: #006600;">UpdateRegistry</span><span style="color: #000066;">(</span>aRegister<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Boolean</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">var</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> ID<span style="color: #000066;">,</span> ClassKey<span style="color: #000066;">,</span> FullFileName<span style="color: #000066;">,</span> FileName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">begin</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> ID <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">GUIDToString</span><span style="color: #000066;">(</span><span style="color: #000000; font-weight: bold;">Self</span><span style="color: #000066;">.</span><span style="color: #006600;">ClassID</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> ClassKey <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'CLSID\'</span> <span style="color: #000066;">+</span> ID<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> FullFileName <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ComServer<span style="color: #000066;">.</span><span style="color: #006600;">ServerFileName</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> FileName <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">ExtractFileName</span><span style="color: #000066;">(</span>FullFileName<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">try</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">if</span> aRegister <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000000; font-weight: bold;">begin</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">inherited</span> UpdateRegistry<span style="color: #000066;">(</span>aRegister<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #808080; font-style: italic;">{ DLL out-of-process hosting requirements. }</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> CreateRegKey<span style="color: #000066;">(</span><span style="color: #ff0000;">'AppID\'</span> <span style="color: #000066;">+</span> ID<span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">,</span> Description<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> CreateRegKey<span style="color: #000066;">(</span><span style="color: #ff0000;">'AppID\'</span> <span style="color: #000066;">+</span> ID<span style="color: #000066;">,</span> <span style="color: #ff0000;">'DllSurrogate'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> CreateRegKey<span style="color: #000066;">(</span><span style="color: #ff0000;">'AppID\'</span> <span style="color: #000066;">+</span> FileName<span style="color: #000066;">,</span> <span style="color: #ff0000;">'AppID'</span><span style="color: #000066;">,</span> ID<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #808080; font-style: italic;">{ Over-The-Shoulder activation requirements. }</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> SetAccessPermissionsForLUAServer<span style="color: #000066;">(</span><span style="color: #ff0000;">'AppID\'</span> <span style="color: #000066;">+</span> ID<span style="color: #000066;">,</span> <span style="color: #ff0000;">'AccessPermission'</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #808080; font-style: italic;">{ COM object elevation requirements. }</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> CreateRegKey<span style="color: #000066;">(</span>ClassKey<span style="color: #000066;">,</span> <span style="color: #ff0000;">'AppID'</span><span style="color: #000066;">,</span> ID<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> CreateRegKey<span style="color: #000066;">(</span>ClassKey<span style="color: #000066;">,</span> <span style="color: #ff0000;">'LocalizedString'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'@'</span> <span style="color: #000066;">+</span> FullFileName <span style="color: #000066;">+</span> <span style="color: #ff0000;">',-'</span> <span style="color: #000066;">+</span> fResourceId<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> CreateRegKeyEx<span style="color: #000066;">(</span>ClassKey <span style="color: #000066;">+</span> <span style="color: #ff0000;">'\Elevation'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Enabled'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'1'</span><span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span> REG_DWORD<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">begin</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> DeleteRegKey<span style="color: #000066;">(</span>ClassKey <span style="color: #000066;">+</span> <span style="color: #ff0000;">'\Elevation'</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> DeleteRegKey<span style="color: #000066;">(</span><span style="color: #ff0000;">'AppID\'</span> <span style="color: #000066;">+</span> ID<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> DeleteRegKey<span style="color: #000066;">(</span><span style="color: #ff0000;">'AppID\'</span> <span style="color: #000066;">+</span> FileName<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">inherited</span> UpdateRegistry<span style="color: #000066;">(</span>aRegister<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">except</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">on</span> E<span style="color: #000066;">:</span> EOleRegistrationError <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">raise</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">on</span> E<span style="color: #000066;">:</span> Exception <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #000000; font-weight: bold;">raise</span> EOleRegistrationError<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">(</span>E<span style="color: #000066;">.</span><span style="color: #006600;">Message</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li></ol></pre><br /><pre>Как отмечено в комментариях, существуют три требования, которые должны быть удовлетворены: регистрация размещения вне процесса, регистрация «обратной» (Over-The-Shoulder) активации, регистрация превышения привилегий. Вы можете найти объяснение каждого из требований здесь, поэтому нет необходимости дублировать информацию.</pre><br /><pre>Я только хочу отметить, что такие фабрики классов являются типичными, и могут быть использованы в любых Delphi приложениях, требующих повышения привилегий. Параметр aResourceId хранит ID ресурсной строки, которая будет отображаться в запросе на превышение в качестве имени приложения. Будьте готовы использовать валидный ID из строковой таблицы dll!</pre><br /><pre>Теперь мы должны использовать новую фабрику классов для создания COM объекта, и встроить строковый ресурс в нашу dll:</pre><br /><pre class="delphi" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">initialization</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> TPrivilegedClassFactory<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">(</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #ff0000;">'101'</span><span style="color: #000066;">,</span> <span style="color: #808080; font-style: italic;">// resource string id</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> ComServer<span style="color: #000066;">,</span> TMyPrivilegedObject<span style="color: #000066;">,</span> Class_MyPrivilegedObject<span style="color: #000066;">,</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> ciMultiInstance<span style="color: #000066;">,</span> tmApartment</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li></ol></pre><pre>Это файл ресурсов со строкой, которая будет отображаться в запросе на превышение привилегий.</pre><br /><pre>STRINGTABLE</pre><br /><pre>{</pre><br /><pre>101, "Delphi Elevation Demo"</pre><br /><pre>}</pre><br /><pre>Последняя вещь, которую осталось сделать, это написать процедуру, которая будет вызываться из не привилегированного исполняемого файла в процессе вызова COM  объекта. Вот она:</pre><pre class="delphi" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">procedure</span> CoCreateInstanceAsAdmin<span style="color: #000066;">(</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> aHWnd<span style="color: #000066;">:</span> HWND<span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">// parent for elevation prompt window</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">const</span> aClassID<span style="color: #000066;">:</span> TGUID<span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">// COM class guid</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">const</span> aIID<span style="color: #000066;">:</span> TGUID<span style="color: #000066;">;</span> <span style="color: #808080; font-style: italic;">// interface id implemented by class</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> out aObj <span style="color: #808080; font-style: italic;">// interface pointer</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">implementation</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">procedure</span> CoCreateInstanceAsAdmin<span style="color: #000066;">(</span>aHWnd<span style="color: #000066;">:</span> HWND<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">const</span> aClassID<span style="color: #000066;">,</span> aIID<span style="color: #000066;">:</span> TGUID<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> out aObj<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">var</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> BO<span style="color: #000066;">:</span> BIND_OPTS3<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> MonikerName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">WideString</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">begin</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">(</span><span style="color: #000000; font-weight: bold;">not</span> IsElevated<span style="color: #000066;">)</span> <span style="color: #000000; font-weight: bold;">then</span> <span style="color: #000000; font-weight: bold;">begin</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #808080; font-style: italic;">{ Request elevated out-of-process instance. }</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> MonikerName <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'Elevation:Administrator!new:'</span> <span style="color: #000066;">+</span> <span style="color: #000066;">GUIDToString</span><span style="color: #000066;">(</span>aClassID<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000066;">FillChar</span><span style="color: #000066;">(</span>BO<span style="color: #000066;">,</span> <span style="color: #000066;">SizeOf</span><span style="color: #000066;">(</span>BIND_OPTS3<span style="color: #000066;">)</span><span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> BO<span style="color: #000066;">.</span><span style="color: #006600;">cbStruct</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">SizeOf</span><span style="color: #000066;">(</span>BIND_OPTS3<span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> BO<span style="color: #000066;">.</span><span style="color: #006600;">dwClassContext</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CLSCTX_LOCAL_SERVER<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> BO<span style="color: #000066;">.</span><span style="color: #006600;">hwnd</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> aHWnd<span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> OleCheck<span style="color: #000066;">(</span>CoGetObject<span style="color: #000066;">(</span><span style="color: #000066; font-weight: bold;">PWideChar</span><span style="color: #000066;">(</span>MonikerName<span style="color: #000066;">)</span><span style="color: #000066;">,</span> <span style="color: #000066;">@</span>BO<span style="color: #000066;">,</span> aIID<span style="color: #000066;">,</span> aObj<span style="color: #000066;">)</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #000000; font-weight: bold;">end</span> <span style="color: #000000; font-weight: bold;">else</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #808080; font-style: italic;">{ Request normal in-process instance. }</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> OleCheck<span style="color: #000066;">(</span>CoCreateInstance<span style="color: #000066;">(</span>aClassID<span style="color: #000066;">,</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">,</span> CLSCTX_ALL<span style="color: #000066;">,</span> aIID<span style="color: #000066;">,</span> aObj<span style="color: #000066;">)</span><span style="color: #000066;">)</span><span style="color: #000066;">;</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span></div></li></ol></pre><br /><pre>Здесь находится полный исходный код ElevationDemo в формате Delphi 2006 for Win32 проекта вмести с скомпилированными и подписанными бинарниками, так что вы можете протестировать их без компиляции. Конечно, вы для этого должны использовать Windows Vista. Когда вы запустите исполняемый файл, вы увидите нечто подобное:</pre><pre><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXU16BrAt5vhAybYYT5itrehd6SFdis_IAJLBXekdMZlBqm564EGAFLH2v6eLdSHZFkfqk40LGn2NLhwd8Wjhu4t1iOpPFEZmR3yS4lpiGFL02NhmF-dmkfj3afs7At7ZQFtkQ/s1600-h/clip_image006%5B1%5D%5B2%5D.jpg"><img title="clip_image006[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="78" alt="clip_image006[1]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo30vQI_P7c8WaVJ_oNCAy-DfLtkWhpv1pSuWuXye6OSRrksQ3pZGmg_jLI9ZUYXHmBeZP4qcTaPA6YkdrzzbsRbgfOObR6GbNt185R5a5r7UWiP-aMFGd7wlDcyXNLY0_qCDD/?imgmax=800" width="244" border="0" /></a></pre><p>Чекбокс определяет будет ли вызываться COM объект, запрашивающий повышение привилегий или локальный COM объект, в случае вызова CreateFile(). Вы можете поэкспериментировать, вводя разные имена файлов в поле ввода.</p><p>Исходный код создан с использованием некоторых специфических Vista-структур, но для простоты я не включал код проверки ОС, пусть это будет домашним заданием для читателя.</p><p>Не забудьте сначала зарегистрировать DLL (для этого вам понадобятся привилегии Admin’а), в противном случае приложение не заработает. Обычно, это задача инсталлятора, но вы это можете сделать вручную:</p><p>regsvr32.exe PrivilegedLib.dll</p><p>здесь показано, как будет выглядеть ваш реестр после полной инсталляции: </p><br /><pre class="cpp" style="font-family:monospace;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">HKEY_LOCAL_MACHINE\SOFTWARE\Classes</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #008000;">{</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> AppID\PrivilegedLib.<span style="color: #007788;">dll</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #008000;">{</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #008000;">(</span>Default<span style="color: #008000;">)</span><span style="color: #008080;">:</span> REG_SZ <span style="color: #000080;">=</span> null</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> AppID<span style="color: #008080;">:</span> REG_SZ <span style="color: #000080;">=</span> <span style="color: #FF0000;">'{6BCFB187-C1DD-4807-96AD-F91AB4AB08AC}'</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #008000;">}</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> AppID\<span style="color: #008000;">{</span>6BCFB187<span style="color: #000040;">-</span>C1DD<span style="color: #000040;">-</span><span style="color: #0000dd;">4807</span><span style="color: #000040;">-</span>96AD<span style="color: #000040;">-</span>F91AB4AB08AC<span style="color: #008000;">}</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #008000;">{</span></div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #008000;">(</span>Default<span style="color: #008000;">)</span><span style="color: #008080;">:</span> REG_SZ <span style="color: #000080;">=</span> <span style="color: #FF0000;">'MyPrivilegedObject'</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> AccessPermission<span style="color: #008080;">:</span> REG_BINARY <span style="color: #000080;">=</span> <span style="color: #000080;"><</span>BINARY VALUE<span style="color: #000080;">></span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> DllSurrogate<span style="color: #008080;">:</span> REG_SZ <span style="color: #000080;">=</span> <span style="color: #FF0000;">''</span></div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> </div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"> <span style="color: #008000;">}</span></div></li></ol></pre><br>Если все прошло нормально, вы должны будете увидеть один из следующих диалогов, после того, как вы выполните вызов запроса на превышение привилегий – вид диалога зависит от ваших настроек безопасности.<pre><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYziaAFLE1NBf0a0NQ7rVbSGtiPrzP4gja1Nsx1_rzU5-umlv_xgPd2U1egoZqOcEVNDEJQ_bCoBvnrGfnCKqVtuAd8JBXepYAsEzi7SmF2t2zXrtNgNP7GGlwZSBvkJFxByGdfw/s1600-h/ElevationPrompt1.jpg"><img title="clip_image007[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="136" alt="clip_image007[1]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi97kDpXM90I7aHVDgrzSQBPZFVTj1d1qNe448XAjBQSJmXeLjLbOIIl33hsNtKXDtHf6aFyDhj5jrb6WGjr3HZIdmdWygYVEuGIO_Bz_WP15AWdANelgASTSLrKETThwPEjO7U/?imgmax=800" width="244" border="0" /></a><br /><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHIRUKuW1nEpr61XWW4F7Jj6DQ5sdlFbk2bJ5VdS4dIm4r503duAAE9yj6rYej9c72WT3cdfzufKEh-Z_rcIJUFsHyonKTqpgpPPHwicj4YMJyk1rsBWRoCQfEjyNFoTy1pz1pCg/s1600-h/ElevationPrompt2.jpg"><img title="clip_image008[1]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="200" alt="clip_image008[1]" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGY0V51bX7qBR5EFNEYW_43SaRjKjWvOHrCd_3-In8zt158yi0dC0gc0OEBEvgO3vShtgPjPXNrVo6bqYIe-Z64yG2MZlYW1ROhQLNT3B-923KiY_LchPngMxx1c_LXVJ7gOcp/?imgmax=800" width="244" border="0" /></a></pre><br>Ну вот и все. Я надеюсь, что вам понравилась эта серия. Я уверен, что показал все важнейшие шаги по созданию UAC-aware приложения в Delphi. Естественно, что я опустил массу деталей, чтобы не слишком вас утомлять – но это тема для отдельной публикации на будущее. Как всегда, присылайте свои комментарии и пожелания.Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com6tag:blogger.com,1999:blog-24176048.post-85639258494181411072009-02-15T13:02:00.001+02:002009-02-15T13:02:11.179+02:00Delphi 14 лет<p>14 февраля 1995 г. вышел официальный релиз Delphi 1.</p> <p>Поздравления всему Delphi сообществу!</p> <p><a href="http://skiminog.livejournal.com/42443.html">Источник</a>.</p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-11209988886557962172009-02-12T20:07:00.008+02:002009-02-12T20:36:23.461+02:00Использование Vista UAC в Delphi: Часть 2<p align="justify"><a href="http://developersoven.blogspot.com/2007/02/leveraging-vistas-uac-with-delphi-part_27.html">Оригинал</a>.</p> <p align="justify">Это вторая часть серии статей о UAC и Delphi, состоящей из трех частей. <br /><a href="http://mda-delphi.blogspot.com/2009/02/vista-uac-delphi-1.html">Перейти к части 1.</a></p> <p align="justify">Полное описание логики работы UAC выходит за рамки данной статьи. Здесь я собираюсь только обозначить несколько относящихся к делу моментов.</p> <p align="justify">По сути, UAC это все об уровнях привилегий. По умолчанию, обычное Windows приложение не требует администраторских привилегий. Вот почему под Vista, даже административные аккаунты, не используют полный доступ по умолчанию. Цель нормального UAC-приложения – запуск с доступом определяемым текущим аккаунтом, и лишь при реальной необходимости запрашивать повышенные права доступа. Сам процесс запроса повышения прав называется <i>повышение привилегий</i> (<i>privilege elevation</i>), и он требует, что бы пользователь подтвердил действие, перед тем, как это действие будет выполнено. Запрос на повышение может быть представлен либо в форме простого диалога Продолжить/Отменить (режим одобрения Админом), либо полноценного диалога логина (пользователи должны явным образом ввести свои полномочия), в зависимости от типа текущего аккаунта и настроек безопасности. Существует еще пара вариаций запроса в зависимости от того используется ли исполняемым файлом цифровая подпись или нет.</p> <p align="justify">Следует помнить, что Vista поощряет использование цифровых подписей, показывая более дружелюбный запрос на <i>повышение привилегий </i>(далее <i>elevation диалог</i>) для подписанных исполняемых файлов.</p> <p align="justify">Существуют различные способы дать возможность вашему приложению инициировать <i>elevation диалог</i>. Большинство из них, хотя и просты для реализации, однако не дают извлечь максимальную пользу. Я даже не знаю насколько можно их применять, так как они опираются на функции обратной совместимости Vista. В этой части я кратко опишу три из них.</p> <p align="justify">Использование эвристики Vista.</p> <p align="justify">Windows Vista имеет множество встроенных приемов для облегчения возможности поддержки UAC. Один из них фактически основывается на том, что инсталлеры и апдейтеры, как правило, вынуждены писать в защищенную директорию Programm Files и/или ветвь реестра HKLM. Vista распознает такие приложения с помощью эвристического метода определения и автоматически выводит <i>elevation диалог</i>, в тот момент, когда пользователь пытается выполнить их. </p> <p align="justify">Есть целый ряд вещей, которые при этом проверяются, но я хотел бы отметить, единственную вещь, которую довольно легко реализовать и проверить – <i>elevation диалог</i> вызывается, если имя исполняемого файла или информация о его версии содержат такие строки, как, например, “settings”, “install” или “update”.</p> <p align="justify">В результате, такой подход является весьма полезным для автоматического обновления приложений, которые, как правило, самостоятельно скачивают новую версию, а затем запускают внешние утилиты для замены старых файлов приложений. Если эта утилита названа примерно так: 'MyAppUpdater.exe' (и снабжена цифровой подписью), то приложения могут инициировать вызов красивого <i>elevation диалога </i>и запускать ее (утилиту) с полными правами доступа.</p> <p align="justify">Очевидно, что такой подход применяется в отношении любого приложения, независимо от языка, на котором оно было разработано. Вам только нужно выбрать правильное название для исполняемого файла и все! Получите <i>elevation диалог</i>!</p> <p align="justify">Обратная сторона такого подхода заключается в том, что приложение всегда запускается с полными правами доступа, даже если это действительно требуется всего лишь для работы какой-то отдельной его части. Это и тот факт, что такой подход зависит от функциональной совместимости, делают его несколько менее привлекательным для продвинутых пользователей Vista.</p> <p align="justify">Выполнение от имени администратора.</p> <p align="justify">Другим способом достижения того же результата является выбор опции "Выполнять эту программу от имени администратора" (Run this program as an administrator) на вкладке «Совместимость» в свойствах приложения. Обратная сторона медали будет та же, что и предыдущего подхода, приложение всегда будет выполняться с завышенными правами.</p> <p align="justify">Манифест приложения.</p> <p align="justify">Несколько более сложный вариант предыдущего подхода заключается в том, чтобы вставить следующий манифест в исполняемый файл своего приложения:</p> <br /> <br /> <br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgufCoj-zqzCFH2GUFNXJjuTratL5w6bIQpTqQJr3GcnM9gfg4PKp9brU8PXgd1cTCODMqhb67rAj2VHb04OrNCO84iiTrHDZvOoq8uJHjn-sUGU0g0SgdzyCk00_ndiSoFpSJI/s1600-h/xml.PNG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 212px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgufCoj-zqzCFH2GUFNXJjuTratL5w6bIQpTqQJr3GcnM9gfg4PKp9brU8PXgd1cTCODMqhb67rAj2VHb04OrNCO84iiTrHDZvOoq8uJHjn-sUGU0g0SgdzyCk00_ndiSoFpSJI/s400/xml.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5301981177392175346" /></a><br /><p align="justify">Ключевой информацией здесь проявляется значение атрибута requestedExecutionLevel. Если атрибут примет значение "requireAdministrator", то это послужит сигналом для Vista отобразить <i>elevation диалог </i>в момент запуска приложения.</p> <p align="justify">Предварительно, манифест может быть связан с исполняемым файлом, вам необходимо скомпилировать его в RES формате, используя следующий RC файл (я предполагаю, что вы достаточно знаете о файлах ресурсов и знаете что такое RC и RES файлы):</p> <blockquote> <p>1 24 "UAC.manifest"</p> </blockquote> <p> <br />Где 1 – индекс ресурса, 24 – тип ресурса (RT_MANIFEST), и "UAC.manifest" – актуальное имя файла манифеста, который будет скомпилирован. Замечу, что вы можете использовать другой индекс ресурса, убедившись при этом, что отсутствуют совпадения с индексами других ресурсов, например XP манифестом. </p> <p align="justify">Наконец, вы должны связать полученный RES файл с исполняемым файлом, используя директиву компилятора Delphi $R.</p> <p align="justify">Такой подход имеет точно те же недостатки, сто и предыдущие. Он увеличивает права заранее, а не в случае необходимости.</p> <p align="justify">OK, это был краткий обзор основ UAC совместимости. Теперь мы готовы вигаться в правильном направлении… </p>Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com1tag:blogger.com,1999:blog-24176048.post-5718941510968756852009-02-11T18:00:00.001+02:002009-02-11T18:02:56.421+02:00Использование Vista UAC в Delphi: Часть 1<p align="justify"> </p> <p align="justify"><font size="1">Наконец-то произошло то, чего я так боялся. Сейчас мне придется адаптировать приложение для работы в Windows Vista. Первая и главная проблема здесь, это UAC. Поэтому я решил почитать </font><a href="http://developersoven.blogspot.com/2007/02/leveraging-vistas-uac-with-delphi-part.html"><font size="1">матчасть</font></a><font size="1">. Возможно, кому-нибудь пригодится моя попытка перевода.</font></p> <p align="justify"> </p> <p align="justify">В настоящее время сотни технических блогов и статей, упоминают о возможностях User Account Control в Vista. К сожалению, многие авторы приуменьшают полезность этой функции.</p> <p align="justify">Я говорю «к сожалению», потому, что мне нравится эта функция. И я считаю, неверным приуменьшать ее значимость. Я также считаю неверным то, что многие технические on-line источники и журналы с раздражением описывают UAC и даже предоставляют своим читателям инструкции по его отключению. Я думаю, что подобное отношение может впоследствии «обернутся боком».</p> <p align="justify">Да, возможно, реализация UAC могла бы быть и лучшей. Но это не повод просто отключать его. При правильной настройке списки контроля доступа на объекты файловой системы UAC могут быть приведены к такому виду, что он уже не просто раздражает, а становится действительно полезным.</p> <p align="justify">Но это не то, о чем я хочу поговорить. В свете моих мнений, я хочу показать вам, как использовать функции UAC в ваших Delphi приложениях. Так сказать, научить вас игратькрасиво, ...</p> <p align="justify">Ввиду объемности статьи, я бы разделил ее на три части. Во второй части, я опишу некоторые наиболее общие UAC концепции, плюс бегло ознакомлю вас с тремя основными простыми методами, которые позволят вашим приложениям соответствовать им. В третьей, заключительной части, я сделаю упор на наиболее продвинутом подходе, включая написание определенного Delphi кода.</p> <p align="justify">Ну что же, приступим…</p> Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-55173635101576064492009-01-26T01:18:00.004+02:002009-01-26T01:36:11.047+02:00TurboPower сomponents for Delphi 2009<a href="http://www.songbeamer.com/delphi/">http://www.songbeamer.com/delphi/</a><br />На этом сайте вложен набор старых, хорошо известных компонентов, портированных под Delphi 2009.<br />Поддержка большинства этих компонентов (а возможно и всех) была давно прекращена разработчиками. В представленном наборе можно найти хорошо известные компоненты производства TurboPower, код которых был открыт, после того, как компания прекратила существование, и еще много чего полезного. Учитывая серьезные изменения, произошедшие в Delphi 2009 по части работы со строками, остается только снять шляпу перед авторами данных портов.<br /><br /><span style="font-weight:bold;">RESPECT!</span>Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-64643521969536419372008-11-18T17:51:00.000+02:002008-11-18T17:54:03.649+02:00RAD Studio 2009CodeGear анонсировал <a href="http://www.codegear.com/products/radstudio">RAD Studio 2009</a> - комбинацию Delphi 2009 (for Win32), C++Builder 2009 и Delphi Prism (for .NET).Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-76243652404398876642008-10-15T01:35:00.002+03:002008-10-15T01:37:57.369+03:00Delphi 2009 и ASProtect<div>В принципе все логично. Не работает. Функции возвращают строковые значения, которые не совпадают по длине. Соответственно, они честно вызываются, но в качестве результат возвращают абракадабру. Хотя можно попробовать сделать под это дело солюшн.</div>Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-81087984411061795472008-10-02T02:47:00.002+03:002008-10-02T02:50:13.802+03:00Delphi 2009 Reviewers GuideВот сегодня был обнародован <a href="http://dn.codegear.com/article/38757">Delphi 2009 Reviewers Guide</a>. На самом деле, это хороший документ. Только после его прочтения и ревью, собственно, не нужны. А обзоры нового продукта куда интересней писать исходя из собственных впечатлений, а уж потом смотреть, в каком месте эти впечатления были обманчивы :).<br />ну вот эту штуку я явно пропустил в своем обзоре.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dn.codegear.com/article/images/38757/02000014.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://dn.codegear.com/article/images/38757/02000014.jpg" border="0" alt="" /></a>Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0tag:blogger.com,1999:blog-24176048.post-49808782387991681972008-09-25T03:05:00.001+03:002008-09-25T03:11:47.787+03:00Новые Integer типы данных в Delphi 2009В блоге Криса Бенсена (<a href="http://chrisbensen.blogspot.com/2008/09/delphi-2009-new-integer-alias-types.html">Chris Bensen</a>)вычитал о том, что появились новые типы-псевдонимы.<br /><br />type<br /> Int8 = ShortInt;<br /> Int16 = SmallInt;<br /> Int32 = Integer;<br /> UInt8 = Byte;<br /> UInt16 = Word;<br /> UInt32 = Cardinal;<br /><br />От себя добавлю, что, пожалуй это удобно. Конечно, размерность типов нужно помнить, но иногда...Александр Божкоhttp://www.blogger.com/profile/11799682423103283939noreply@blogger.com0