<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[cici  自娱自乐]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[ONLY DONET]]></description>
<link>http://hi.baidu.com/tease</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[博客搬家]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/738f05339481cbf11b4cffd9.html]]></link>
        <description><![CDATA[
		
		<p>博客搬家......<br>
不再使用baidu任何产品......<br>
不再兼容XP系统......</p>
<p>一个新的世界即将到来.....</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/738f05339481cbf11b4cffd9.html#comment">查看评论</a>]]></description>
        <pubDate>2009年06月25日 星期四  13:11</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/738f05339481cbf11b4cffd9.html</guid>
</item>

<item>
        <title><![CDATA[XNA技术(C#) 打造黑客帝国屏保（中）]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/4fc318dff144301b622798c4.html]]></link>
        <description><![CDATA[
		
		<p align="center"><strong>XNA技术(C#) 打造黑客帝国屏保（中）<br>
</strong><strong><a href="http://www.chengchen.net/">www.chengchen.net</a></strong></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在上一节中，我们使用OllyDBG分析了屏幕保护程序的原理，其实就是一个EXE文件根据不同的参数来执行预览或者配置之类的。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在介绍XNA技术之前，我们先来使用WPF技术制造一个简单的屏保练手。第一是因为WPF和XNA一样也是基于DirectX技术，第二是因为从最简单的屏保做起，不容易被打击信心。然后由浅入深，打造动画屏保。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font color="#ff0000">请在VS2008 + SP1 编程环境下执行本程序DEMO。<br>
</font>首先在项目工程中新建一个WPF程序。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/c25b43ed8886d8f0b11cb16d.jpg"><br>
然后在设计器中打开Windows1.xaml并在属性窗口中修改如下设置</p>
<p align="left">
<table class="FCK__ShowTableBorders" style="width: 498pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="661" border="0">
    <colgroup><col style="width: 14pt; mso-width-source: userset; mso-width-alt: 576" width="18"></col><col style="width: 101pt; mso-width-source: userset; mso-width-alt: 4288" width="134"></col><col style="width: 68pt; mso-width-source: userset; mso-width-alt: 2880" width="90"></col><col style="width: 296pt; mso-width-source: userset; mso-width-alt: 12608" width="394"></col><col style="width: 19pt; mso-width-source: userset; mso-width-alt: 800" width="25"></col></colgroup>
    <tbody>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 14pt; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" width="18" height="18"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 101pt; border-bottom: #f0f0f0; background-color: transparent" width="134"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 68pt; border-bottom: #f0f0f0; background-color: transparent" width="90"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 296pt; border-bottom: #f0f0f0; background-color: transparent" width="394"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 19pt; border-bottom: #f0f0f0; background-color: transparent" width="25"> </td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><font face="宋体" size="2">WindowStyle</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 68pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="90"><font face="宋体" size="2">None</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><font face="宋体" size="2">去掉窗体边框</font></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"><span style="mso-spacerun: yes"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;</font></span></td>
        </tr>
        <tr style="height: 42pt; mso-height-source: userset" height="56">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 42pt; background-color: transparent" height="56"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><font face="宋体" size="2">Background</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 68pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="90"><font face="宋体" size="2">Black</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><font face="宋体" size="2">屏保的背景一般为黑色（当然目前貌似最流行的就是很多彩色泡泡那种屏保，其实WPF非常方便设置不同控件的透明度，实现这种屏保对WPF来说易如反掌）</font></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"><span style="mso-spacerun: yes"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;</font></span></td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><font face="宋体" size="2">Cursor</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 68pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="90"><font face="宋体" size="2">None</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><font face="宋体" size="2">屏保没有鼠标显示</font></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"><span style="mso-spacerun: yes"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;</font></span></td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><font face="宋体" size="2">Topmost</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 68pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="90"><font face="宋体" size="2">打勾</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><font face="宋体" size="2">肯定是在屏幕最上方</font></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"><span style="mso-spacerun: yes"><font face="宋体" size="2">&nbsp;&nbsp;&nbsp;</font></span></td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><font face="宋体" size="2">WindowState</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 68pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="90"><font face="宋体" size="2">Maximized</font></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><font face="宋体" size="2">全屏显示</font></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
            <td style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
            <td style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
            <td style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
    </tbody>
</table>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在屏保中一旦移动鼠标或者按下键盘，屏保程序就会退出。那么我们在MouseMove和KeyDown事件中处理：<br>
private void Window_KeyDown(object sender, KeyEventArgs e)<br>
{<br>
&nbsp;&nbsp;&nbsp;  this.Close();<br>
}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  值得注意的是，首次运行程序时会自动触发一次MouseMove事件，因此我们要忽略这一次事件。加个标志判断：<br>
private bool m_BFirstRun = true;<br>
private void Window_MouseMove(object sender, MouseEventArgs e)<br>
{<br>
&nbsp;&nbsp;&nbsp;  if (!m_BFirstRun)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  this.Close();<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  m_BFirstRun = false;<br>
}</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  然后我们增加一个设置窗体，在项目中新加一个叫做Settingdialog.xaml的窗体。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/6a644e10e7ef9bd8c1ce7974.jpg"></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  我们的目的就是随便配置一个字符串到屏保上显示。这里太简单就不说了，大家可以直接下载源代码查看。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  最后我们来设置参数，这里要小心，WPF的参数设置和传统的项目不太一样，大家是不是找不到Main()函数呢? 呵呵，其实DONET偷偷的进行了一次封装，有兴趣的可以使用Reflect分析，我直接告诉大家怎么做就行了。<br>
打开App.xaml.cs文件，在这个文件中重写Onstartup方法，根据StartupEventArgs就可以获得启动参数。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Window1 win = new Window1();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Settingdialog dialog = new Settingdialog();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  protected override void OnStartup(StartupEventArgs e)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (e.Args.Length &gt; 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  string param = e.Args[0].ToLower();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (param == &quot;/s&quot; || param ==&quot;s&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  win.Show();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else if (param == &quot;/p&quot; || param == &quot;p&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Application.Current.Shutdown();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else if (param.IndexOf(&quot;/c&quot;) == 0 || param == &quot;c&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dialog.Show();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Application.Current.Shutdown();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  dialog.Show();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
别得意的太早，一旦运行这个程序，你会发现程序会出现两个窗体。我们还得将App.xaml中的StartupUrl=&rdquo;Window1.xaml&rdquo; 去掉。 <img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/21fdba1b2f53ac3d8718bf72.jpg"></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这样才算大功告成了。如果想要这个自定义的文字动起来，当然可以加一个计时器什么的，或者使用XAML脚本动画都是可以轻松实现的。（类似于Flash，别那么老土，现在早进入WPF的时代了。据内部消息称VS2010自身的窗体设计器将使用WPF构架。）但是这些都不是本文的重点，别忘了动画方面更为强大的XNA技术。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  XNA是基于DirectX的3D游戏开发环境，是Microsoft的下一代游戏开发平台，致力于帮助开发者更快的开发游戏，可以跨 Xbox 360 、PC和Zone平台。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <font color="#ff0000">最最重要的是XNA是基于DONET的，也就是说我们可以使用熟悉的C#开发强大的DirectX游戏了</font>。一个简单的屏保，当然不在话下。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  目前最新版本的XNA是3.0版本，其官方网站为<a href="http://www.xna.com/">http://www.xna.com/</a> 可以在<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=7D70D6ED-1EDD-4852-9883-9A33C0AD8FEE&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyId=7D70D6ED-1EDD-4852-9883-9A33C0AD8FEE&amp;displaylang=en</a> 下载到3.0版本。<br>
安装完毕后就可以在VS2008的新建项目中看见XNA Game Studio3.0了。</p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/98e510d8fe36e51132fa1c7f.jpg"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  当然这些还不够，赶快到音像店购买一套《黑客帝国》光盘，仔细观察他们酷酷的数据流界面^_^<br>
Are you ready? 再下一节中，我将详细介绍XNA的动画细节技术，不过最近很忙，一旦有时间，我就来写文章。敬请期待。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <a target="_blank" href="http://files.cnblogs.com/chengchen/ScreenDemo.rar">点击此处下载本节WPF超简单屏保源代码。</a><font color="#ff0000">一定要记得将编译出来的EXE文件扩展名修改为SCR。</font>如果想在屏保属性页中预览，改名后直接拷贝到SYSTEM32目录下即可。将文件夹属性的这个勾勾去掉，就可以修改扩展名。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/c8f90024df14c30fd507427b.jpg"></p>
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/11ccd4546e41c67cd0090646.jpg"></p>
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/d26f6c38f2c6c50796ddd841.jpg"></p>
</div> <a href="http://hi.baidu.com/tease/blog/item/4fc318dff144301b622798c4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%C6%E6%CB%BC%C3%EE%CF%EB">奇思妙想</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/4fc318dff144301b622798c4.html#comment">查看评论</a>]]></description>
        <pubDate>2009年05月16日 星期六  22:14</pubDate>
        <category><![CDATA[奇思妙想]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/4fc318dff144301b622798c4.html</guid>
</item>

<item>
        <title><![CDATA[XNA技术(C#) 打造黑客帝国屏保（上）]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/2268e0509b8f5c541138c2f9.html]]></link>
        <description><![CDATA[
		
		<p align="center"><strong>XNA技术(C#) 打造黑客帝国屏保（上）<br>
</strong><strong><a target="_blank" href="http://www.chengchen.net">www.chengchen.net</a></strong></p>
<p>在这篇文章中你可以学习到底层的逆向分析技术和微软最流行的顶层技术（什么都懂一点，生活更精彩）<br>
1、 如何分析屏幕保护程序。<br>
2、 如何使用C#的WPF技术编写屏幕保护程序。<br>
3、 什么是XNA，怎样使用XNA编写简单动画。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  早在高中时代，我就觉得屏幕保护技术是一件很神秘的事情。感觉这东西应该和底层关联的比较紧密，对于能写出屏保的程序员一直都很崇拜。梦想着哪天能写出自己的屏保，尤其是看过《黑客帝国》后那种酷酷的&ldquo;数据流&rdquo;界面，如果能做成屏保该有多好啊，现在这种感觉越来越强烈了。<br>
终于按捺不住自己的情绪对屏保程序分析了一下，发现不是想象中的那么复杂，略有心得，特来和大家分享。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  首先我们要解决的问题就是屏幕保护格式问题。只有知道了格式，我们才能按照这个格式打造。于是我尝试用UE打开system32目录下的logon.scr文件。惊人一幕出现了。</p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/92fc6a27044b5820908f9dca.jpg"></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这不就是PE格式嘛。难道屏保是EXE文件或者DLL文件？于是尝试将logon.scr扩展名改为EXE运行，提示&ldquo;此屏幕保护程序没有可提供设置的选项&rdquo;。这里的提示和点击屏保标签页中的&ldquo;设置&rdquo;的提示是一致的。</p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/e5f0483478aa9f6d241f14d7.jpg"></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从这点上可以说明，点击了&ldquo;设置&rdquo;按钮，貌似就是直接运行了屏保程序。也同时证明屏保程序就是EXE文件。但同时一个新的问题出现了：为何扩展名不同，运行结果不同呢？这其中究竟藏着什么秘密呢？于是我马上到MSDN网站上搜索，由于网速比较慢，搜了5分钟我就没耐心了，居然忘了我也具备一定的破解分析能力，于是直接拿OllyDBG出来研究……。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  首先以logon.scr为研究对象吧，将它拷贝出来，修改扩展名为EXE，用OllyDBG载入程序，设断点 BP MessageBoxExW（NT时代的系统文件大部分是Unicode了）。运行程序，不一会儿程序就断了下来：<br>
<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/221c338771f69a09c75cc3dd.jpg"><br>
按下ALT+K，看看线程堆栈<br>
<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/6b62a0777bbf1c38b151b9a4.jpg"><br>
&nbsp;&nbsp;&nbsp;  看见logon.01001F54处就调用Message了，我们应该关注在Message之前程序干了什么，因此在堆栈的最先前执行的三个地址处下断。<br>
&nbsp;&nbsp;&nbsp;  分别是logon.010026F8 , logon.01002812, logon.0100294E<br>
重新运行程序，程序立刻被断在了0100294E处，F7单步进入，发现一个JMP强跳，再单步发现如下代码：<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/bf69c0178984c82ac83d6da9.jpg"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  看见那个GetCommandLineW的API了吗？这个API的作用是获得执行程序&ldquo;命令行字符串&rdquo;包括&ldquo;参数&rdquo;。当程序执行完毕这个API后，看看EXA得到了值：<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/8960a9ec6230fe1e279791b9.jpg"><br>
（我把logon.exe放在D:\SetupFiles\目录下的。）<br>
代码执行到这个地方：<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/abf4b951bdd7293b377abe85.jpg"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  此时又将&ldquo;命令行信息&rdquo;赋值到ESI中，程序先执行了一次CharNextW，将指针指向&ldquo;命令行信息&rdquo;第一个位置，判断第一个位置是否为0x22（双引号），然后再逐个字符来寻找&ldquo;命令行信息&rdquo;中的第二个双引号，一旦再次遇到双引号就跳出这个循环。继续执行代码又看到这样的循环：<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/c52b58da921896f8b7fd4881.jpg"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这次是对比&ldquo;命令行信息&rdquo;中有无的0x20了，0x20代表空格，遇到空格就跳出循环。<br>
看到这里我似乎明白了些什么了，总结一下：程序首先通过GetCommandLineW获得执行程序的&ldquo;命令行信息&rdquo;，然后在这个信息中找双引号。找到完双引号后再找空格。我敏感的神经告诉我，如果&ldquo;命令行信息&rdquo;中有空格，那么空格后面不就跟着参数嘛。如果程序有参数，执行了上面的操作，此时的指针就会指向ESI中的参数位置了。也就可以取到这个参数的值了。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  我们不妨随便设置一个参数看看。打开OD的Debug菜单，点击&ldquo;Arguments&rdquo;。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/65f1db1b0023b4f6ac6e758d.jpg"><br>
<br>
随便设置一个启动参数，例如X吧。重新启动程序，正如我们分析的一样，程序在运行完一系列判断后，指针指向了参数位置。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/78b62c2d58f08717359bf789.jpg"><br>
那么程序是在什么地方判断参数的呢，不急，我们慢慢跟踪。在一个Call中发现如下代码：<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/d450658165d6b6fbbd3e1e8b.jpg"><br>
此时的EAX值为0x78，不正是我们输入的参数&ldquo;X&rdquo;吗？下面是一堆的跳转，难道这里就是判断参数的地方？先看看，这个参数先和0x50对比，也就是&ldquo;P&rdquo;如果大于50就跳到这里来：<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/89cc9edd079b02175882dd96.jpg"><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这里是和0x53对比 ，也就是和&ldquo;S&rdquo;对比。不管三七二十一，现将调试参数改为P试了一下，没什么反应，又将参数改为S试一试，发现成功执行屏幕保护。果然windows是根据参数信息来执行屏保程序的。只要慢慢跟踪就会挖出更多的参数，但是这样跟踪很显然是十分消耗体力的。我们用OD的目的只是为了调查屏保的实现原理，现在已经知道是用参数实现的，关于参数的获得除了使用OD，最简单的方法还是写个程序，读取参数并使用MessageBox弹出来。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [STAThread]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  static void Main(string []arg)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (arg.Length &gt; 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MessageBox.Show(arg[0]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Application.EnableVisualStyles();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Application.SetCompatibleTextRenderingDefault(false);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Application.Run(new Form1());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
随便写了一个测试程序，弹出参数信息并总结如下：<br>
<table class="FCK__ShowTableBorders" style="width: 424pt; border-collapse: collapse" cellspacing="0" cellpadding="0" width="563" border="0">
    <colgroup><col style="width: 14pt; mso-width-source: userset; mso-width-alt: 576" width="18"></col><col style="width: 101pt; mso-width-source: userset; mso-width-alt: 4288" width="134"></col><col style="width: 296pt; mso-width-source: userset; mso-width-alt: 12608" width="394"></col><col style="width: 13pt; mso-width-source: userset; mso-width-alt: 544" width="17"></col></colgroup>
    <tbody>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 14pt; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" width="18" height="18"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 101pt; border-bottom: #f0f0f0; background-color: transparent" width="134"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 296pt; border-bottom: #f0f0f0; background-color: transparent" width="394"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; width: 13pt; border-bottom: #f0f0f0; background-color: transparent" width="17"> </td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">无参数时候</font></span></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext 0.5pt solid; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">出现了属性对话框。</font></span></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
        <tr style="height: 18.75pt; mso-height-source: userset" height="25">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 18.75pt; background-color: transparent" height="25"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">参数为<font class="font6" face="Calibri">/C </font><font class="font5">的时候</font></font></span></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">在屏幕保护标签页上点击了设置按钮<font class="font6" face="Calibri">/ </font><font class="font5">鼠标右键选择设置菜单。</font></font></span></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
        <tr style="height: 26.25pt; mso-height-source: userset" height="35">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 26.25pt; background-color: transparent" height="35"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">参数为<font class="font6" face="Calibri">/S </font><font class="font5">的时候</font></font></span></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">运行屏幕保护程序<font class="font6" face="Calibri">/</font><font class="font5">屏幕保护标签页上点击了预览按钮</font><font class="font6" face="Calibri">/</font><font class="font5">鼠标右键选择测试菜单。</font></font></span></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
        <tr style="height: 19.5pt; mso-height-source: userset" height="26">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 19.5pt; background-color: transparent" height="26"> </td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext 0.5pt solid; width: 101pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="134"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">参数为<font class="font6" face="Calibri">/P </font><font class="font5">的时候</font></font></span></td>
            <td class="xl66" style="border-right: windowtext 0.5pt solid; border-top: windowtext; border-left: windowtext; width: 296pt; border-bottom: windowtext 0.5pt solid; background-color: transparent" width="394"><span style="mso-ascii-: minor-latin; mso-fareast-: minor-fareast; mso-hansi-: minor-latin"><font size="2">在屏幕保护标签页上选择该屏保的时候。</font></span></td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
        <tr style="height: 13.5pt" height="18">
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; height: 13.5pt; background-color: transparent" height="18"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
            <td class="xl65" style="border-right: #f0f0f0; border-top: #f0f0f0; border-left: #f0f0f0; border-bottom: #f0f0f0; background-color: transparent"> </td>
        </tr>
    </tbody>
</table>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  以上是在winxp上测试的，拿到虚拟机win98上测试，多了一个A的参数：在屏幕保护标签页上点击了密码保护更改按钮。<br>
<br>
没想到分析一个屏保程序花了这么多篇幅，我还是在下一节介绍使用WPF技术创造自己的屏幕保护吧。<img src="http://img.baidu.com/hi/jx/j_0047.gif"></p> <a href="http://hi.baidu.com/tease/blog/item/2268e0509b8f5c541138c2f9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%C6%E6%CB%BC%C3%EE%CF%EB">奇思妙想</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/2268e0509b8f5c541138c2f9.html#comment">查看评论</a>]]></description>
        <pubDate>2009年05月03日 星期日  22:14</pubDate>
        <category><![CDATA[奇思妙想]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/2268e0509b8f5c541138c2f9.html</guid>
</item>

<item>
        <title><![CDATA[驱动级键盘模拟（C#）（高手请飘过）]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/3f90972f72c9a4301e3089dd.html]]></link>
        <description><![CDATA[
		
		<p align="center"><strong>驱动级键盘模拟（C#）（高手请飘过）</strong><br>
<a href="http://www.chengchen.net/">www.chengchen.net</a></p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  游戏外挂一般分为三个级别：初级是鼠标、键盘模拟，中级是Call游戏内部函数，读写内存，高级是抓包，封包的&ldquo;脱机挂&rdquo;（完全模拟客户端网络数据，不用运行游戏）。用C#写外挂的不是很多，大部分是C++，主要原因是MS的C#目前不支持内联汇编功能。因此用C++写底层库，然后用C#调用成为DONET爱好者开发外挂的首选。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对于鼠标键盘模拟的外挂而言，很多人认为没有什么技术含量，因为无非就是SendMessage或者Key_event，再高级点就是Hook进入程序内部操作。我也曾用这种技术开发过一些游戏辅助程序。但最近我在研究XNA的时候遇到了一点麻烦，这种屡试不爽方法居然失效了。游戏对于消息命令一点也不&ldquo;服从&rdquo;，我们有这样的疑问：它是如何识别真实键盘的按键的呢？难道是程序中有判断吗？<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  如果抛开上面的疑问，换另外一个角度思考。在DOS时代，还记得那个经典的去除BIOS密码的Debug命令吗？其原理就是利用了BIOS中断，其实对于键盘按键，不管Windows怎样封装，到最后都会调用BIOS中断来识别按键。然而消息发送毕竟是Windows系统的玩意儿，不管在Windows层面上怎样判断，我们只要让BIOS下一道&ldquo;圣旨&rdquo;，看哪个游戏还敢如此嚣张！！！<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在解释更详细的原理之前，我们先来抓出幕后黑手，看看是哪个给游戏撑腰？让它有胆子违抗Windows消息命令。究竟是判断了真实键盘信息，还是有其他原因。结果在DirectX编程中发现了DirectInput这个API。就是它绕过了Windows的消息机制，它的目的是为了让游戏的实时性控制更好、更快。Windows消息是队列形式的，在传递过程中会有延时，比如格斗类游戏对实时性控制要求是非常高的，Window消息机制不能满足这个需求。而DirectInput直接和键盘驱动程序打交道，效率当然要高出一大截。我认为大部分游戏不响应消息的真正的原因在这里，而不是故意写了反作弊系统。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  既然知道了是DirectInput在搞鬼，可是我们该怎么办呢？前面我们提到了一点思路，因此最实际的办法就是直接读写键盘端口的方法来模拟硬件事件。在DOS时代每按下一个键就会产生一个键盘中断，这样程序会跳到BIOS中的键盘中断去处理程序执行。在曾经的那个年代我最牛X的是QBasic程序了。QBasic中有一个OUT函数可以向指定端口写入数据，用INP函数可以从指定端口读取数据。因此用QBasic来做硬件级别的键盘模拟非常简单。<br>
<br>
假如这个键的扫描码为0x51，先模拟按下这个键：<br>
OUT &amp;H64,&amp;HD2 '把数据0xD2发送到0x64端口。<br>
OUT &amp;H60,&amp;H51 '把扫描码0x51发送到0x60端口，表示模拟按下扫描码为0x51的这个键<br>
下面再模拟释放这个按键：<br>
OUT &amp;H64,&amp;HD2 '把数据0xD2发送到0x64端口。<br>
OUT &amp;H60,(&amp;H50 OR &amp;H80) '把扫描码0x50与数据0x80进行或运算，表示释放这个键。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  当然DOS时代早已经一去不复返，只是刚才提到QBasic时候让我感慨了一下其曾经的强大而已。如果真的用QBasic来写模拟程序，在Win98下可以成功，但是在Win2000以后的版本就不行了，因为进入NT时代后DOS只是一个虚拟机系统了。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  现在的问题很清晰了，就是如何在Windows环境下来进行端口操作。由于比较底层，Windows不会那么轻松让你得逞。一般会有两种方法：其一就是利用驱动，在驱动里面还有什么事情不能做？其二就是利用&ldquo;调用门&rdquo;从Ring3跳到Ring0去进行相关操作。在网上搜一搜应该都会找到相关的资料。我听格格说过有个VB做的叫做&ldquo;按键精灵&rdquo;的貌似比较牛X，下载下来研究后发现其使用了老外的WINIO驱动的原理。用WINIO就容易多了，因为我在驱动方面的能力实在是&amp;*^%$^&amp;*。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  于是在WINIO的基础上，我使用C#进行了简单的二次封装，使其适用于DONET平台上使用驱动级别的按键模拟。在我的DLL中提供了以下几个方法：<br>
<br>
InitSuperKeys() 安装WINIO驱动，一般用于Form_Load事件中调用<br>
<br>
CloseSuperKeys() 卸载WINIO驱动，一般用于Form_Closed事件中调用<br>
<br>
KeyDown(Key) 模拟普通Key键按下。<br>
<br>
KeyDownEx(Key)模拟扩展Key键按下。<br>
<br>
KeyUp(Key)模拟普通Key键弹起。<br>
<br>
KeyUpEx(Key)模拟扩展Key键弹起。<br>
<br>
KeyPress(Key)模拟普通Key键按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒<br>
<br>
KeyPress(Key,Int32)模拟普通Key键按下并弹起一次。其中按下和弹起的时间间隔是第二个参数，单位为毫秒。<br>
<br>
KeyPressEx(Key)模拟扩展按键Key按下并弹起一次。其中按下和弹起的默认时间间隔是200毫秒，写入扩展按键信息间隔时间为100毫秒<br>
<br>
KeyPressEx(Key,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数，单位为毫秒，写入扩展按键信息间隔时间为100毫秒。<br>
<br>
KeyPressEx(Key,Int32,Int32)模拟扩展按键Key按下并弹起一次。其中按下和弹起的时间间隔是第二个参数，单位为毫秒，写入扩展按键信息间隔时间是第三个参数，单位为毫秒。<br>
<br>
特别说明：<br>
1、 在执行模拟按键之前必须先执行InitSuperKeys()进行驱动的安装，在窗体关闭之后最好可以卸载驱动。<br>
<br>
2、 以上方法中的参数Key为我在WinIoSys类中定义的一个枚举，并非DONET系统的Key枚举。<br>
<br>
3、 普通Key是指A，B，C，Space这种标准键盘按键。而扩展按键是指&ldquo;方向键&rdquo;等特殊按键，系统在处理这种扩展键的时候会先有一个写扩展按键信息的时间。<strong>因此没有Ex结尾的方法都是用于标准普通按键的，有Ex结尾的方法是用于特殊的扩展按键的。</strong>其中他们都有重载，用户可以自己设置间隔时间。至于按键详细分类，请自己上Google搜索。<br>
<br>
4、 模拟一次按键事件后，一定要让程序Sleep一些毫秒，否则下一个按键是无法正常模拟出的。<br>
<br>
5、 貌似USB走的是总线，和端口操作无关，因此该方法理论上不支持USB接口的键盘。<br>
<br>
6、 部分杀毒软件会提醒用户安装驱动，或者将WinIo.sys报为病毒，其实这是正常现象。如果搞这种非正常的事情，杀毒软件当然看不过去。请不要质疑本程序有病毒或木马，最简单的方法就是关闭杀毒软件～。不放心者，请勿使用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;  既然有了这么方便的接口，我们来尝试写个小东西看看威力如何。我们就拿《拳皇》来举例子吧。这款游戏就号称针对Window消息绝对无效。<br>
<br>
我们先新建一个EXE工程，并引用我的SuperKeys.dll。定义一个全局变量<br>
WinIoSys m_IoSys = new WinIoSys();<br>
在Load事件中安装驱动<br>
m_IoSys.InitSuperKeys();<br>
在Closed事件中卸载驱动<br>
m_IoSys.CloseSuperKeys();<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  我们当然可以写一个全局钩子，在游戏执行的时候，按下某键就可以进行一系列的按键模拟。但是这仅仅是个DEMO，不用搞那么正式，直接写一个计时器来触发好了。为了节约时间，在每次点击button三秒后执行模拟按键操作，在这三秒中要记得把拳皇游戏窗口激活哦。<br>
我们先来统一下键盘设置，如图所示：</p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/21ee283fb26f26cf55e72317.jpg"></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  我们决定来模拟&ldquo;八神&rdquo;的最简单一招： 暗杀炎（就是从地上放把火过去），如果&ldquo;八神&rdquo;在左侧，其键盘操作为：：↓↘→＋A或C。就是上图中的SDU或SDJ按键。以SDJ为例子，在模拟这个键盘时要非常细心才行，我一开始这样模拟：<br>
<br>
m_IoSys.KeyPress(WinIoSys.Key.VK_S);<br>
Thread.Sleep(200);<br>
m_IoSys.KeyPress(WinIoSys.Key.VK_D);<br>
Thread.Sleep(200);<br>
m_IoSys.KeyPress(WinIoSys.Key.VK_J,200);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  结果没有成功。仔细研究了一下，其实我们按SDJ按键的时候，是先将S 按下，再将D键按下，然后弹起S键，再弹起D键，最后再按下J键的。那么真正的过程应该这样写：<br>
<br>
m_IoSys.KeyDown(WinIoSys.Key.VK_S);<br>
Thread.Sleep(100);<br>
m_IoSys.KeyDown(WinIoSys.Key.VK_D);<br>
Thread.Sleep(100);<br>
m_IoSys.KeyUp(WinIoSys.Key.VK_S);<br>
Thread.Sleep(100);<br>
m_IoSys.KeyUp(WinIoSys.Key.VK_D);<br>
Thread.Sleep(10); //这个地方不能间隔太大，太大就整个动作连不起来了。<br>
m_IoSys.KeyPress(WinIoSys.Key.VK_J, 200);<br>
<br>
经过测试，成功模拟我们想要的操作。大家可以看到实际的模拟按键效果。</p>
<p><a target="_blank" href="http://files.cnblogs.com/chengchen/SuperKeys.rar">点击此处下载DEMO</a></p>
<p><a target="_blank" href="http://files.cnblogs.com/chengchen/KOF.swf">点击此处察看针对《拳皇》的&ldquo;八神&rdquo;小特效。</a></p>
<p>本程序在VS2008 + WinXP SP3 + WinKawaks1.48XP + KOF 2000 + P/S键盘 下调试通过。</p>
<p><strong>让驱动级键盘模拟做更多的事情</strong><br>
除了写游戏外挂外，这个东东还能做什么呢？听说新版的QQ在键盘防盗技术上很好很强大……。</p>
</div> <a href="http://hi.baidu.com/tease/blog/item/3f90972f72c9a4301e3089dd.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D6%FA%C8%CB%CE%AA%C0%D6">助人为乐</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/3f90972f72c9a4301e3089dd.html#comment">查看评论</a>]]></description>
        <pubDate>2009年04月27日 星期一  23:37</pubDate>
        <category><![CDATA[助人为乐]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/3f90972f72c9a4301e3089dd.html</guid>
</item>

<item>
        <title><![CDATA[Cell 组件开发整理]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/369c82d4c7220009a08bb752.html]]></link>
        <description><![CDATA[
		
		<p align="center"><strong>Cell 组件开发整理</strong> <a target="_blank" href="http://www.chengchen.net">cici</a></p>
<p>特别说明：本文仅是针对Cell组件v5.3.9.12这个版本的来说的，可能其中一些Cell组建的缺陷在新版本中修复了。请不要过了N年再来评价这篇文章的有效性，或者评价我博客中其他文章的有效性。</p>
<p>最近一直从事Cell组建报表的开发工作，略有心得，特来和大家一起分享。<br>
<strong>1、 导出的CSV文件格式中包含乱码。<br>
</strong>如果遇到这个问题修改Excel的标示语言为中文即可。以Office 2007为例：打开Excel选项<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/9a64af1ef610c03c403417b1.jpg"></p>
<p>然后选择语言设置<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/1fe72138d9f8d407b9998fbf.jpg"></p>
<p>最后选择中文（中国）即可。如果是英文版本的Excel，则选择Chinese(PRC)即可。<br>
<img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/b44027dd870041fa8c1029ba.jpg"><br>
<strong>2、弹出单元格属性对话框后的自动调整单元格列宽和行高问题。</strong><br>
在Cell组件有这样一个方法：<br>
CellPropertyDlg()<br>
调用这个方法后，会弹出一个单元格属性的设置的对话框。但是奇怪的是这个方法返回值中没有提供用户点击的是确定还是取消按钮。如果用户改变了字体大小，而此时你又希望被改变的单元格会根据新的大小自动调整宽度和高度。匆忙写上代码，就会发现用户点击了取消按钮后，你的单元格的高度和宽度也重新调整了。最简单的方法还是对比原来的字体大小和风格，通过GetCellFont，GetCellFontSize，GetCellFontStyle来判断调用CellPropertyDlg前后的值，如果发现变化了，就调用SetColWidth，GetColBestWidth来自动调整单元格宽度或高度。</p>
<p><strong>3、打印预览中一个BUG</strong><br>
在5.3.9.12这个版本中，我发现了一个Exception，程序直接挂掉。并且DONET无法捕捉到这个异常。重现步骤：停掉打印机缓存服务Print Spooler。然后打开打印预览对话框，然后选择&ldquo;打印设置&rdquo;，然后再选择&ldquo;打印机&rdquo;，这个Exception就出现了。<br>
所以在用户打开打印预览之前，我们先要判断这个服务是否开启了。<br>
private bool CheckPrinterServer()<br>
{<br>
&nbsp;&nbsp;&nbsp;  bool CheckPrinterServer;<br>
&nbsp;&nbsp;&nbsp;  try<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  foreach (ServiceController server in ServiceController.GetServices())<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (server.ServiceName.ToLower() == &quot;spooler&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return (server.Status == ServiceControllerStatus.Running);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CheckPrinterServer = false;<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  catch (Exception ex)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Throw<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  return CheckPrinterServer;<br>
}<br>
<br>
<strong>4、导出PDF文件的问题</strong><br>
&nbsp;&nbsp;  在导出PDF中有三个问题，其一就是打印机服务没有开启的情况，第二个就是没有安装打印机的情况，第三就是导出大量数据的情况。<br>
&nbsp;&nbsp;  第一种情况的解决办法上面已经说过了。第二种情况下，会出现导出的PDF格式有问题。所以要判断是否安装了打印机：<br>
private bool CheckIsHavePrinter()<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;  bool CheckIsHavePrinter ;<br>
&nbsp;&nbsp;&nbsp;  try<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  string wmiSQL = &quot;SELECT * FROM Win32_Printer&quot;;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (new ManagementObjectSearcher(wmiSQL).Get().Count == 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return false;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CheckIsHavePrinter = true;<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  catch (Exception ex)<br>
&nbsp;&nbsp;&nbsp;  {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Throw<br>
&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  return CheckIsHavePrinter;<br>
}</p>
<p>第三种情况程序会直接退出，我测试了2000行37列数据，就会出现这种情况。这个BUG我已经提交给官方了，他们正在修正中，未来版本不会出现此问题。</p>
<p><strong>5、英文环境下，乱码问题。</strong><br>
在英文环境下，CELL组件会出现乱码，这个可以向官方索要UNCODE版本。我已经获得了这个版本，经测试可用。<br>
<strong><br>
6、导出的HTML格式图片大小不对。</strong><br>
在CELL组件中导出HTML中的图片全部是自动放缩的。所以和原来的大小可能不太一样。我的做法是导出后，在代码中读取HTML文件，使用正则找到图片，直接修改，最后保存。适合有少量的图片的HTML修改。<br>
<strong><br>
7、弹出DONET鼠标右键菜单</strong><br>
&nbsp;&nbsp;&nbsp;  CELL提供了一个右键菜单，可惜不够美观，而且需要动态添加数据，使用起来不方便。其实可以使用以下代码来弹出DONET的右键菜单：<br>
Point p = new Point(Control.MousePosition.X, Control.MousePosition.Y);<br>
this.ContextMenuMouse.Show(this, p);<br>
其中变量e可以使用全局变量来传递。<br>
<strong><br>
8、无法导出图片到Excel，无法导出浮动图片到HTML文件</strong><br>
用官方的话说就是目前还不支持这个功能。但是有时变态的客户可管不了那么多。那么我们的解决办法就是硬着头皮用代码读入导出后的Excel文件 或HTML文件，然后使用代码添加上去图片，最后在保存。对付变态的客户，只能用这种变态的方法……。<br>
<br>
<strong>9、英文版本的Cell组件。<br>
</strong>Cell组件的英文版本是不提供下载的，如果想用怎么办？看到Cell安装目录下的CellResChs.dll文件了吗？用VS打开它，你会惊喜地发现所有的字符串都在这个里面了，那么就用VS把它翻译为英文吧^_^<br>
<br>
<strong>10、破解问题</strong><br>
我个人非常不推荐破解，非常推荐大家去支持一下国产软件。Cell组件的一套价格是9800RMB。因此我要特别说明一下，我说的破解，并不是专门针对Cell组件的，而是针对在控件上画一些&ldquo;未注册&rdquo;信息的这一类软件的一些破解思路。<br>
众所周知，一些未注册软件，会在标题上或者软件的Form窗体上画上一些&ldquo;未注册&rdquo;信息。对于这种软件改如何破解呢？其实很简单，这些软件会调用一些API来画信息，只要找到调用的地方，然后跳过去就行了。大家可以参考以下API：<br>
DrawTextA , DrawTextW, ExtTextOutA, ExtTextOutW, TextOutA, TextOutW</p>
<p><br>
<strong><font color="#800000">再次声明：请不要向我索取任何破解版本的软件，此类邮件我一概不予理睬。</font></strong></p> <a href="http://hi.baidu.com/tease/blog/item/369c82d4c7220009a08bb752.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D6%FA%C8%CB%CE%AA%C0%D6">助人为乐</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/369c82d4c7220009a08bb752.html#comment">查看评论</a>]]></description>
        <pubDate>2009年04月25日 星期六  18:36</pubDate>
        <category><![CDATA[助人为乐]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/369c82d4c7220009a08bb752.html</guid>
</item>

<item>
        <title><![CDATA[DONET Anti Debug Lib(更新V1.0.0.1）]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/8aaadf8817867293a5c272d4.html]]></link>
        <description><![CDATA[
		
		<p> </p>
<p>在Tracky大侠的建议和点拨下，增加了检测Profiler的功能，不过是新增加了一个方法叫做checkProfiler()没有在原来的方法上面做。再次感谢Tracky</p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/2e3cdc3922108ad33b87ce44.jpg"></div>
<p><strong>_________________________________________________________________________________</strong></p>
<p><strong>DONET Anti Debug Lib</strong> by cici<br>
Long Long Time 没有更新了。这段时间做的东西不少，可惜都不完整。最近心血来潮，写了一个DOENT平台上判断软件受否被调试的库。除了使用DONET自带的的方法外，也使用了比较常用的Anti Debug 方法，比如<strong>IsDebuggerPresent()</strong>之类的。总共用了5种方法，当然基本上都是属于内存判断法。一些工具可以轻松的 反Anti 。但是这个可能是DONET上面最早成型的Anti Debug库哦。本软件仅供菜鸟使用，大侠请飘过！！！</p>
<p>DoNetAntiDebug.DoNetLoadAnti anti = new DoNetAntiDebug.DoNetLoadAnti();<br>
if (anti.CheckAnti())<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MessageBox.Show(&quot;Found debug tool&quot;, &quot;Anti Debug&quot;, MessageBoxButtons.OK, MessageBoxIcon.Information);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  this.Close();<br>
}</p>
<p>我会不断努力的，不断完善这个库。</p>
<p><a target="_blank" href="http://files.cnblogs.com/chengchen/AntiDebugDemo.rar">点击此处下载</a></p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/a4de55603a3629ff8cb10dc9.jpg"></p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/a24ec4114a143030b8127bca.jpg"></div>
</div> <a href="http://hi.baidu.com/tease/blog/item/8aaadf8817867293a5c272d4.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D7%F7%C6%B7%B7%D6%CF%ED">作品分享</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/8aaadf8817867293a5c272d4.html#comment">查看评论</a>]]></description>
        <pubDate>2009年02月22日 星期日  23:41</pubDate>
        <category><![CDATA[作品分享]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/8aaadf8817867293a5c272d4.html</guid>
</item>

<item>
        <title><![CDATA[圣诞快乐——80后必备——理财专家]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/64368410ed674106203f2ee1.html]]></link>
        <description><![CDATA[
		
		<p>由于我自己的理财思想比较欠缺，时常不知道自己的钱花到什么地方去了。于是自己写了个软件，自己用了几个月感觉还不错。当然这个软件是完全免费的。</p>
<p>主要有以下几个功能：<br>
1、密码保护。<br>
2、统计每天的消费。<br>
3、多种查询功能。<br>
4、本人作为&ldquo;资深报表开发专家&rdquo;来说，当然没忘了放上强大的报表功能，可以按照月份、年份、日子来统计消费情况，自动生成曲线、柱状图、饼图等。</p>
<p>注意：本软件安装需要DONET 2.0支持，而且<font color="#ff0000">需要对CrystalReport进行注册，一般计算机是没有安装这两个部分的。因此我建议您选择完全版本进行安装</font>。如果软件中的财政报告按钮点击后报错，说明您的CrystalReport没有安装，就必须安装完全版本才能使用所有功能。</p>
<p>默认登陆密码为 <font color="#ff0000">admin</font></p>
<p>完全版本下载：<a href="http://www.namipan.com/d/setup.rar/d09846e157068f8f403b31640d768293d2d0961a10ad5f03">http://www.namipan.com/d/setup.rar/d09846e157068f8f403b31640d768293d2d0961a10ad5f03</a></p>
<p>绿色版本下载：<br>
<a target="_blank" href="http://files.cnblogs.com/chengchen/Financing.rar">下载地址一</a><br>
<a target="_blank" href="http://www.chengchen.net/cicistudio/software/Financing.rar">下载地址二</a></p>
<p>软件截图：</p>
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/b80301fa63a4ce8a58ee90c2.jpg"></p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/5ecc00f7aec9703f730eeccc.jpg"></p>
<p> </p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/d1d279cffa5a7720f9dc61ce.jpg"></p>
<p> </p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/ccd08e94765d9503d31b70c8.jpg"></p>
<p> </p>
<div forimg="1"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/bb2375d9f6b1e9f438012fca.jpg"></div>
</div>
</div>
</div> <a href="http://hi.baidu.com/tease/blog/item/64368410ed674106203f2ee1.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D7%F7%C6%B7%B7%D6%CF%ED">作品分享</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/64368410ed674106203f2ee1.html#comment">查看评论</a>]]></description>
        <pubDate>2008年12月24日 星期三  23:38</pubDate>
        <category><![CDATA[作品分享]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/64368410ed674106203f2ee1.html</guid>
</item>

<item>
        <title><![CDATA[快乐分享，要跳槽了！]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/b10383136b836ed7f6039efe.html]]></link>
        <description><![CDATA[
		
		总共参加了四次面试，拿了三个Offer。说句心里话，挺高兴的。<br>
&nbsp;&nbsp;&nbsp;        Offer1：一家新办的小公司。<br>
&nbsp;&nbsp;&nbsp;        Offer2：外派微软，测试DONET4.0和Server2009。<br>
&nbsp;&nbsp;&nbsp;        Offer3：某国著名外企。<br>
为啥还有一家没发Offer。至今尚未明白......。<img src="http://img.baidu.com/hi/jd/j_0007.gif"><br>
<br>
最终可能会选择Offer3，虽然提前两年完成了一个目标，可惜对比其他Offer钱拿的最少~。人生第二起点，还得继续努力！<br>
<br>
外派微软的笔试题目不是很难，100分，我拿了90几分，错了两个选择题，算法和简答题都没啥大问题。<br>
外企笔试题中有很多智力题，100分拿了70几分，马马虎虎。面试都有好几轮，外派微软面了6个半小时，外企面了4个半小时。每次面试完毕，能量消耗巨大。哪位仁兄去面试这种单位一定得记得多吃点。<img src="http://img.baidu.com/hi/jd/j_0025.gif"> <a href="http://hi.baidu.com/tease/blog/item/b10383136b836ed7f6039efe.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D0%C4%C7%E9%C8%D5%BC%C7">心情日记</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/b10383136b836ed7f6039efe.html#comment">查看评论</a>]]></description>
        <pubDate>2008年11月04日 星期二  13:24</pubDate>
        <category><![CDATA[心情日记]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/b10383136b836ed7f6039efe.html</guid>
</item>

<item>
        <title><![CDATA[c#导出C++回调函数]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/1fe7213802780f22b9998f5a.html]]></link>
        <description><![CDATA[
		
		<div align="center">c#导出C++回调函数(<a target="_blank" href="http://www.chengchen.net">cici</a>)<br>
<br>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   最近在公司做一个新的项目，由于C#做界面是非常快速的，于是决定用C#重写C++的界面，而原来的C++动态链接库是不需要修改的。只需要调用一下就可以了。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   在调用过程中发现C++有回调函数，于是翻开MSDN终于发现，回调函数是使用委托来调用。<br>
比如：<br>
在C++中的回调函数是这样定义的：<br>
typedef void (*CiCiCallBack) (bool started, void* client,char *message);<br>
<br>
导出函数这样定义：<br>
extern &quot;C&quot; _declspec(dllexport)  bool Test(char* fileName, CiCiCallBack callback)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;   int n =10000;<br>
&nbsp;&nbsp;&nbsp;    MessageBoxExA(NULL,fileName,NULL,NULL,NULL);<br>
&nbsp;&nbsp;&nbsp;    callback(TRUE,&amp;n, strcat(fileName, &quot; hello world&quot;));<br>
&nbsp;&nbsp;&nbsp;    return TRUE;<br>
}<br>
<br>
于是在C#中可以这样写：<br>
public delegate void CiCiCallBack(bool started, IntPtr client,string msg);<br>
<br>
[DllImport(&quot;CppCallBackDll.dll&quot;, EntryPoint = &quot;Test&quot;, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi)]<br>
public static extern bool Test(string fileName, [In] CiCiCallBack callback);<br>
<br>
在调用的时候这样调用：<br>
CiCiCallBack callbackDelegate = new CiCiCallBack (CallBack);<br>
Test(Application.ExecutablePath, callbackDelegate);<br>
<br>
当然还得定义一个回调函数：<br>
private void CallBack(bool flag, IntPtr client, string msg)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   MessageBox.Show(msg, &quot;&quot;, MessageBoxButtons.OK, MessageBoxIcon.Information);<br>
}<br>
<br>
理论上当执行到Test(Application.ExecutablePath, callbackDelegate);时候会自动调用回调函数。<br>
但是实际却报出了这个错误：<br>
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.<br>
<div forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/tease/pic/item/21fdba1b5037eb028718bf15.jpg"></div>
<br>
熟悉C++ 编程的人应该知道这个错误一般是由以下两种情况产生的：<br>
1、参数传递有错误，尤其是指针传递的时候。<br>
2、函数部分地方的约定不统一（压栈方式可能不统一）。<br>
本文就是第二个原因，不难发现CPP中回调函数的约定和导出函数的约定是不统一的。于是强制在CPP代码中将回调函数定义为：<br>
typedef void (_stdcall *CiCiCallBack) (bool started, void* client,char *message);<br>
将导出函数修改为：<br>
extern &quot;C&quot; _declspec(dllexport)  bool _stdcall Test(char* fileName, CiCiCallBack callback)<br>
<br>
对了，就是加了一个_stdcall得约定条件。_stdcall是Pascal程序的缺省调用方式，通常用于Win32 Api中，函数采用从右到左的压栈方式。<br>
<br>
<a target="_blank" href="http://files.cnblogs.com/chengchen/CPPCallBack.rar">最后附上源代码。点击此处</a></div>
</div> <a href="http://hi.baidu.com/tease/blog/item/1fe7213802780f22b9998f5a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D6%FA%C8%CB%CE%AA%C0%D6">助人为乐</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/1fe7213802780f22b9998f5a.html#comment">查看评论</a>]]></description>
        <pubDate>2008年10月18日 星期六  01:11</pubDate>
        <category><![CDATA[助人为乐]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/1fe7213802780f22b9998f5a.html</guid>
</item>

<item>
        <title><![CDATA[2008年度工作总结]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/caf407f412f21868dcc47478.html]]></link>
        <description><![CDATA[
		
		&nbsp;&nbsp;&nbsp;   不错，距离2008年底还有3个月的时间，但是我觉得我可以来写工作总结了。因为在07年中制作的目标已经提前完成。<br>
<strong>一、去年目标：</strong><br>
1、压缩壳。<br>
这个很easy，无非是反射调用被压缩过后的资源文件，在我cnblog中已经详细解释了原理，以及制作方法。<br>
2、加密壳。加密壳目前比较流行的就是native方式和虚拟机方式，native方式无非就是hook mscorwks.dll中compileMethod函数。将IL代码由自己的程序动态编译运行，每个方法调用结束后再抹去内存中的数据，分段加密保护的思想还是很值得借鉴的。虚拟机方式我还没有研究。但去年的制定目标也只有研究native加密方式而已。<br>
3、混淆。混淆原理tankaiha 大牛在《加密解密3》第九章有比较全面的解释。我自己通过对mono的cecil类库研究后发现，写一个混淆程序也是如此的简单。<br>
因此这三个目标至今为止早已完成。<br>
<strong>二、其它收获：</strong><br>
1、熟悉了windbg的使用，以前一直用OD。虽然windbg没有OD那么直观，但是Windbg+SOS调试DONET程序才是真正的无敌，无论是从加解密角度还是从研究底层的结构角度来说都是软件调试人员所必备的。有时一个bug连VS无从下手的时候，那么Windbg就该上场了。<br>
2、针对托管和非托管混合类型的程序有很多心得。这类程序比较特殊，在过去的一年中，我遇到了4款这样的软件，逆向分析难度相比同类的纯托管程序来说增大了很多。<br>
3、对mono的Cecil库的熟练，这个库N年前我就知道了，今年才开始学习，真是惭愧。<br>
4、完善了设计模式思想，现在软件编写过程中，无形就会想到使用设计模式，这是可喜的，&ldquo;不为设计模式而设计软件，为软件而设计设计模式&rdquo;，这也是我今后要学习和注意的地方。这点上，使我的代码质量和优美度提升了N倍。<br>
5、面向组建编程思想完善，在这方面，我应该是比较NB的。现在就差AOP和SOP了^_^<br>
6、存储过程，这个也是我被逼得，在公司改了一个多月的存储过程，硬着头皮学习的。<br>
<strong>三、不足的地方：</strong><br>
1、Ajax和Web编程有点荒废了，一年居然才写了一个web网站，的确汗颜。混饭吃的东西，今后还是加强些好。<br>
2、新技术学习不足，有点跟不上时代了。<br>
3、底层研究时间过多，貌似在实际开发过程中除了能解决bug外，还没看见啥用处。不太符合我学以致用的性格。研究是为了实际中用的上，如果用不上，也就不能赚Money，那么只能让我郁闷。<br>
<strong>四、未来目标：</strong><br>
&nbsp;&nbsp;&nbsp;   未来的目标我将制定三年的长期计划，所以明后两年不会再写年度报告了。将总共分为两个部分，其一就是对新技术的研究，比如MVC、LINQ、WCF等。其二，不便透露。<br>
<strong>五、关于博客：</strong><br>
在今后三年中，博客更新速度和质量都将会降低，因为可能我没有更多的时间去维护了。<br>
<br>
最后附些我正在编写的软件截图，全部完成后，会发布出来：<br>
InsightCode：一款多功能IL代码编辑器<br>
<div forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/tease/pic/item/746e890a9466b424b0351da3.jpg"></div>
<br>
Spy# 类似于Win32平台的Spy++，不过这个软件针对DONET平台而已。可以提供事件追踪、属性动态修改等功能<br>
<div forimg="1"><img border="0" class="blogimg" small="0" src="http://hiphotos.baidu.com/tease/pic/item/1015583d355e51f43c6d97b6.jpg"></div>
这些都还没有写完，当然还有很多比较有意思的软件，会慢慢放出来。 <a href="http://hi.baidu.com/tease/blog/item/caf407f412f21868dcc47478.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%C4%EA%B6%C8%D7%DC%BD%E1">年度总结</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/caf407f412f21868dcc47478.html#comment">查看评论</a>]]></description>
        <pubDate>2008年09月25日 星期四  13:55</pubDate>
        <category><![CDATA[年度总结]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/caf407f412f21868dcc47478.html</guid>
</item>

<item>
        <title><![CDATA[GroupBox的意外收获]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/4d14bbfbd366fd244e4aea02.html]]></link>
        <description><![CDATA[
		
		<div align="center">GroupBox画线(by <a href="http://www.chengchen.net" target="_blank">cici</a>)</div>
c#的Winform编程中，我无意中将GroupBox的高度强制设置为8，出现了惊人一幕：<br>
<div forimg="1"><img border="0" src="http://hiphotos.baidu.com/tease/pic/item/b80301fae82b478e58ee907b.jpg" small="0" class="blogimg"></div>
怎么样，这个GroupBox就变成了我们常常在安装软件时候可以看到的底部有一条灰色的线。<br>
原来这条线是这么弄上去的，我一直以为是PictureBox填的图呢。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%C6%E6%CB%BC%C3%EE%CF%EB">奇思妙想</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/4d14bbfbd366fd244e4aea02.html#comment">查看评论</a>]]></description>
        <pubDate>2008年09月08日 星期一  01:36</pubDate>
        <category><![CDATA[奇思妙想]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/4d14bbfbd366fd244e4aea02.html</guid>
</item>

<item>
        <title><![CDATA[C语言调用C++导出函数]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/ea3c5e2c8b8cdeea8b13992d.html]]></link>
        <description><![CDATA[
		
		<div align="center"><strong>C语言调用C++导出函数（by <a target="_blank" href="http://www.chengchen.net">cici</a>）</strong></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   最近一网友问我如何实现用纯C语言去调用C++编译的DLL中的导出函数。其实无论是C还是C++都是掉用API来实现各种操作，不过由于C语言缺乏OO，因此更多的时候是用指针而已。<br>
<br>
1、我们现在C++中导出一个函数：<br>
extern &quot;C&quot; _declspec(dllexport) void HelloWord()<br>
{<br>
&nbsp;&nbsp;&nbsp;   ::MessageBoxA(NULL,&quot;Hello world&quot;,&quot;hehe&quot;,NULL);<br>
}<br>
<br>
2、我们在C语言中可以这样调用：<br>
<br>
#include &quot;windows.h&quot;<br>
<br>
void func()<br>
{<br>
&nbsp;&nbsp;   HINSTANCE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   hLib;<br>
&nbsp;&nbsp;   FARPROC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   lpfnDLLProc;<br>
<br>
&nbsp;&nbsp;   hLib = LoadLibrary (&quot;helloworld.dll&quot;);<br>
&nbsp;&nbsp;   if (hLib)<br>
&nbsp;&nbsp;   {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   lpfnDLLProc = GetProcAddress (hLib,&quot;HelloWord&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   (*lpfnDLLProc) ();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   FreeLibrary (hLib);<br>
&nbsp;&nbsp;   }<br>
}<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
func();&nbsp;&nbsp;&nbsp;   <br>
return 0;<br>
}<br>
<br>
怎么样？很简单吧。最后附上源代码：其中C++使用MS的编译器。C使用的是GCC的编译器。<br>
<a target="_blank" href="http://files.cnblogs.com/chengchen/CAndCPP/CDLLCPP.rar">点击此处下载</a> <a href="http://hi.baidu.com/tease/blog/item/ea3c5e2c8b8cdeea8b13992d.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D6%FA%C8%CB%CE%AA%C0%D6">助人为乐</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/ea3c5e2c8b8cdeea8b13992d.html#comment">查看评论</a>]]></description>
        <pubDate>2008年08月28日 星期四  12:48</pubDate>
        <category><![CDATA[助人为乐]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/ea3c5e2c8b8cdeea8b13992d.html</guid>
</item>

<item>
        <title><![CDATA[DONET FrameWork 版本号一览]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/49e0d0f91f5b105f242df203.html]]></link>
        <description><![CDATA[
		
		<p><font size="3">&nbsp;&nbsp;&nbsp;         最近修改一款软件后，在我家的计算机上面运行一点问题都没有，但是拿到公司的计算机上就报强命名引用错误。最后仔细对比发现，我家的mscorwks.dll版本号为<span style="font-size: 12pt;"><span>v2.0.50727.3053，而公司的版本为</span><span>v2.0.50727.42。由于其中一个混合类型的dll文件的强名太特殊了，拿出takanha的工具都搞不定。</span></span>估计是强名的定位问题，有时间再仔细分析takanha的文章，我也发送邮件向他咨询了。由于等着急用，便把公司的mscorwks.dll的强名检测部分去掉了，可惜当我把这个软件发送个网友运行的时<span style="font-size: 12pt;">候又不行了，原来他的版本号为<span>v2.0.50727.1433。为什么有这么多的版本号？</span></span></font></p>
<p><font size="3"><span style="font-size: 12pt;">于是便有了下表：（其中有8.0，9.0的部分是安装VS显示的版本号）</span></font></p>
<table height="690" width="855" cellspacing="0" cellpadding="0" border="1" style="border: medium none ; border-collapse: collapse;">
    <tbody>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><strong><span style="font-size: 10pt;">.NET Framework product version</span></strong></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><strong><span style="font-size: 10pt;">Service pack level</span></strong></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><strong><span style="font-size: 10pt;">Version</span></strong></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 1.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Original release</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">1.0.3705.0 and 7.0.9466.0</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 1.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 1</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">1.0.3705.209</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 1.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 2</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">1.0.3705.288 and 7.0.9502.0</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 1.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 3</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">1.0.3705.6018 and 7.0.9951.0</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 1.1</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Original release</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">1.1.4322.573 and 7.10.3052.4</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 1.1</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 1</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">1.1.4322.2032 (if you have the MSI-based 1.1 SP1 installed) or 1.1.4322.2300 (if you have the OCM-based 1.1 SP1 installed on Windows Server 2003) and 7.10.6001.4</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 2.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Beta 1</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">2.0.40607.16 and 8.0.40607.16</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 2.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Beta 2</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">2.0.50215.44 and 8.0.50215.44</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 2.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Original release</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">2.0.50727.42 and 8.0.50727.42</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 2.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 1</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">2.0.50727.1433 and 8.0.50727.1433</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 2.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 2</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">2.0.50727.3053 and 8.0.50727.3053</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;"><font size="3"> .NET FrameWork2.<font size="3">0</font><br>
            </font></td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;"><font size="3"> The final version of windows vista<br>
            </font></td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p><font size="3"> 2.0.50727.312 <br>
            </font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 3.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Original release</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">3.0.04506.26 (on Windows Vista) and 3.0.04506.30 (on downlevel operating systems)</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 3.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 1</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">3.0.04506.648</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 3.0</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pac </span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">0.04506.2152</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 3.5</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Original release</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">3.5.21022.8 and 9.0.21022.8</span></font></p>
            </td>
        </tr>
        <tr>
            <td width="271" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 203.4pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">.NET Framework 3.5</span></font></p>
            </td>
            <td width="168" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 1.75in; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">Service pack 1</span></font></p>
            </td>
            <td width="132" valign="top" style="border: 1px dotted rgb(127, 124, 117); padding: 0in 5.4pt; width: 99pt; background-color: transparent;">
            <p style="margin: 0in 0in 0pt;"><font size="3"><span style="font-size: 10pt;">3.5.30729.1 and 9.0.30729.1</span></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p><font size="3">虽然给DONET打补丁不是什么好办法，但是的确可以解燃眉之急啊。<img src="http://img.baidu.com/hi/jd/j_0025.gif"></font></p>
PS:Version history of the CLR 2.0<br>
<a href="http://blogs.msdn.com/dougste/archive/2007/09/06/version-history-of-the-clr-2-0.aspx" target="_blank">http://blogs.msdn.com/dougste/archive/2007/09/06/version-history-of-the-clr-2-0.aspx</a> <a href="http://hi.baidu.com/tease/blog/item/49e0d0f91f5b105f242df203.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D6%FA%C8%CB%CE%AA%C0%D6">助人为乐</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/49e0d0f91f5b105f242df203.html#comment">查看评论</a>]]></description>
        <pubDate>2008年08月25日 星期一  22:49</pubDate>
        <category><![CDATA[助人为乐]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/49e0d0f91f5b105f242df203.html</guid>
</item>

<item>
        <title><![CDATA[一个js调用c#winform方法的错误]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/f32bbe45d8a3ce20cefca364.html]]></link>
        <description><![CDATA[
		
		最近遇到一个错误<br>
A QueryInterface call was made requesting the default IDispatch interface of COM visible managed class 'IssueDetailForm'. However since this class does not have an explicit default interface and derives from non COM visible class 'WinFormsUI.Docking.DockContent', the QueryInterface call will fail. This is done to prevent the non COM visible base class from being constrained by the COM versioning rules.<br>
<br>
原因是因为我们最近升级了dockpanel控件。使得JS无法调用c#中的winform。看这个错误信息就知道和COM相关系。<br>
最终发现必须要将dockpanel控件中的DockContent这个类的前面加上[ComVisible(true)]。还好dockpanel是一个开源控件，否则后果难以想象。 <a href="http://hi.baidu.com/tease/blog/item/f32bbe45d8a3ce20cefca364.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D6%FA%C8%CB%CE%AA%C0%D6">助人为乐</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/f32bbe45d8a3ce20cefca364.html#comment">查看评论</a>]]></description>
        <pubDate>2008年08月12日 星期二  14:58</pubDate>
        <category><![CDATA[助人为乐]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/f32bbe45d8a3ce20cefca364.html</guid>
</item>

<item>
        <title><![CDATA[版本升级——cici中国象棋控件v1.1.30511.10 Beta2]]></title>
        <link><![CDATA[http://hi.baidu.com/tease/blog/item/5a48d033b7618546ac4b5f8c.html]]></link>
        <description><![CDATA[
		
		<p align="center"><strong><font size="4">cici中国象棋控件 FOR DONET 2.0(v1.1.30511.10 Beta2)</font></strong></p>
<p align="center"><a href="http://www.chengchen.net/">www.chengchen.net</a> 程晨</p>
<p align="left">注：此作品并非上次留言所说的&ldquo;有技术含量的作品&rdquo;。</p>
<p align="left">v1.1.30511.10 Beta2 本版本为过渡版本，下个版本更加完善。</p>
<p align="left">1、增加了点击移动棋子的方式。</p>
<p align="left">2、增加了透明标记上次移动的棋子。</p>
<p align="left">3、增加了音效。</p>
<p align="left">4、增加了左右翻转功能。</p>
<p align="left"><font color="#ff0000">5、增加对UCCI的简单支持，自带UCCI引擎，DEMO中可以实现人机对战！如果你能轻松打败电脑，请直接上QQ游戏对战平台找 本人 挑战！！！^_^</font></p>
<p align="left">6、修改了兵过河后可以横着移动多个位置的bug。</p>
<p align="left">7、增加了若干属性。</p>
<p align="left">8、过期日期调整为2010年1月1日。</p>
<p align="left">9、下一个版本将增加悔棋、棋谱存盘等功能，因此将会是非常完善的版本，敬请期待！！并将进一步提升重绘效率。</p>
<p align="left">10、详细使用说明将再下一个版本中和大家见面。</p>
<p align="left"><a target="_blank" href="http://www.chengchen.net/cicistudio/product/cicichesscontrol/CChess080511.rar">点击下载</a></p>
<p align="left">____________________________________________________</p>
<p align="left">v1.0.30401.10</p>
<p align="left">修复在部分计算机上棋子显示不正确的bug。</p>
<p align="left">____________________________________________________</p>
<p align="left">v1.0.30329.10</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  上次看了一位 &ldquo;微软MVP&rdquo; 用C#写的中国象棋软件，总体上感觉还是蛮好的，可惜棋子在拖动的时候有明显的&ldquo;划痕&rdquo;，棋子的抖动现象也很严重。最近本人对GDI+有些研究，对于重绘 的性能有些心得，于是便下定决心先写个高效的《中国象棋FOR DONET》的控件来，然后再实现我编写的象棋梦想。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在C#编程上，其效率问题一直受人们质疑，前几天也有网友发邮件问我关于性能的问题。但我却偏偏和大多人的想法不一样，我认为C#的性能问题大多数是由代 码编写者自己不慎重考虑造成的。如果绕过DONET的糖衣，你能熟知WINDOWS的系统编程的话，那么我认为无论是那么语言在你手中，都将会是高性能 的。</p>
<p align="left">首先我来说说我这个控件的优点：</p>
<p align="left">1、界面美观。</p>
<p align="left">2、性能颇高。无任何&ldquo;拖痕&rdquo;，但会极少的画面抖动现象。</p>
<p align="left">3、封装完善。封装了所有棋子的走棋规则。</p>
<p align="left">4、使用简单。因为是控件，可以直接添加到工具箱中，&ldquo;即拖即用&rdquo;。</p>
<p align="left">缺点就是：我编写时间有限，先放出这个测试版给大家测试，当然还有很多想法尚未完成。</p>
<p align="left">使用步骤：</p>
<p align="left">1、请点击此处下载控件。<a target="_blank" href="http://www.chengchen.net/cicistudio/product/cicichesscontrol/CChess080511.rar">点击下载</a></p>
<p align="left">2、压缩包中有两个目录，其中CiCiChessControl目录放置了控件，而DEMO目录则放置了调用这个控件的 一个例子。你可以解压缩后将CiCiChessControl目录放在一个特定位置。比如D:的根目录下。然后打开VS新建一个WindowForm程 序。然后点击VS的菜单中的&ldquo;工具&rdquo;--&gt;&ldquo;选择工具箱&rdquo;便弹出下图：</p>
<p align="left"> </p>
<p align="left"><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/8fc4dd07751e6ddc7a894780.jpg"></p>
<p align="left">3、点击游览，选择刚才解压缩的CiCiChessControl目录中的CiCistudio.CChess.dll 文件。最后点击&ldquo;确定&rdquo;后，这时你就会在工具栏惊喜的发现，这个自定义控件添加成功了，多出了一个中国象棋图标。如下图所示：</p>
<p align="left"> </p>
<div forimg="1">
<p><img class="blogimg" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/1bd452b57c519edf37d3cad8.jpg"></p>
<p>4、将这个控件图标拖动到FORM窗体中便可以了。</p>
<p>5、如果在Form的Form_Load事件中直接调用控件的NewGame()方法，那么便可以直接实现&ldquo;人人对战&rdquo;了。</p>
<p><strong>1、控件使用必读</strong><br>
<strong>1.1、本控件坐标规定：<br>
</strong>&nbsp;&nbsp;&nbsp;&nbsp;  《CiCi象棋控件》的横坐标是指：象棋盘从左到右的计数。最小横坐标为1，最大横坐标为9。纵坐标是指象棋盘从上往下计数，最小总坐标为1，最大纵坐标为10。（包括河界部分）<br>
<strong>1.2、本控件现有属性：</strong><br>
<strong>1、 GameType</strong><br>
这个属性是指当前游戏是什么类型的，它包括三种类型：<br>
A、 PEOVSPEO 人和人下棋，这个类型是默认的属性，如果选择此类型，那么人和人就轮流下棋子。<br>
B、 PEOVSPC 人和电脑下棋，如果选择这个类型，那么人下一步棋后，必须等待计算机下棋，才能再次移动自己的棋子。<br>
C、 PCVSPC 电脑和电脑下棋，如果你要开发一个象棋智力的测试平台，那么可以选择此类型，在此类型下人是无法移动棋子的。<br>
<strong>2、 IsDead</strong><br>
这个属性是设置象棋是否死棋，如果设置了死棋那么人无法再继续下棋。目前本版本只支持设置，而不支持读取是否死棋，死棋规则目前只能由程序开发人员自行判断。<br>
<strong>1.3、本控件现有方法：</strong><br>
1、 Void NewGame() 这个方法调用后会开始一盘新的游戏。在游戏开始时必须执行此方法。<br>
2、 Void SWitchUpDown()这个方法调用后会自动上下翻转棋子，最大的用处末过于用在第二盘游戏的开始时候会自动交换棋子的时候。<br>
3、 Bool SetChessPosition(int oldX, int oldY,int newX,int newY) 这个方法主要用途在于使用计算机下棋，第一个参数是需要移动棋子的横坐标，第二个参数是需要移动棋子的纵坐标，第三个参数是棋子移动到某个位置的横坐标， 第四个参数是棋子移动到某个位置的纵坐标。如果移动成功则返回true，棋盘上也会移动相应的棋子，如果移动失败（不符合象棋的下法或者移动到屏幕外面去 了，或者指定位置没有棋子）就返回false。如果返回false那么请检查你的算法时候有问题，你移动的是否是正确的棋子。<br>
4、 Bool SetChessPosition(Point oldXY,Point newXY) 这个方法是上一个方法的重载，参数改为了POINT型，代表新旧坐标。<br>
<strong>1.4、本控件现有事件：<br>
</strong>ChessMoveEvent(object sender, EventArgs e) 这个事件的意思是指，每手动移动一个棋子就会触发这个事件一次！<br>
<strong>1.5 特别说明</strong><br>
本版本v1.0.30329.10在2008年还会进行升级，所以<strong>到2009年1月1日就会过期</strong>，如果过期，那么您将不能使用，倒是请赶快到我的博客上获取最新的控件版本。</p>
<p><br>
<strong>下版本升级将包括</strong>：1、显示上一次移动的时哪个棋子，用特殊标记，或使用透明棋子的标记方法。2、增加声音。3、其他bug和细微调整。</p>
<p>详细说明还在制作之中</p>
<p>截图：</p>
<div forimg="1">
<p> </p>
<p> </p>
<p>希望多提意见：<a href="mailto:chengchencici@163.com">chengchencici@163.com</a></p>
<p>给我留言：<a href="http://www.chengchen.net/guestbook/">http://www.chengchen.net/guestbook/</a></p>
<p> </p>
<div forimg="1"><img class="blogimg" style="width: 793px; height: 700px" height="700" width="790" border="0" small="0" src="http://hiphotos.baidu.com/tease/pic/item/d3007f0998f227be2fddd4a1.jpg"></div>
</div>
<p>请点击此处下载控件。<a target="_blank" href="http://www.chengchen.net/download.aspx?softid=4&amp;versionid=5">点击下载</a></p>
</div> <a href="http://hi.baidu.com/tease/blog/item/5a48d033b7618546ac4b5f8c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/tease/blog/category/%D7%F7%C6%B7%B7%D6%CF%ED">作品分享</a>&nbsp;<a href="http://hi.baidu.com/tease/blog/item/5a48d033b7618546ac4b5f8c.html#comment">查看评论</a>]]></description>
        <pubDate>2008年05月12日 星期一  00:19</pubDate>
        <category><![CDATA[作品分享]]></category>
        <author><![CDATA[tease]]></author>
		<guid>http://hi.baidu.com/tease/blog/item/5a48d033b7618546ac4b5f8c.html</guid>
</item>


</channel>
</rss>