<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. https://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="https://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:code_inspection</id>
  <title>Инспекция кода. Всем выйти из сумрака))</title>
  <subtitle>Инспекция кода. Всем выйти из сумрака))</subtitle>
  <author>
    <name>Инспекция кода. Всем выйти из сумрака))</name>
  </author>
  <link rel="alternate" type="text/html" href="https://code-inspection.livejournal.com/"/>
  <link rel="self" type="text/xml" href="https://code-inspection.livejournal.com/data/atom"/>
  <updated>2011-01-08T19:13:49Z</updated>
  <lj:journal userid="10565732" username="code_inspection" type="community"/>
  <link rel="service.feed" type="application/x.atom+xml" href="https://code-inspection.livejournal.com/data/atom" title="Инспекция кода. Всем выйти из сумрака))"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:code_inspection:1773</id>
    <author>
      <name>Бова Николай (Мик) Петрович (Chanting Wolf)</name>
    </author>
    <lj:poster user="main_framer" userid="13059296"/>
    <link rel="alternate" type="text/html" href="https://code-inspection.livejournal.com/1773.html"/>
    <link rel="self" type="text/xml" href="https://code-inspection.livejournal.com/data/atom/?itemid=1773"/>
    <title>Kiev Java conference</title>
    <published>2011-01-08T19:13:49Z</published>
    <updated>2011-01-08T19:13:49Z</updated>
    <content type="html">Коллеги,&lt;br /&gt;&lt;br /&gt;Мы хотим провести конференцию по Java в Киеве.&lt;br /&gt;В данный момент мы выбираем интересные темы / докладчиков.&lt;br /&gt;Draft списка тем я привожу в конце топика.&lt;br /&gt;&lt;br /&gt;В связи с этим вопрос - есть желание / возможность выступить?&lt;br /&gt;Можете предложить свои темы.&lt;br /&gt;&lt;br /&gt;И ещё.&lt;br /&gt;Можете порекомендовать кого-то из толковых и опытных ребят в качестве докладчиков?&lt;br /&gt;&lt;br /&gt;Спасибо.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Темы (draft).&lt;br /&gt;&lt;br /&gt;1) Простые дешевые веб-приложения на джава. Как одну страничку сделать было не тысячу у.е. сделать, а быстрее.&lt;br /&gt;2) Облачные технологии.&lt;br /&gt;3) Искуственный интеллект.&lt;br /&gt;4) Перспективы развития языка Java. Предсказания.&lt;br /&gt;5) Интересные мега проекты на джава. Интересные решения.&lt;br /&gt;6) Фукциональное тестирование веб приложений.&lt;br /&gt;Grails + Webdriver + easyb&lt;br /&gt;http://www.nofluffjuststuff.com/blog/john_smart/2010/08/selenium_2_web_driver__the_land_where_page_objects_are_king_&lt;br /&gt;7) Java + e-commerce.&lt;br /&gt;8) Create an application from scratch.&lt;br /&gt;&amp;quot;I will spend the entire time in the IDE building a random application with&amp;nbsp; NetBeans 7 / Glassfish 3.1 and JBoss 6 (in parallel)&amp;quot;&lt;br /&gt;http://www.adam-bien.com/roller/abien/entry/real_time_java_ee_6&lt;br /&gt;9) Мультипоточность.&lt;br /&gt;10) Взаимодействии java с различными no-sql базами данных&amp;nbsp; - как удобнее и оптимальнее реализовывать такую связь.&lt;br /&gt;11) &amp;quot;Методы отладки веб приложений&amp;quot; (серверная часть на java).&lt;br /&gt;12) &amp;quot;Юнит тестирование веб приложений&amp;quot; (серверная часть на java).&lt;br /&gt;13) Оптимизация, быстрый и защищённый код.&lt;br /&gt;14) Введение во всякие новые функциональные языки.&lt;br /&gt;15) JEE 6.&lt;br /&gt;16) Нагруженные системы.&lt;br /&gt;17) Организация взаимодействия с логикой на клиентской части (связка с джаваскриптом).&lt;br /&gt;18) GameDev.&lt;br /&gt;19) GWT с примерами, много примеров&lt;br /&gt;20) кейсы java + что-то другое (как java работает с другими технологиями)&lt;br /&gt;21) нестандартные применения java (не только же для enterprise пишут)&lt;br /&gt;22) realtime java&lt;br /&gt;23) интересные web frameworks&lt;br /&gt;24) Процесс разработки jdk&lt;br /&gt;25) Tuning performance.&lt;br /&gt;26) COMET-решения на Java.&lt;br /&gt;27) Мониторинг Java встроенными в JVM средствами.&lt;br /&gt;&lt;br /&gt;&lt;a name='cutid1-end'&gt;&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:code_inspection:1376</id>
    <author>
      <name>Бова Николай (Мик) Петрович (Chanting Wolf)</name>
    </author>
    <lj:poster user="main_framer" userid="13059296"/>
    <link rel="alternate" type="text/html" href="https://code-inspection.livejournal.com/1376.html"/>
    <link rel="self" type="text/xml" href="https://code-inspection.livejournal.com/data/atom/?itemid=1376"/>
    <title>Looking for a job. java team lead / system architect</title>
    <published>2010-03-13T09:38:47Z</published>
    <updated>2010-03-13T09:38:47Z</updated>
    <content type="html">Hi! &lt;br /&gt;&lt;br /&gt;At the moment I am looking for a job of java team lead / system architect. &lt;br /&gt;CV &lt;br /&gt;&lt;a target='_blank' href='http://www.chantingwolf.narod.ru/cv8en.doc' rel='nofollow'&gt;http://www.chantingwolf.narod.ru/cv8en.doc&lt;/a&gt; &lt;br /&gt;LinkedIN profile &lt;br /&gt;&lt;a target='_blank' href='http://www.linkedin.com/in/mykbova' rel='nofollow'&gt;http://www.linkedin.com/in/mykbova&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;-Mykola</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:code_inspection:1062</id>
    <author>
      <name>Бова Николай (Мик) Петрович (Chanting Wolf)</name>
    </author>
    <lj:poster user="main_framer" userid="13059296"/>
    <link rel="alternate" type="text/html" href="https://code-inspection.livejournal.com/1062.html"/>
    <link rel="self" type="text/xml" href="https://code-inspection.livejournal.com/data/atom/?itemid=1062"/>
    <title>Новое ЖЖ сообщество / New LJ community.</title>
    <published>2008-12-07T22:27:57Z</published>
    <updated>2008-12-07T22:27:57Z</updated>
    <content type="html">j2ee.&lt;br /&gt;&lt;span  class="ljuser  i-ljuser  i-ljuser-type-C     "  data-ljuser="j2ee_ua" lj:user="j2ee_ua" &gt;&lt;a href="https://j2ee-ua.livejournal.com/profile/"  target="_self"  class="i-ljuser-profile" &gt;&lt;img  class="i-ljuser-userhead"  src="https://l-stat.livejournal.net/img/community.png?v=556&amp;v=922" /&gt;&lt;/a&gt;&lt;a href="https://j2ee-ua.livejournal.com/" class="i-ljuser-username"   target="_self"   &gt;&lt;b&gt;j2ee_ua&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:code_inspection:870</id>
    <author>
      <name>asusl</name>
    </author>
    <lj:poster user="asusl" userid="10565822"/>
    <link rel="alternate" type="text/html" href="https://code-inspection.livejournal.com/870.html"/>
    <link rel="self" type="text/xml" href="https://code-inspection.livejournal.com/data/atom/?itemid=870"/>
    <title>Delphi + COM</title>
    <published>2007-08-21T15:07:41Z</published>
    <updated>2007-08-21T15:07:41Z</updated>
    <content type="html">Доброго времени суток. Хочу&amp;nbsp; представить на суд уважаемой  публики кусочек своей программы. Этот кусочек в принципе достаточно самостоятелен и живет у меня уже не в одной программе. Однако плотно инспектировать никто его не пытался. Написал 1 раз , отладил - работает - и не лазал туда больше )))&lt;br /&gt;Задача была такая - реализовать позднее связывание. Готового ничего не нашел , признаться и искал не долго. &lt;br /&gt;Решил написать сам. В процессе там еще и кэширование прикрутил к этому делу... повысило быстродействие заметно.&lt;br /&gt;Сразу прошу прощение за отсутствие комментов.&lt;br /&gt;Собсно вот:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;unit uComContainer;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;Uses Classes,SysUtils,Windows,Variants,ComObj,ActiveX;&lt;br /&gt;&lt;br /&gt;{$DEFINE CACHEPROPS}&lt;br /&gt;&lt;br /&gt;Type&lt;br /&gt;&lt;br /&gt;TCachedProperty = record&lt;br /&gt;&amp;nbsp; PropName : string;&lt;br /&gt;&amp;nbsp; PropValue : OleVariant;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;TCachedProperties = array of TCachedProperty;&lt;br /&gt;&lt;br /&gt;TComContainer = class(TPersistent)&lt;br /&gt;&amp;nbsp; private&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FDisp : IDispatch;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FFailIfErr : Boolean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FComExc : TExcepInfo;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCache : TCachedProperties;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCacheProps : boolean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function FindDispatcher(Disp : IDispatch;var Name : String) : OleVariant;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure InvokeHelper(Disp : IDispatch;DispId : TDispID;Flags : Word;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Params : array of OleVariant;var Res : OleVariant);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetComMemberDisp(Disp : IDispatch;Name : PWideChar) : TDispID;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function AllocUString(AnsiLength : Cardinal) : pointer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure ReleaseUString(pStr : pointer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetFailIfComError : boolean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure SetFailIfComError(fice : boolean);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Procedure RaiseComException(hr : HRESULT; ExcepInfo : PExcepInfo = nil);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function IsLoaded : boolean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function _GetInnerProp(Name : String) : OleVariant;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure _SetInnerProp(Name : String;Value : OleVariant);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure SetCacheProps(Cp : boolean);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function FindInCache(const Name : string;var Value : OleVariant) : Integer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure DoCacheProperty(const Name : string;const Value : OleVariant);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function CreateClone : TComContainer;&lt;br /&gt;&amp;nbsp; protected&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetComObject : OleVariant;virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetInnerProp(Name : String) : OleVariant;virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure SetInnerProp(Name : String;Value : OleVariant);virtual;&lt;br /&gt;&amp;nbsp; public&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; constructor Create; overload; virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; constructor Create(DSP : IDispatch); overload; virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property Loaded : boolean read IsLoaded;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property ComObject : OleVariant read GetComObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure ClearCache;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property Prop[Name : String] : OleVariant read _GetInnerProp write _SetInnerProp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Method(Name : string;Params : array of OleVariant) : OleVariant;virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property FailIfComError : Boolean read GetFailIfComError write SetFailIfComError;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property CacheProps : boolean read FCacheProps write SetCacheProps;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property Clone : TComContainer read CreateClone;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure Load(DSP : IDispatch);virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure ReleaseComObject;virtual;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destructor Destroy;override;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;function TComContainer.CreateClone : TComContainer;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := TComContainer.Create;&lt;br /&gt;&amp;nbsp; Result.Load(FDisp);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TComContainer.Create;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Inherited;&lt;br /&gt;&amp;nbsp; FDisp := nil;&lt;br /&gt;&amp;nbsp; FFailIfErr := True;&lt;br /&gt;&amp;nbsp; {$IFDEF CACHEPROPS}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCacheProps := true;&lt;br /&gt;&amp;nbsp; {$ELSE}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCacheProps := false;&lt;br /&gt;&amp;nbsp; {$ENDIF}&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.IsLoaded : boolean;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := FDisp &amp;lt;&amp;gt; nil;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.GetComObject : OleVariant;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := FDisp;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.ReleaseComObject;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.ClearCache;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; SetLength(FCache,0);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer._GetInnerProp(Name : String) : OleVariant;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; If FCAcheProps then&lt;br /&gt;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if FindInCache(Name,Result) &amp;lt; 0 then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result := GetInnerProp(Name);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DoCacheProperty(Name,Result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result := GetInnerProp(Name);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer._SetInnerProp(Name : String;Value : OleVariant);&lt;br /&gt;var CInd : Integer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OldValue : OleVariant;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; SetInnerProp(Name,Value);&lt;br /&gt;&amp;nbsp; If FCAcheProps then&lt;br /&gt;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CInd := FindInCache(Name,OldValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if CInd &amp;gt;= 0 then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCache[CInd].PropValue := Value;&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.FindInCache(const Name : string;var Value : OleVariant) : Integer;&lt;br /&gt;var i : Integer;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; result := -1;&lt;br /&gt;&amp;nbsp; for i := 0 to Length(FCache) - 1 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if FCache[i].PropName = Name then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value := FCache[i].PropValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result := i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.DoCacheProperty(const Name : string;const Value : OleVariant);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; SetLength(FCache,Length(FCache)+1);&lt;br /&gt;&amp;nbsp; FCache[Length(FCache)-1].PropName := Name;&lt;br /&gt;&amp;nbsp; FCache[Length(FCache)-1].PropValue := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.SetCacheProps(Cp : boolean);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; if FCacheProps = cp then exit;&lt;br /&gt;&amp;nbsp; FCacheProps := cp;&lt;br /&gt;&amp;nbsp; if not FCacheProps then SetLength(FCache,0);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.GetInnerProp(Name : String) : OleVariant;&lt;br /&gt;var Dispatcher : IDispatch;&lt;br /&gt;&amp;nbsp; DispId : TDispID;&lt;br /&gt;&amp;nbsp; PName : PWideChar;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Dispatcher := FindDispatcher(FDisp,Name);&lt;br /&gt;&amp;nbsp; PName := AllocUString(Length(Name));&lt;br /&gt;&amp;nbsp; StringToWideChar(Name,PName,(Length(Name)+1)*2);&lt;br /&gt;&amp;nbsp; DispId := GetComMemberDisp(Dispatcher,PName);&lt;br /&gt;&amp;nbsp; ReleaseUString(PName);&lt;br /&gt;&amp;nbsp; InvokeHelper(Dispatcher,DispId,DISPATCH_PROPERTYGET,[],Result);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.SetInnerProp(Name : String;Value : OleVariant);&lt;br /&gt;var Dispatcher : IDispatch;&lt;br /&gt;&amp;nbsp; DispId : TDispID;&lt;br /&gt;&amp;nbsp; PName : PWideChar;&lt;br /&gt;&amp;nbsp; res : OleVariant;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Dispatcher := FindDispatcher(FDisp,Name);&lt;br /&gt;&amp;nbsp; PName := AllocUString(Length(Name));&lt;br /&gt;&amp;nbsp; StringToWideChar(Name,PName,(Length(Name)+1)*2);&lt;br /&gt;&amp;nbsp; DispId := GetComMemberDisp(Dispatcher,PName);&lt;br /&gt;&amp;nbsp; ReleaseUString(PName);&lt;br /&gt;&amp;nbsp; InvokeHelper(Dispatcher,DispId,DISPATCH_PROPERTYPUT,[Value],res);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.GetFailIfComError : boolean;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Result := FFailIfErr;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.SetFailIfComError(fice : boolean);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; FFailIfErr := fice;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.AllocUString(AnsiLength : Cardinal) : pointer;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; GetMem(Result,(AnsiLength+1)*2);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.ReleaseUString(pStr : pointer);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; FreeMem(pStr);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;Procedure TComContainer.RaiseComException(hr : HRESULT; ExcepInfo : PExcepInfo = nil);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; case hr of&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; S_OK : raise Exception.Create('Operation succeded, but method RaiseComException has been called.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; E_OUTOFMEMORY : raise Exception.Create('Out of memory.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_UNKNOWNNAME : raise Exception.Create('One or more of the names were not known.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_UNKNOWNLCID : raise Exception.Create('The locale identifier (LCID) was not recognized.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_BADPARAMCOUNT : raise Exception.Create('The number of elements provided to DISPPARAMS is different from the number of arguments accepted by the method or property.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_BADVARTYPE : raise Exception.Create('One of the arguments in rgvarg is not a valid variant type.');&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_EXCEPTION : raise Exception.Create(FComExc.bstrDescription);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_EXCEPTION : if ExcepInfo &amp;lt;&amp;gt; nil then raise Exception.Create(ExcepInfo.bstrDescription)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else raise Exception.Create(FComExc.bstrDescription);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_MEMBERNOTFOUND : raise Exception.Create('The requested member does not exist, or the call to Invoke tried to set the value of a read-only property.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_NONAMEDARGS : raise Exception.Create('This implementation of IDispatch does not support named arguments.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_OVERFLOW : raise Exception.Create('One of the arguments in rgvarg could not be coerced to the specified type.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_PARAMNOTFOUND : raise Exception.Create('One of the parameter DISPIDs does not correspond to a parameter on the method. In this case, puArgErr should be set to the first argument that contains the error.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_TYPEMISMATCH : raise Exception.Create('One or more of the arguments could not be coerced. The index within rgvarg of the first parameter with the incorrect type is returned in the puArgErr parameter.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_UNKNOWNINTERFACE : raise Exception.Create('The interface identifier passed in riid is not IID_NULL.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISP_E_PARAMNOTOPTIONAL : raise Exception.Create('A required parameter was omitted.');&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.GetComMemberDisp(Disp : IDispatch;Name : PWideChar) : TDispID;&lt;br /&gt;var hr : HRESULT;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; If Not Loaded then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Raise Exception.Create('COM Container empty!');&lt;br /&gt;&amp;nbsp; if Disp = nil then exit;&lt;br /&gt;&amp;nbsp; hr := Disp.GetIDsOfNames(GUID_NULL,@Name,1,LOCALE_SYSTEM_DEFAULT,@Result);&lt;br /&gt;&amp;nbsp; if hr &amp;lt;&amp;gt; S_OK then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If FFailIfErr then RaiseComException(hr);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.Load(DSP : IDispatch);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; If Loaded then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseComObject;&lt;br /&gt;&amp;nbsp; if DSP = nil then Raise Exception.Create('Attempt to load NULL interface!');&lt;br /&gt;&amp;nbsp; FDisp := DSP;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;Function TComContainer.Method(Name : string;Params : array of OleVariant) : OleVariant;&lt;br /&gt;var Dispatcher : IDispatch;&lt;br /&gt;&amp;nbsp; DispId : TDispID;&lt;br /&gt;&amp;nbsp; PName : PWideChar;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Dispatcher := FindDispatcher(FDisp,Name);&lt;br /&gt;try&lt;br /&gt;&amp;nbsp; PName := AllocUString(Length(Name));&lt;br /&gt;&amp;nbsp; StringToWideChar(Name,PName,(Length(Name)+1)*2);&lt;br /&gt;&amp;nbsp; DispId := GetComMemberDisp(Dispatcher,PName);&lt;br /&gt;finally&lt;br /&gt;&amp;nbsp; ReleaseUString(PName);&lt;br /&gt;end;&lt;br /&gt;&amp;nbsp; InvokeHelper(Dispatcher,DispId,DISPATCH_METHOD,Params,Result);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TComContainer.FindDispatcher(Disp : IDispatch;var Name : String) : OleVariant;&lt;br /&gt;var NextName : string;&lt;br /&gt;&amp;nbsp; SepPos : integer;&lt;br /&gt;&amp;nbsp; PName : PWideChar;&lt;br /&gt;&amp;nbsp; DispId : TDispID;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; SepPos := Pos ('.',Name);&lt;br /&gt;&amp;nbsp; if SepPos = 0 then Result := Disp&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NextName := Copy(Name,1,SepPos-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp; try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PName := AllocUString(Length(NextName));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringToWideChar(NextName,PName,(Length(NextName)+1)*2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DispId := GetComMemberDisp(Disp,StringToWideChar(NextName,PName,(Length(Name)+1)*2));&lt;br /&gt;&amp;nbsp;&amp;nbsp; finally&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseUString(PName);&lt;br /&gt;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InvokeHelper(Disp,DispId,DISPATCH_PROPERTYGET,[],Result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name := copy(Name,SepPos+1,Length(Name)-2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not VarIsNull(Result) then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Result := FindDispatcher(Result,Name);&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TComContainer.InvokeHelper(Disp : IDispatch;DispId : TDispID;Flags : Word;&lt;br /&gt;Params : array of OleVariant;var Res : OleVariant);&lt;br /&gt;var hr : HRESULT;&lt;br /&gt;&amp;nbsp; aDispParams : TDispParams;&lt;br /&gt;&amp;nbsp; aDispId&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : array of TDispId;&lt;br /&gt;&amp;nbsp; aEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : TExcepInfo;&lt;br /&gt;&amp;nbsp; iError&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : UINT;&lt;br /&gt;&amp;nbsp; ParStr : String;&lt;br /&gt;&amp;nbsp; i : Integer;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; if Disp = nil then exit;&lt;br /&gt;&amp;nbsp; FillChar(aDispParams, SizeOf (aDispParams), 0);&lt;br /&gt;&amp;nbsp; if (Flags = DISPATCH_PROPERTYPUT) or (Flags = DISPATCH_METHOD) then&lt;br /&gt;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with aDispParams do begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cArgs := Length(Params);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rgvarg := @Params;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Flags = DISPATCH_PROPERTYPUT then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cNamedArgs := 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetLength(aDispId,1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aDispId[0] := DISPID_PROPERTYPUT;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rgdispidNamedArgs := @aDispId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; end;&lt;br /&gt;&amp;nbsp; hr := Disp.Invoke(DispId,GUID_NULL,LOCALE_SYSTEM_DEFAULT,Flags,aDispParams,@Res,@aEI,@iError);&lt;br /&gt;&amp;nbsp; if Flags = DISPATCH_PROPERTYPUT then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetLength(aDispId,0);&lt;br /&gt;&amp;nbsp; if hr &amp;lt;&amp;gt; S_OK then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If FFailIfErr then RaiseComException(hr, @aEI)&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;Destructor TComContainer.Destroy;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; If Loaded then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseComObject;&lt;br /&gt;&amp;nbsp; SetLength(FCache,0);&lt;br /&gt;&amp;nbsp; inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TComContainer.Create(DSP: IDispatch);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; Create;&lt;br /&gt;&amp;nbsp; Load(DSP);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;&lt;br /&gt;end.</content>
  </entry>
</feed>
