<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[ - 我的作品]]></title>
<link>http://www.RainCoding.com/blog/</link>
<description><![CDATA[]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[(Rain)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title></title>
	<url>http://www.RainCoding.com/blog/images/logos.gif</url>
	<link>http://www.RainCoding.com/blog/</link>
	<description></description>
</image>

			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=164</link>
			<title><![CDATA[ErrorProvider VCL]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Wed,25 Jun 2008 16:10:21 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=164</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然我始终认为.Net Framework只能做产品不能做艺术品(十几年前的软件都堪称艺术品).但是M$的人性化UI和客户的体验始终是最好的.Windows在编程上的混乱和复杂性很大一部分是屈就于健壮性和易用性.所以开源的OS在设计上和编码上虽然更漂亮更规范但是得不到最终用户的肯定还是无法成为一款好的产品.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前几天看到网上有网友询问是否有VCL版的ErrorProvider,我想大概这个组件比较好玩所以有人才惦记她.于是打开VS用了一下觉得挺有趣于是写了个VCL版.该VCL版不支持数据敏感.(Delphi对于数据库的强大加很少代码就可以了),主要是我对数据库没兴趣.除此之外支持所有的.Net版本的特性还增强了某些方面的功能.配合其他THint能够大大超越.Net版本.喜欢玩的朋友可以试试.<br/><br/><img src="http://www.RainCoding.com/blog//blog/software/ErrorProvider.png" border="0" alt=""/><br/><br/>该组件准备贡献于CnPack，且功能做了较大改动。最新版请访问CnPack主页。]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=138</link>
			<title><![CDATA[OneKey Studio]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Fri,24 Aug 2007 14:02:56 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=138</guid>
		<description><![CDATA[目前已开始开发OneKey Studio系列,目的主要是锻炼一下自己SDK编程的能力.软件开发围绕 &#34;简单,安全,高效&#34;这六子真诀来进行.简单预示着操作简单,使用简单,功能清晰明了,目的明确.安全指软件不破坏用户数据,自身漏洞降低到最低,不破坏操作系统且自身稳定不易Crash.高效就是执行高效,反应迅速,启动快捷,资源占用少且本身体积小.这六子涵盖了软件开发的难点重点,要做到这些实属不易,君不见现在市面上的软件有多少符合这些要求的?所以为了最高质量完成这些目标,软件的开发进度相当的缓慢且自己的业余时间也不充分.目前第一个列入开发计划的事OneKey Clear,该软件扫除用户系统的垃圾文件上网隐私和系统操作的历史记录.同类软件网上很多但完美的不多.为了探求软件开发的极致也源于我自身需要这么一套软件,于是该项目列入第一个被实施的计划.本来计划是用纯汇编来写,但写到一半发现用C/C++来实现并不比汇编来得颓势.所以目前采用C/C++ &amp;&amp; SDK来开发.好处是除系统运行支持库以外无需任何额外支持库支持,运行速度理论上达到最高.支持NT内核OS(2k/xp/03/vista)因为是纯Unicode版本所以不支持9x系列.<br/>一下是OneKey Clear的部分截图:<br/><br/><img src="http://www.RainCoding.com/blog/../blog/software/OneKey_Clear.png" border="0" alt=""/><br/><br/>OneKey Studio的其他成员暂时还没有计划,不过具体有个大概的方向.到时在说.<br/><br/>(*目前暂停开发,因为忙着开发游戏呢:-))]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=137</link>
			<title><![CDATA[FlashGetProgress]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Fri,10 Aug 2007 14:48:48 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=137</guid>
		<description><![CDATA[闲来无聊时的突发奇想之作,关键是看到BitComet中的那个[分块状态]而刺激了脑神经花了十来分钟写的.本身根本没有技术含量,代码也未参考任何其他实现,也不知道实现的是否是标准方法.只是觉得达到了自己想要的效果就OK了.该组件已加到我自己的组件库中并用到实际的工程中,以后有机会在加强吧.^_^<br/><br/><img src="http://www.RainCoding.com/blog/../blog/software/FlashGetProgress.png" border="0" alt=""/><br/>2007-08-12:实现Max与Width自适应,解除依赖关系.<br/><a target="_blank" href="http://www.RainCoding.com/blog/../blog/software/FlashGetProgress.rar" rel="external">下载源码</a>]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=136</link>
			<title><![CDATA[MSN通讯类]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Tue,31 Jul 2007 14:43:56 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=136</guid>
		<description><![CDATA[大约一年多前由于公司需要写了一Mini的MSN客户端,实现了对话功能.并由此基础之上可以发展自己的机器人.现在虽然Microsoft提供了其SDK包但是基于.Net,且灵活性不如自己从头来实现得高,受制于人.由于该类是为公司所做不便公开但鉴于我对开放代码的热衷已达到欲罢不能的程度所以这里就贴出关键代码部分来共享一下吧.<br/>代码用Delphi撰写,但是可以非常方便转为其他语言.<br/>代码写得凌乱,并且最主要的缺点是没有使用正则.好在已没有技术难点所以也没有继续改善的动力了.就这样让她乱下去吧^_^<br/>这是声明代码<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.RainCoding.com/blog/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 数据到达<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TDataAvailable=procedure(Sender:TObject;ReceiveMsg:string;ErrCode:Word) of object;<br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 命令发送<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TSendDataComm=procedure(Sender:TObject;SendCom:string) of object;<br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 返回在线好友<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TResultLinkman=procedure(Sender:TObject;Linkman:string) of object;<br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 被邀请<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TInvites=procedure(InviteObject:string) of object;<br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 会话退出<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TByeSession=procedure(TalkUser:string) of object;<br/>&nbsp;&nbsp;//信息发送标志<br/>&nbsp;&nbsp;TMsgResult=(Msg_OK,Msg_Miss,Msg_Unknow);<br/><br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 消息到达<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TMsgReceive=procedure(Sender:TObject;User,Msg:string) of object;<br/><br/>&nbsp;&nbsp;{ TIMessage }<br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// 所有通讯类的基类<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TIMessage=class(TObject)<br/>&nbsp;&nbsp;Private<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDataAvailable:TDataAvailable;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDebugModel:Boolean;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDebugFileName:string;<br/>&nbsp;&nbsp;Protected<br/>&nbsp;&nbsp;&nbsp;&nbsp;FUserName:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FPassWord:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSendDataComm:TSendDataComm;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FLoginError:TNotifyEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FLoginSucess:TNotifyEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FRecStr:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSocket:TObject;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure ProtocalAnalyze(const ProtString:string); Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure SendComm; Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure DataAvailable(Sender:TObject;ErrCode:Word); Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure SockSocksConnected(Sender:TObject;ErrCode:Word);<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnLoginError:TNotifyEvent Read FLoginError Write FLoginError;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnLoginSucess:TNotifyEvent Read FLoginSucess Write FLoginSucess;<br/>&nbsp;&nbsp;Public<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 登录帐号<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property UserName:string Read FUserName Write FUserName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 登录密码<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property PassWord:string Read FPassWord Write FPassWord;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 协议数据接受(用做调试)<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnDataAvailable:TDataAvailable Read FDataAvailable Write FDataAvailable;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 协议命令发送(用做调试)<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnSendDataComm:TSendDataComm Read FSendDataComm Write FSendDataComm;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 调试模式<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property DebugModel:Boolean Read FDebugModel Write FDebugModel;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 仅当调试模式时调试文件保存的位置<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property DebugFileName:string Read FDebugFileName Write FDebugFileName;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;function ReceiveMsg:string; Virtual;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure AddGroup(GroupName:string); Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure DelGroup(GroupName:string); Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure AddFriend(FriendName:string); Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure DelFriend(FriendName:string); Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure Login; Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure Logout; Virtual;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;constructor Cr&#101;ate; Virtual;<br/>&nbsp;&nbsp;&nbsp;&nbsp;destructor Destroy; Override;<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;//MSN信息<br/>&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;/// TMSN类的会话类，主要由内部使用。调用者不应主动调用。<br/>&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;TMSNSession=class(TObject)<br/>&nbsp;&nbsp;Private<br/>&nbsp;&nbsp;&nbsp;&nbsp;FRequestSession:Boolean;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FIN:Integer;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FCL:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FRN:Integer;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket:TWSocket;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FAddr:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FPort:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FMsgBye:TNotifyEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FCommString:TStrings;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDataAvailable:TDataAvailable;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FUserObject:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FUser:string;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FByeSession:TByeSession;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FInviteAs:TNotifyEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FInvites:TInvites;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FMsgReceive:TMsgReceive;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FMsgKeyDown:TNotifyEvent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;DataBuf:TStrings;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDebugModel:Boolean;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure DataAvailable(Sender:TObject;ErrCode:Word);<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure SessionCloseed(Sender:TObject;ErrCode:Word);<br/>&nbsp;&nbsp;Protected<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure ProtocalAnalyze(ProtString:string);<br/>&nbsp;&nbsp;Public<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// 当前用户<br/>&nbsp;&nbsp;&nbsp;&nbsp;/// &lt;/summary&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property UserObject:string Read FUserObject Write FUserObject;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property Addr:string Read FAddr Write FAddr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property Port:string Read FPort Write FPort;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property MsgBye:TNotifyEvent Read FMsgBye Write FMsgBye;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property CL:string Read FCL Write FCL;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property RequestSession:Boolean Read FRequestSession Write FRequestSession;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnDataAvailable:TDataAvailable Read FDataAvailable Write FDataAvailable;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnByeSession:TByeSession Read FByeSession Write FByeSession;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnInviteAs:TNotifyEvent Read FInviteAs Write FInviteAs;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnInvites:TInvites Read FInvites Write FInvites;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnMsgReceive:TMsgReceive Read FMsgReceive Write FMsgReceive;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property OnMsgKeyDown:TNotifyEvent Read FMsgKeyDown Write FMsgKeyDown;<br/>&nbsp;&nbsp;&nbsp;&nbsp;property DebugModel:Boolean Read FDebugModel Write FDebugModel;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;function Invite(const ID:string):TMsgResult;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure MsgOut;<br/>&nbsp;&nbsp;&nbsp;&nbsp;procedure SendSession(Msg:string;FontName:string=&#39;Tahoma&#39;;Color:TColor=clblack;Inclined:Boolean=False;Thick:Boolean=False);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;constructor Cr&#101;ate;<br/>&nbsp;&nbsp;&nbsp;&nbsp;destructor Destroy;<br/>&nbsp;&nbsp;end;<br/></div></div><br/><br/>以下是部分实现代码<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.RainCoding.com/blog/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>{ TIMessage }<br/><br/>/// &lt;summary&gt;<br/>/// 添加好友<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;FriendName&#34;&gt; &lt;/param&gt;<br/><br/>procedure TIMessage.AddFriend(FriendName:string);<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 添加组<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;GroupName&#34;&gt;组名 &lt;/param&gt;<br/><br/>procedure TIMessage.AddGroup(GroupName:string);<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>constructor TIMessage.Cr&#101;ate;<br/>begin<br/>&nbsp;&nbsp;if not(Assigned(DebugRecord)) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;DebugRecord:=TStringList.Cr&#101;ate;<br/>&nbsp;&nbsp;FDebugFileName:=ExtractFilePath(ParamStr(0))+&#39;IM_Class_Debug_Log.htm&#39;;<br/>end;<br/><br/>procedure TIMessage.DataAvailable(Sender:TObject;ErrCode:Word);<br/>begin<br/>&nbsp;&nbsp;FRecStr:=TWSocket(FSocket).ReceiveStr;<br/>&nbsp;&nbsp;if FDebugModel then DebugRecord.Add(SERVER_RESPONSE+FRecStr);<br/>&nbsp;&nbsp;if Assigned(FDataAvailable) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDataAvailable(Sender,SERVER_RESPONSE+FRecStr,ErrCode);<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 删除好友<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;FriendName&#34;&gt; &lt;/param&gt;<br/><br/>procedure TIMessage.DelFriend(FriendName:string);<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 删除组<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;GroupName&#34;&gt;组名 &lt;/param&gt;<br/><br/>procedure TIMessage.DelGroup(GroupName:string);<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>destructor TIMessage.Destroy;<br/>begin<br/>&nbsp;&nbsp;DebugRecord.Add(DEBUG_SPLITER);<br/>&nbsp;&nbsp;DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+ClassName+&#39; Destroy...&#39;);<br/>&nbsp;&nbsp;if FDebugModel then<br/>&nbsp;&nbsp;&nbsp;&nbsp;DebugToFile(DebugRecord,FDebugFileName);<br/>&nbsp;&nbsp;FreeAndNil(DebugRecord);<br/>&nbsp;&nbsp;inherited Destroy;<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 登录<br/>/// &lt;/summary&gt;<br/><br/>procedure TIMessage.Login;<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 注销<br/>/// &lt;/summary&gt;<br/><br/>procedure TIMessage.Logout;<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>procedure TIMessage.ProtocalAnalyze(const ProtString:string);<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>///&lt;summary&gt;<br/>/// 接受消息<br/>/// &lt;/summary&gt;<br/><br/>function TIMessage.ReceiveMsg:string;<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>procedure TIMessage.SendComm;<br/>begin<br/>&nbsp;&nbsp;//<br/>end;<br/><br/>procedure TIMessage.SockSocksConnected(Sender:TObject;ErrCode:Word);<br/>begin<br/>&nbsp;&nbsp;DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+&#39;Socket Connected &#39;+&#39;Host: &#39;+TWSocket(FSocket).Addr+&#39; Port: &#39;+TWSocket(FSocket).Port);<br/>end;<br/><br/>{ TMSN }<br/><br/>constructor TMSN.Cr&#101;ate(Owner:TComponent);<br/>begin<br/>&nbsp;&nbsp;inherited Cr&#101;ate;<br/>&nbsp;&nbsp;DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+Self.ClassName+DEBUG_Cr&#101;ate);<br/>&nbsp;&nbsp;DebugRecord.Add(DEBUG_SPLITER);<br/>&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;FCurrentSession:=-1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSessionList:=TClassList.Cr&#101;ate;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSocket:=TWSocket.Cr&#101;ate(nil);<br/>&nbsp;&nbsp;&nbsp;&nbsp;TWSocket(FSocket).MultiThreaded:=True;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FCommString:=TStringList.Cr&#101;ate;<br/>{$IFNDEF DllMode}<br/>&nbsp;&nbsp;&nbsp;&nbsp;FAntiFreeze:=TIdAntiFreeze.Cr&#101;ate(Owner);<br/>&nbsp;&nbsp;&nbsp;&nbsp;FAntiFreeze.OnlyWhenIdle:=False;<br/>{$ENDIF}<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSynInfo:=TStringList.Cr&#101;ate;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FRN:=-1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FMsnVer:=&#39;7.0.0816&#39;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FOSVer:=&#39;5.0&#39;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FMSNProtocol:=10;//默认协议版本号，关系到服务器验证的实现<br/>&nbsp;&nbsp;&nbsp;&nbsp;with FSocket as TWSocket do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCommString.Clear;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSessionConnected:=Self.SockSocksConnected;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Addr:=MSN_LOGINDISPATCH;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port:=MSN_LOGINNETPORT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnDataAvailable:=Self.DataAvailable;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;except<br/>&nbsp;&nbsp;&nbsp;&nbsp;DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+Self.ClassName+DEBUG_Cr&#101;ate_ERROR);<br/>&nbsp;&nbsp;end;<br/><br/>end;<br/><br/>procedure TMSN.DataAvailable(Sender:TObject;ErrCode:Word);<br/>begin<br/>&nbsp;&nbsp;inherited DataAvailable(Sender,ErrCode);<br/>&nbsp;&nbsp;EventProcess;<br/><br/>end;<br/><br/>destructor TMSN.Destroy;<br/>var<br/>&nbsp;&nbsp;i:Integer;<br/>begin<br/>&nbsp;&nbsp;FreeAndNil(FSynInfo);<br/>&nbsp;&nbsp;{ for i:=0 to FSessionTotal do<br/>&nbsp;&nbsp;&nbsp;&nbsp; if Assigned(FSessionList[i]) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMSNSession(FSessionList[i]).Free;}<br/>{$IFNDEF DllMode}<br/>&nbsp;&nbsp;FreeAndNil(FAntiFreeze);<br/>{$ENDIF}<br/>&nbsp;&nbsp;TWSocket(FSocket).Close;<br/>&nbsp;&nbsp;FreeAndNil(FCommString);<br/>&nbsp;&nbsp;FreeAndNil(FSocket);<br/>&nbsp;&nbsp;FreeAndNil(FSessionList);<br/>&nbsp;&nbsp;inherited Destroy;<br/>end;<br/><br/>//获取NetPassPort的Ticket<br/><br/>procedure TMSN.GetTicket(const URL:string;const Host:string=&#39;&#39;;const Authorization:string=&#39;&#39;);<br/>var<br/>&nbsp;&nbsp;FHttp:TidHttp;<br/>&nbsp;&nbsp;OpenSSL:TIdSSLIOHandlerSocketOpenSSL;<br/>&nbsp;&nbsp;s:string;<br/>&nbsp;&nbsp;t:string;<br/>&nbsp;&nbsp;tempstring:TStrings;<br/>begin<br/>&nbsp;&nbsp;FHttp:=TidHttp.Cr&#101;ate(nil);<br/>&nbsp;&nbsp;OpenSSL:=TIdSSLIOHandlerSocketOpenSSL.Cr&#101;ate(nil);<br/>&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;if Host=&#39;&#39; then FHttp.ProtocolVersion:=pv1_0;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;OpenSSL.SSLOptions.Method:=sslvSSLv23;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FHttp.IOHandler:=OpenSSL;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FHttp.Request.Host:=Host;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FHttp.Request.CustomHeaders.Add(Authorization);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FHttp.Get(URL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;except<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//302<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;s:=FHttp.Response.Location;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if LowerCase(LeftStr(s,8))=SSL_HEAD then<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc(FRefTag);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FRef:=FRefTag;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FHttp.Disconnect;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetTicket(s,Host,Authorization);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dec(FRefTag);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;t:=FHttp.Response.RawHeaders.Values[TICKET_HEAD];<br/><br/>&nbsp;&nbsp;finally<br/>&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(OpenSSL);<br/>&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(FHttp);<br/>&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;if FRef=FRefTag then<br/>&nbsp;&nbsp;&nbsp;&nbsp;if Pos(&#39;=&#39;&#39;t=&#39;,t)=0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Assigned(FLoginError)) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FLoginError(Self);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempstring:=SplitString(t,&#39;,&#39;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fticket:=MidStr(tempstring[1],10,Length(tempstring[1])-10);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(tempstring);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 登录MSN<br/>/// &lt;/summary&gt;<br/><br/>procedure TMSN.Login;<br/>var<br/>&nbsp;&nbsp;i,j:Integer;<br/>begin<br/>&nbsp;&nbsp;inherited Login;<br/>&nbsp;&nbsp;TWSocket(FSocket).Connect;<br/>&nbsp;&nbsp;LoginInit;<br/>&nbsp;&nbsp;SendComm;<br/><br/>end;<br/><br/>procedure TMSN.LoginInit;<br/>begin<br/>&nbsp;&nbsp;with FCommString as TStringList do<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;Add(MSN_COMM_VER+IntToStr(Count)+MSN_COMM_PROTOCOL+IntToStr(FMSNProtocol)+MSN_COMM_NAME+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;Add(MSN_COMM_CVR+IntToStr(Count)+&#39; &#39;+MSN_COMM_LANGUAGE_GB+MSN_COMM_OSTAG+FOSVer+MSN_COMM_OSTAG1+MSN_COMM_MSNVER+FMsnVer+&#39; &#39;+MSN_COMM_USER+UserName+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;Add(MSN_COMM_USR+IntToStr(Count)+MSN_COMM_TWN_I+UserName+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;end;<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 注销<br/>/// &lt;/summary&gt;<br/><br/>procedure TMSN.Logout;<br/>begin<br/>&nbsp;&nbsp;inherited Logout;<br/>&nbsp;&nbsp;TWSocket(FSocket).SendStr(MSN_COMM_USR+IntToStr(FCommString.Count+1)+MSN_COMM_OUT+MSN_COMM_ENTER);<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 会话退出<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;TalkUser&#34;&gt;需要退出会话的用户(默认为最后进行对话的用户) &lt;/param&gt;<br/><br/>procedure TMSN.MsgOut(TalkUser:string=&#39;&#39;);<br/>var<br/>&nbsp;&nbsp;i,j:Integer;<br/>begin<br/>&nbsp;&nbsp;j:=FSessionList.Count;<br/>&nbsp;&nbsp;if j=0 then Exit;<br/>&nbsp;&nbsp;Dec(j);<br/>&nbsp;&nbsp;for i:=0 to j do<br/>&nbsp;&nbsp;&nbsp;&nbsp;if TMSNSession(FSessionList[i]).FUser=TalkUser then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMSNSession(FSessionList[i]).MsgOut;<br/>&nbsp;&nbsp;// FreeAndNil(FMSNSession);<br/>end;<br/><br/>//对返回的信息进行分析<br/><br/>procedure TMSN.ProtocalAnalyze(const ProtString:string);<br/>var<br/>&nbsp;&nbsp;s,t,ck:string;<br/>&nbsp;&nbsp;xaddr:TStrings;<br/>&nbsp;&nbsp;i:Integer;<br/>&nbsp;&nbsp;PS:string;<br/>begin<br/>&nbsp;&nbsp;inherited ProtocalAnalyze(ProtString);<br/>&nbsp;&nbsp;s:=GetFirstWord(FRecStr);<br/>&nbsp;&nbsp;if (s=TrimRight(MSN_COMM_XFR))and(Pos(&#39;SB&#39;,ProtString)=0) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;LoginInit;<br/>&nbsp;&nbsp;&nbsp;&nbsp;with FSocket as TWSocket do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xaddr:=SplitString(ProtString,&#39; &#39;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xaddr:=SplitString(xaddr[3],&#39;.&#39;);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with FSocket as TWSocket do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Addr:=xaddr[0]+&#39;.&#39;+xaddr[1]+&#39;.&#39;+xaddr[2]+&#39;.&#39;+MidStr(xaddr[3],0,Pos(&#39;:&#39;,xaddr[3])-1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port:=RightStr(xaddr[3],Length(xaddr[3])-Pos(&#39;:&#39;,xaddr[3]));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connect;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(xaddr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;if s=TrimRight(MSN_COMM_CHL) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;TWSocket(FSocket).SendStr(MSN_COMM_QRY+IntToStr(FCommString.Count+1)+MSN_CLIENT_ID+MSN_CLIENT_VER+MSN_COMM_ENTER+LowerCase(StrMD5(Trim(SplitString(ProtString,&#39; &#39;)[2])+MSN_CLIENT_KEY)));<br/>&nbsp;&nbsp;&nbsp;&nbsp;if Assigned(FQryFinish) then FQryFinish(Self);<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;if (s=TrimRight(MSN_COMM_XFR))and(Pos(&#39;SB&#39;,ProtString)&lt;&gt;0) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;PS:=Trim(ProtString);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SessionCr&#101;ate;<br/>&nbsp;&nbsp;&nbsp;&nbsp;with TMSNSession(FSessionList[FCurrentSession]) do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestSession:=False;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CL:=Trim(SplitString(PS,&#39; &#39;)[5]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Addr:=MidStr(PS,Pos(&#39;SB&#39;,PS)+2,Pos(&#39;:&#39;,PS)-Pos(&#39;SB&#39;,PS)-2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port:=MSN_LOGINNETPORT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FUser:=FTalkID;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Invite(FTalkID);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;if s=TrimRight(MSN_COMM_RNG) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;PS:=Trim(ProtString);<br/>&nbsp;&nbsp;&nbsp;&nbsp;SessionCr&#101;ate;<br/>&nbsp;&nbsp;&nbsp;&nbsp;with TMSNSession(FSessionList[FCurrentSession]) do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestSession:=True;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CL:=Trim(SplitString(PS,&#39; &#39;)[4])+&#39; &#39;+Trim(SplitString(PS,&#39; &#39;)[1]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Addr:=Trim(LeftStr(SplitString(PS,&#39; &#39;)[2],Length(SplitString(PS,&#39; &#39;)[2])-5));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port:=MSN_LOGINNETPORT;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FUser:=Trim(SplitString(PS,&#39; &#39;)[5]);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Invite(&#39;&#39;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;if (s=TrimRight(MSN_COMM_USR))and(Pos(&#39;TWN S&#39;,ProtString)&lt;&gt;0) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;xaddr:=SplitString(ProtString,&#39;,&#39;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftlc:=xaddr[0];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftid:=xaddr[1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fttw:=xaddr[2];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftfs:=xaddr[3];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftru:=xaddr[4];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftct:=xaddr[5];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftkpp:=xaddr[6];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftkv:=xaddr[7];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftver:=xaddr[8];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ftrn:=xaddr[9];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fttpf:=xaddr[xaddr.count-1];&nbsp;&nbsp;&nbsp;&nbsp; //Modify<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接保留<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t:=MSN_Author_TAG+HttpEncode(FUserName)+MSN_PAW_TAG+HttpEncode(FPassWord)+&#39;,&#39;+Ftlc+&#39;,&#39;+Ftid+&#39;,&#39;+Fttw+&#39;,&#39;+Ftfs+MSN_SERVER_TAG+Ftct+&#39;,&#39;+Ftkpp+&#39;,&#39;+Ftkv+&#39;,&#39;+Ftver+&#39;,&#39;+Fttpf+#13#10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetTicket(SSL_HEAD+MSN_PASSPORTSERVER,MSN_HOST,t);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Fticket&lt;&gt;&#39;&#39; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCommString.Add(MSN_COMM_USR+IntToStr(FCommString.Count)+MSN_COMM_TWN_S+Fticket+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// FCommString.Add(MSN_COMM_SYN+IntToStr(FCommString.Count)+&#39; 0 0&#39;+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCommString.Add(MSN_COMM_CHG+IntToStr(FCommString.Count)+&#39; NLN&#39;+MSN_CLIENT_VER+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//FCommString.Add(MSN_COMM_PNG+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;finally<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(xaddr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;if s=MSN_RESPONSE_ADC then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;TWSocket(FSocket).SendStr(&#39;ADC &#39;+IntToStr(FCommString.Count)+&#39; NLN&#39;+MSN_CLIENT_VER+MSN_COMM_ENTER);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(&#39;ADD &#39;+IntToStr(FCommString.Count)+&#39; FL &#39;+SplitString(PS,&#39; &#39;)[3]+&#39; &#39;+SplitString(PS,&#39; &#39;)[4]+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TWSocket(FSocket).SendStr(&#39;ADD &#39;+IntToStr(FCommString.Count)+&#39; FL &#39;+SplitString(FRecStr,&#39; &#39;)[3]+&#39; &#39;+SplitString(FRecStr,&#39; &#39;)[4]+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;//发送下一条协议命令<br/>&nbsp;&nbsp;SendComm;<br/><br/>end;<br/><br/>procedure TMSN.SendComm;<br/>var<br/>&nbsp;&nbsp;s:string;<br/>begin<br/>&nbsp;&nbsp;inherited SendComm;<br/>&nbsp;&nbsp;inc(FRN);<br/>&nbsp;&nbsp;if FRN&gt;=FCommString.Count then<br/>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br/><br/>&nbsp;&nbsp;if Assigned(FSendDataComm) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSendDataComm(Self,CLIENT_REQUEST+FCommString[FRN]);<br/>&nbsp;&nbsp;if DebugModel then DebugRecord.Add(CLIENT_REQUEST+FCommString[FRN]);<br/>&nbsp;&nbsp;while TWSocket(FSocket).State&lt;&gt;wsConnected do<br/>&nbsp;&nbsp;&nbsp;&nbsp;Application.ProcessMessages;<br/><br/>&nbsp;&nbsp;TWSocket(FSocket).SendStr(FCommString[FRN]);<br/>&nbsp;&nbsp;// if LeftStr(FCommString[FRN],3)=&#39;QRY&#39; then<br/>&nbsp;&nbsp; //showmessage(fcommstring[frn]);<br/><br/>end;<br/><br/>//发出邀请<br/><br/>/// &lt;summary&gt;<br/>/// 邀请好友加入当前会话<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;ID&#34;&gt;需要邀请者的帐号 &lt;/param&gt;<br/><br/>procedure TMSN.Invite(const ID:string);<br/>begin<br/>&nbsp;&nbsp;FTalkID:=ID;<br/>&nbsp;&nbsp;TWSocket(FSocket).SendStr(MSN_COMM_XFR+IntToStr(FRN+FCommString.Count+1)+&#39; SB&#39;+MSN_COMM_ENTER);<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 向指定好友发送消息(需成功邀请到好友)<br/>/// &lt;/summary&gt;<br/>/// &lt;param name=&#34;Msg&#34;&gt;消息内容 &lt;/param&gt;<br/>/// &lt;param name=&#34;SendUser&#34;&gt;发送的好友对象 &lt;/param&gt;<br/>/// &lt;param name=&#34;FontName&#34;&gt;字体(默认为Tahoma) &lt;/param&gt;<br/>/// &lt;param name=&#34;Color&#34;&gt;字体颜色(默认为黑色) &lt;/param&gt;<br/>/// &lt;param name=&#34;Inclined&#34;&gt;是否是斜体 &lt;/param&gt;<br/>/// &lt;param name=&#34;Thick&#34;&gt;是否加粗 &lt;/param&gt;<br/><br/>procedure TMSN.SendMsg(Msg:string;SendUser:string=&#39;&#39;;FontName:string=&#39;Tahoma&#39;;Color:TColor=clblack;Inclined:Boolean=False;Thick:Boolean=False);<br/>var<br/>&nbsp;&nbsp;i,j:Integer;<br/>begin<br/>&nbsp;&nbsp;j:=FSessionList.Count;<br/>&nbsp;&nbsp;if j=0 then Exit;<br/>&nbsp;&nbsp;Dec(j);<br/>&nbsp;&nbsp;if SendUser&lt;&gt;&#39;&#39; then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;for i:=0 to j do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if TMSNSession(FSessionList.Items[i]).FUser=SendUser then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoreSendMsg(i,Msg,FontName,Color,Inclined,Thick);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;end<br/>&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;CoreSendMsg(FCurrentSession,Msg,FontName,Color,Inclined,Thick);<br/><br/>end;<br/><br/>procedure TMSN.EventProcess;<br/>var<br/>&nbsp;&nbsp;tmp:TStringList;<br/>&nbsp;&nbsp;i,j:Integer;<br/>&nbsp;&nbsp;s:string;<br/>begin<br/>&nbsp;&nbsp;if (Assigned(FLoginError))and(LeftStr(FRecStr,3)=&#39;911&#39;) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FLoginError(Self);<br/>&nbsp;&nbsp;if (Assigned(FLoginSucess))and(Pos(&#39;OK&#39;,FRecStr)&lt;&gt;0) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FLoginSucess(Self);<br/>&nbsp;&nbsp;if (Pos(&#39;LST N=&#39;,FRecStr)&lt;&gt;0)and(Assigned(FResultLinkman)) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;tmp:=SplitString(FRecStr,MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;for i:=0 to tmp.Count-1 do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Pos(MSN_LINK_LST,tmp[i])&lt;&gt;0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:=SplitString(tmp[i],&#39; &#39;)[1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FResultLinkman(Self,Copy(s,3,Length(s)-1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;tmp.Free;<br/>&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;if (Assigned(FSynFinish))and(LeftStr(FRecStr,3)=MSN_COMM_QNG) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSynFinish(Self);<br/>&nbsp;&nbsp;if FRecStr&lt;&gt;&#39;&#39; then ProtocalAnalyze(FRecStr);<br/>end;<br/><br/>/// &lt;summary&gt;<br/>/// 获取好友列表<br/>/// &lt;/summary&gt;<br/><br/>procedure TMSN.GetSynList;<br/>begin<br/>&nbsp;&nbsp;TWSocket(FSocket).SendStr(MSN_COMM_SYN+IntToStr(FCommString.Count)+&#39; 0 0&#39;+MSN_COMM_ENTER);<br/>end;<br/><br/>procedure TMSN.Ping;<br/>begin<br/>&nbsp;&nbsp;TWSocket(FSocket).SendStr(MSN_COMM_PNG+MSN_COMM_ENTER);<br/>end;<br/><br/>procedure TMSN.SessionCr&#101;ate;<br/>begin<br/>&nbsp;&nbsp;inc(FCurrentSession);<br/>&nbsp;&nbsp;FMSNSession:=TMSNSession.Cr&#101;ate;<br/>&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSessionList.Add(TClass(FMSNSession));<br/>&nbsp;&nbsp;&nbsp;&nbsp;with TMSNSession(FSessionList[FCurrentSession]) do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FUser:=Self.FTalkID;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserObject:=Self.FUserName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnMsgKeyDown:=Self.FMsgKeyDown;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnMsgReceive:=Self.FMsgReceive;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnInviteAs:=Self.FInviteAs;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnByeSession:=Self.OnAfterByeSession;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnDataAvailable:=Self.FDataAvailable;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnInvites:=Self.FInvites;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DebugModel:=Self.FDebugModel;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;finally<br/>&nbsp;&nbsp;&nbsp;&nbsp;inc(FSessionTotal);<br/>&nbsp;&nbsp;end;<br/>end;<br/><br/>procedure TMSN.OnAfterByeSession(TalkUser:string);<br/>var<br/>&nbsp;&nbsp;i,j:Integer;<br/>begin<br/>&nbsp;&nbsp;//&nbsp;&nbsp;FSessionList[FSessionList.Count-1].Free;<br/>{&nbsp;&nbsp;if Assigned(FMSNSession[FCurrentSession]) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;FMSNSession[FCurrentSession].Free;<br/>&nbsp;&nbsp;Dec(FCurrentSession);<br/>&nbsp;&nbsp;end;}<br/> { try<br/>&nbsp;&nbsp;&nbsp;&nbsp;j:=FSessionList.Count;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if j&lt;&gt;0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i:=0 to j-1 do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if TMSNSession(FSessionList[i]).FUser=TalkUser then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FSessionList.Del&#101;te(i);<br/>&nbsp;&nbsp;except<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;end;}<br/>&nbsp;&nbsp;if Assigned(FByeSession) then FByeSession(TalkUser);<br/>end;<br/><br/>procedure TMSN.CoreSendMsg(Index:Integer;Msg,FontName:string;Color:TColor;<br/>&nbsp;&nbsp;Inclined,Thick:Boolean);<br/>begin<br/>&nbsp;&nbsp;try<br/>&nbsp;&nbsp;&nbsp;&nbsp;if Assigned(TMSNSession(FSessionList[Index])) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TMSNSession(FSessionList[Index]).SendSession(Msg,FontName,Color,Inclined,Thick);<br/>&nbsp;&nbsp;except<br/>&nbsp;&nbsp;&nbsp;&nbsp;//<br/>&nbsp;&nbsp;end;<br/>end;<br/><br/>{ TMSNSession }<br/><br/>constructor TMSNSession.Cr&#101;ate;<br/>begin<br/>&nbsp;&nbsp;if FDebugModel then<br/>&nbsp;&nbsp;&nbsp;&nbsp;DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+Self.ClassName+DEBUG_Cr&#101;ate);<br/><br/>&nbsp;&nbsp;DataBuf:=TStringList.Cr&#101;ate;<br/>&nbsp;&nbsp;FSSocket:=TWSocket.Cr&#101;ate(nil);<br/>&nbsp;&nbsp;FSSocket.MultiThreaded:=True;<br/>&nbsp;&nbsp;FSSocket.OnSessionClosed:=SessionCloseed;<br/>&nbsp;&nbsp;FCommString:=TStringList.Cr&#101;ate;<br/>&nbsp;&nbsp;FSSocket.OnDataAvailable:=DataAvailable;<br/>&nbsp;&nbsp;FreeAndNil(DataBuf);<br/><br/>end;<br/><br/>procedure TMSNSession.DataAvailable(Sender:TObject;ErrCode:Word);<br/>var<br/>&nbsp;&nbsp;tmp:string;<br/>&nbsp;&nbsp;i:Integer;<br/>begin<br/><br/>&nbsp;&nbsp;tmp:=FSSocket.ReceiveStr;<br/>&nbsp;&nbsp;//DataBuf.Add(tmp);<br/>&nbsp;&nbsp;// tmp:=Utf8ToAnsi(tmp);<br/>&nbsp;&nbsp;if FDebugModel then DebugRecord.Add(SERVER_RESPONSE+tmp);<br/><br/>&nbsp;&nbsp;if Assigned(FDataAvailable) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FDataAvailable(Sender,tmp,ErrCode);<br/>&nbsp;&nbsp;//form1.Memo1.Lines.Add(utf8toansi(tmp));<br/><br/>&nbsp;&nbsp;//for i:=0 to DataBuf.Count-1 do<br/>&nbsp;&nbsp;ProtocalAnalyze(tmp);<br/><br/>&nbsp;&nbsp;//DataBuf.Clear;<br/><br/>end;<br/><br/>destructor TMSNSession.Destroy;<br/>begin<br/>&nbsp;&nbsp;FreeAndNil(FCommString);<br/>&nbsp;&nbsp;FreeAndNil(FSSocket);<br/>&nbsp;&nbsp;if FDebugModel then DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+Self.ClassName+DEBUG_DESTROY);<br/>end;<br/><br/>procedure TMSNSession.MsgOut;<br/>begin<br/>&nbsp;&nbsp;FSSocket.SendStr(MSN_SESSION_OUT+MSN_COMM_ENTER);<br/>end;<br/><br/>procedure TMSNSession.ProtocalAnalyze(ProtString:string);<br/>var<br/>&nbsp;&nbsp;PS:string;<br/>&nbsp;&nbsp;PSTag:string;<br/>&nbsp;&nbsp;s:string;<br/>&nbsp;&nbsp;i:Integer;<br/>begin<br/>&nbsp;&nbsp;PS:=Trim(ProtString);<br/>&nbsp;&nbsp;PSTag:=LeftStr(PS,3);<br/><br/>&nbsp;&nbsp;if (PSTag=MSN_RESPONSE_BYE)and(Assigned(FByeSession)) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FByeSession(FUser);<br/><br/>&nbsp;&nbsp;if (LeftStr(PS,3)=TrimRight(MSN_COMM_USR))and(Pos(MSN_RESPONSE_OK,PS)&lt;&gt;0) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket.SendStr(FCommString[FIN]);<br/><br/>&nbsp;&nbsp;if PSTag=MSN_RESPONSE_NAK then Exit;//会话关闭<br/><br/>&nbsp;&nbsp;if Assigned(FInviteAs)and(Pos(MSN_COMM_JOI,PS)&lt;&gt;0) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FInviteAs(Self);<br/><br/>&nbsp;&nbsp;if PSTag=MSN_SESSION_IRO then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;s:=SplitString(PS,&#39; &#39;)[SplitString(PS,&#39; &#39;).Count-1];<br/>&nbsp;&nbsp;&nbsp;&nbsp;if Assigned(FInvites) then FInvites(s);<br/>&nbsp;&nbsp;end;<br/><br/>&nbsp;&nbsp;if (PSTag=TrimRight(MSN_COMM_MSG)) then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (Assigned(FMsgKeyDown)) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FMsgKeyDown(Self);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (Pos(&#39;PF=&#39;,PS)&lt;&gt;0)and(Assigned(FMsgReceive)) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:=MidStr(PS,Pos(MSN_MSG_ENTER,PS)+Length(MSN_MSG_ENTER),Length(PS)-Pos(MSN_MSG_ENTER,PS)+Length(MSN_MSG_ENTER));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Pos(TrimRight(MSN_COMM_MSG),s)=0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FMsgReceive(Self,FUser,Utf8ToAnsi(s))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//包错误<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;end;<br/>end;<br/><br/>function TMSNSession.Invite(const ID:string):TMsgResult;<br/>begin<br/>&nbsp;&nbsp;if FSSocket.State&lt;&gt;wsConnected then<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;if not(FRequestSession) then<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCommString.Add(MSN_COMM_USR+IntToStr(FRN+FCommString.Count+1)+&#39; &#39;+FUserObject+&#39; &#39;+FCL+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCommString.Add(MSN_COMM_CAL+IntToStr(FRN+FCommString.Count+1)+&#39; &#39;+ID+MSN_COMM_ENTER);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCommString.Add(MSN_COMM_ANS+IntToStr(FRN+FCommString.Count+1)+&#39; &#39;+FUserObject+&#39; &#39;+FCL+MSN_COMM_ENTER);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket.Close;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket.Addr:=FAddr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket.Port:=FPort;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket.Connect;<br/>&nbsp;&nbsp;&nbsp;&nbsp;FRN:=100;<br/>&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;if FDebugModel then DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+Self.ClassName+&#39;Connection... Host: &#39;+FAddr+&#39;Port: &#39;+FPort);<br/>&nbsp;&nbsp;while FSSocket.State&lt;&gt;wsConnected do<br/>&nbsp;&nbsp;&nbsp;&nbsp;Application.ProcessMessages;<br/><br/>&nbsp;&nbsp;if FIN&lt;FCommString.Count then<br/>&nbsp;&nbsp;&nbsp;&nbsp;FSSocket.SendStr(FCommString[FIN]);<br/><br/>&nbsp;&nbsp;if FDebugModel then DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+CLIENT_REQUEST+FCommString[FIN]);<br/><br/>&nbsp;&nbsp;inc(FIN);<br/>&nbsp;&nbsp;inc(FRN,100);<br/>end;<br/><br/>procedure TMSNSession.SendSession(Msg:string;FontName:string=&#39;Tahoma&#39;;Color:TColor=clblack;Inclined:Boolean=False;Thick:Boolean=False);<br/>var<br/>&nbsp;&nbsp;MsgHead:string;<br/>&nbsp;&nbsp;i:Integer;<br/>&nbsp;&nbsp;B:string;<br/>begin<br/>&nbsp;&nbsp;if Inclined then B:=&#39;I&#39;;<br/>&nbsp;&nbsp;if Thick then B:=&#39;B&#39;+B;<br/>&nbsp;&nbsp;Msg:=AnsiToUtf8(Msg);<br/>&nbsp;&nbsp;MsgHead:=MSN_MSG_HEAD+HtmlEncode(FontName)+MSN_MSG_FONTSTYLE+B+MSN_MSG_COLOR+IntToHex(ColorToRGB(Color),6)+MSN_MSG_FONTCHARSET+MSN_MSG_FONTGB+MSN_MSG_FONSTSIZE+MSN_MSG_ENTER;<br/>&nbsp;&nbsp;i:=Length(MsgHead)+Length(Msg);<br/>&nbsp;&nbsp;FSSocket.SendStr(MSN_COMM_MSG+IntToStr(FRN)+&#39; N &#39;+IntToStr(i)+MSN_COMM_ENTER+MsgHead+Msg);<br/>end;<br/><br/>procedure TMSNSession.SessionCloseed(Sender:TObject;ErrCode:Word);<br/>begin<br/>&nbsp;&nbsp;if Assigned(FByeSession) then FByeSession(FUser);<br/>&nbsp;&nbsp;if FDebugModel then DebugRecord.Add(DateToStr(Date)+&#39; &#39;+TimeToStr(Time)+&#39; &#39;+&#39;Session Closed...&#39;);<br/>end;<br/></div></div><br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=130</link>
			<title><![CDATA[冒险岛资源导出自动化小工具]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Thu,07 Jun 2007 14:16:52 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=130</guid>
		<description><![CDATA[好拗口的标题,汗.平时写些小游戏最缺的就是资源.这不<a target="_blank" href="http://www.huosoft.com/" rel="external">火人</a>写了一个冒险岛资源导出工具,这不让俺们垂涎三尺.可惜由于某种原因火人大侠并没有提供批量导出功能.自己动手丰衣足食.本自动化工具使用起来很简单,打开火人的资源导出工具定位到需要导出的资源文件夹输入需要导出的图片数量然后点击AutoClick就在一边等吧.期间最好不要进行其他工作和其他操作以免有图片遗漏.<br/>(对于本工具我放弃一切权利,全当玩具.有问题也别来找我啊,自己改改吧.)<br/><img src="http://www.RainCoding.com/blog/../blog/software//AutoClickWZ.jpg" border="0" alt=""/><br/><br/><a target="_blank" href="http://www.RainCoding.com/blog/../blog/software/AutoClickforWZ.rar" rel="external">点击下载</a>]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=128</link>
			<title><![CDATA[HGE连载教程(1)的补充]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Tue,29 May 2007 16:22:46 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=128</guid>
		<description><![CDATA[以前写过一段小代码来演示了一下hge的粒子引擎效果.<a target="_blank" href="http://www.RainCoding.com/blog/../blog/article.asp?id=66" rel="external">跳到该文章</a>,但是目前hge已升级到了v1.7,所以以前的代码和资源格式需要修改一下.这不有了一些片刻时间就把她补上了.近些来我的主要精力都放在学习和自己的平台游戏上.所以该连载教程应该不会继续下去了.希望有时间尽量补上一些有趣的代码吧.<br/><br/>工程在VC6下编译,需要hge.dll和bass.dll文件的运行时支持.<br/><a target="_blank" href="http://www.RainCoding.com/blog/../blog/software/hge_tutor1.rar" rel="external">工程下载</a>]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=110</link>
			<title><![CDATA[U-Cool开发中...]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Mon,05 Feb 2007 16:50:16 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=110</guid>
		<description><![CDATA[由于自己使用上的关系准备开发一款U盘的同步小工具。预计春节前后发出预览版，当然软件完全免费。做这款软件主要是自己对程序架构流程设计编程技巧的一次总结，故软件逻辑方面写的会比较精致且在性能上也做最大化优化，总之是一款精心炮制的作品。现在正在编写核心逻辑代码尚未涉及到UI部分，故不能截图了。喜欢的朋友请留意。<br/><br/>07-2-26:<br/>再做界面时突然觉得没有意思，所以就半途而废。何时复活或能不能复活就看天命了。<br/><br/>07-2-16：<br/>内核功能接近完工，接下来主要是界面设计和一些内核附加功能的添加。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=101</link>
			<title><![CDATA[一个文件传送类]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Sun,15 Oct 2006 20:17:06 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=101</guid>
		<description><![CDATA[经常在论坛上看到有朋友提出关于文件传送方面的问题，碰巧自己在项目中也需要有一个这样的功能，于是本着拿来主义就在网上搜索相关的组件。本人对Delphi程序员行情不看好(主要是薪水低)的主要原因就是有数以万计好用的VCL供开发者使用，使得开发程序变成了机械的调用门槛也大大降低，咳！多则滥则贬值也。OK，言归正攥在庞大的第三方库里我居然没有找到关于文件传输的组件，获许我孤陋寡闻，如果有朋友知道望推荐一二。我忽然记得以前有一本《Delphi精要》的书，作者罗小平。他在最后一章就献给了读者朋有一对文件远程传输组件。我赶紧翻箱倒柜找出光盘装上试用了一番发现该组件有几个缺点：虽然支持多文件传送，但在文件协议方面有不完善的地方导致传送很多文件(所有的文件路径加起来超过Socket缓冲大小)就会发生错误。不能保持路径。资源占用比较大。所以不是很符合我的要求，网上找的一些Demo都是基于Indy。Indy版本众多，在我这的IDE总是编译不起来且Indy的Bug多是有名的。一咬要自己写，于是乎这二个小玩意就诞生了。目前版本支持无限数量文件传送且资源占用不会随文件数量增多而增多。支持保持目录结构传送。传送速度还是比较快的。未使用任何第三方控件。呵呵，一堆功能也就数百行代码而已。OK,因为该组件用在我自己的Project中，所以我会不断升级他的功能。如果有朋友在自己的项目中使用或改动向我招呼一声就OK.如果发现Bug请在Blog中留言，万分感谢！<br/><br/>源码包中包括传送和接收类和一个范例。你也可以安装在IDE上方便使用。<br/><br/><img src="http://www.RainCoding.com/blog/../blog/software/SockFile_Client.jpg" border="0" alt=""/><br/><br/><a target="_blank" href="http://www.RainCoding.com/blog/../blog/software/SockSendFile.rar" rel="external">源码包下载</a><br/><br/>目前增加一套采用正向连接的版本(服务端发送，客户端接受)由于该模式应用很广如在线升级S2P等故在反向连接的基础上增加了一些特性：1.支持客户端密码验证功能。2.支持客户端连接数量的控制功能.3.支持升级模式功能.还有其他一些细节改良并精简代码保持以最少的代码实现最多的功能。以后的升级版本还要加上断点续传，黑名单等功能。不过那要看时间够不够了。<br/><br/>注意：该版本是采用反向连接，服务端收取，客户端发送。适合多对一的场合。<br/><br/>*增加客户端和服务端文件独占方式的检测，如果存在则跳过。不影响正常传送。<br/>*再次修正多客户端同时发送文件时有一客户端断开造成服务端错误的Bug(虽然服务端的Socket.Connections数组维护着所有Client连接但是我发现在多客户端密集型请求服务时该数组有时会维护失败，表现为明明是关闭的Socket却还在数组里且引用计数也不对。没办法，只好自己做Socket的维护工作了，古话说得好，求人不如求己。)目前版本对多客户端已比较稳定，在反复测试四客户端并发，顺序，逆序，随机发送请求上皆通过。<br/>*修正多客户端传送完毕后连接断开时会造成错误的Bug(待测试中)<br/>+现在服务端支持多个客户端的发送请求。]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=95</link>
			<title><![CDATA[天气预报插件]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Thu,01 Jun 2006 14:25:44 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=95</guid>
		<description><![CDATA[突然发现我的Blog似乎变成了一个发布自己作品的平台了。看来以后还是要多写文章啊！<br/>废话不说，发布一个获取世界各国城市天气数据的插件，数据采集于XX组织XX机构，反正能够得到主要国家的大多城市。中国支持北京，南京，上海，武汉，广州... ...你自己试吧。该插件写他的目的是用在我的Msn Rob上为客户提供气象服务的。附件包提供调用该插件的一些范例信息，你可以很轻松的把他译成其他语言。<br/><br/><img src="http://www.RainCoding.com/blog/images/download.gif" alt="只允许会员下载" style="margin:0px 2px -4px 0px"/> 该文件只允许会员下载! <a href="http://www.RainCoding.com/blog/login.asp">登录</a> | <a href="http://www.RainCoding.com/blog/register.asp">注册</a>]]></description>
		</item>
		
			<item>
			<link>http://www.RainCoding.com/blog/article.asp?id=94</link>
			<title><![CDATA[MSN赝品]]></title>
			<author>(rain)</author>
			<category><![CDATA[我的作品]]></category>
			<pubDate>Tue,23 May 2006 14:32:55 +0800</pubDate>
			<guid>http://www.RainCoding.com/blog/default.asp?id=94</guid>
		<description><![CDATA[帮公司写了一个MSN通讯类，觉得不用可惜。于是就写了一个Shell。该Shell只是个Demo，别实际使用。就是给大家玩玩的东东。<br/><img src="http://www.RainCoding.com/blog/../blog/software/MyMSN.jpg" border="0" alt=""/><br/><br/><a target="_blank" href="http://www.RainCoding.com/blog/../blog/software/MyMSN.rar" rel="external">执行文件下载</a>]]></description>
		</item>
		
</channel>
</rss>
