<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>hbs' blog</title><link>http://www.hb4.org/</link><description>fuck by fuck!</description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 100427</generator><language>zh-CN</language><copyright>Copyright 2007-2010 Your WebSite. Some Rights Reserved.</copyright><pubDate>Wed, 23 Jun 2010 08:59:37 +0800</pubDate><item><title>uploadify+struts2实现文件批量异步上传</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/24.htm</link><pubDate>Mon, 24 May 2010 17:15:10 +0800</pubDate><guid>http://www.hb4.org/Article/24.htm</guid><description><![CDATA[<p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;搞了一下Ajax文件上传的控件,贴一个整合Struts2的例子:下面是图例,</p><p><img onload="ResizeImage(this,520)" src="http://www.hb4.org/upload/2010/5/201005241719077086.jpg" alt="" title="" /></p><p>&nbsp;</p><p><span style="background-color: rgb(51, 153, 102); "><strong><span style="font-size: x-large; ">upload.jsp &nbsp; &nbsp;</span></strong>&nbsp;</span></p><hr /><p>﻿&lt;%@ page language=&quot;java&quot; import=&quot;java.util.*&quot; pageEncoding=&quot;UTF-8&quot;%&gt;</p><p>&lt;%</p><p><span class="Apple-tab-span" style="white-space:pre">	</span>String path = request.getContextPath();</p><p>%&gt;</p><p>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</p><p>&lt;html&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;head&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/jquery-1.3.2.min.js&quot;&gt;&lt;/script&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;script type=&quot;text/javascript&quot; src=&quot;scripts/swfobject.js&quot;&gt;&lt;/script&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;script type=&quot;text/javascript&quot;</p><p><span class="Apple-tab-span" style="white-space:pre">			</span>src=&quot;scripts/jquery.uploadify.v2.1.0.min.js&quot;&gt;&lt;/script&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;link href=&quot;css/uploadify.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;link href=&quot;css/default.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;</p><p>&nbsp;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;script type=&quot;text/javascript&quot;&gt;&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$(document).ready(function() {&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$(&quot;#fileupload&quot;).uploadify({&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'uploader' &nbsp; &nbsp; &nbsp; : 'scripts/uploadify.swf',&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'script' &nbsp; &nbsp; &nbsp; &nbsp; : '&lt;%=path%&gt;/Up_upload.action?uid=&lt;%out.print(new Random().nextDouble());%&gt;',&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cancelImg' &nbsp; &nbsp; &nbsp;: 'scripts/cancel.png',&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'queueID' &nbsp; &nbsp; &nbsp; &nbsp;: 'fileQueue',</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'fileDataName' &nbsp; : 'fileupload',&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'auto' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : false,</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'multi' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: true,&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'buttonText' &nbsp; &nbsp; : 'BROWE',</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'fileDesc' &nbsp; &nbsp; &nbsp; : '支持格式:jpg/gif/jpeg/png/bmp.',</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'fileExt' &nbsp; &nbsp; &nbsp; &nbsp;: '*.jpg;*.gif;*.jpeg;*.png;*.bmp',</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">	</span>onComplete: function (event, queueID, fileObj, response, data) {&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">		</span>var scriptStr='&lt;%=path%&gt;/Up_upload.action?uid='+Math.random();</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">		</span>$('#fileupload').uploadifySettings('script',scriptStr);</p><p><span class="Apple-tab-span" style="white-space:pre">					</span>$('#retpanel').append('&lt;li id=\''+response+'\'&gt;'+response+'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'+</p><p><span class="Apple-tab-span" style="white-space:pre">					</span>'&lt;img src=&quot;&lt;%=path%&gt;/admin/upload/scripts/cancel.png&quot; onclick=&quot;deletePic(\''+response+'\');&quot;/&gt;&lt;/li&gt;');</p><p><span class="Apple-tab-span" style="white-space:pre">				</span>},&nbsp;</p><p><span class="Apple-tab-span" style="white-space:pre">				</span>onError: function(event, queueID, fileObj) {&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">		</span> alert(&quot;文件:&quot; + fileObj.name + &quot;上传失败&quot;);&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; <span class="Apple-tab-span" style="white-space:pre">			</span>}</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;});&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//删除文件</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;function deletePic(name){</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">	</span>$.ajax({</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;url : '&lt;%=path%&gt;/Up_deleteFile.action?fileName='+name+'&amp;uuid='+Math.random(),</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cache : false,&nbsp;</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;async : true,</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;type : &quot;POST&quot;,</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success : function (result){</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(result!=null &amp;&amp; result=='ok'){</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">	</span>var oDl = document.getElementById(name);</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">				</span>oDl.parentNode.removeChild(oDl);</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}else{</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">	</span>alert(result);</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;},</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error : function(){</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-tab-span" style="white-space:pre">	</span>alert('提交请求失败,删除文件失败!');</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&lt;/script&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/head&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;body bgcolor=&quot;white&quot;&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;h3&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">			</span>文件上传</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/h3&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;div id=&quot;fileQueue&quot; style=&quot;&quot;&gt;&lt;/div&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;br&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;p&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;input type=&quot;file&quot; name=&quot;fileupload&quot; id=&quot;fileupload&quot; /&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;a href=&quot;javascript:jQuery('#fileupload').uploadifyUpload()&quot;&gt;开始上传&lt;/a&gt;|</p><p><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;a href=&quot;javascript:jQuery('#fileupload').uploadifyClearQueue()&quot;&gt;取消所有上传&lt;/a&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/p&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;ol class=files id=&quot;retpanel&quot;&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/ol&gt;</p><p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/body&gt;</p><p>&lt;/html&gt;</p><hr /><div><div><span style="background-color: rgb(51, 153, 102); "><strong><span style="font-size: x-large; ">UploadAction.java的代码,&nbsp;fileupload的名字必须跟file控件的name一致</span></strong></span></div><div>/**</div><div>&nbsp;* Ajax文件上传Action</div><div>&nbsp;*&nbsp;</div><div>&nbsp;* @author hbs</div><div>&nbsp;* @version 1.0 测试兼容IE8,firefox,google浏览器</div><div>&nbsp;*&nbsp;</div><div>&nbsp;*/</div><div>public class UploadAction {</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>private File fileupload;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>private String fileuploadFileName;</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>/**</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> * 上传文件</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> *&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> * @return</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> * @throws IOException</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> */</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>public String upload() throws IOException {</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>String extName = &quot;&quot;, newFileName = &quot;&quot;, nowTimeStr = &quot;&quot;, saveFloder = &quot;/uploads/&quot;;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>String savePath = ServletActionContext.getServletContext().getRealPath(</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>&quot;&quot;)</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>+ saveFloder;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>File floder = new File(savePath);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>if (!floder.exists())</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>floder.mkdir();</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>HttpServletResponse response = ServletActionContext.getResponse();</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>response.setCharacterEncoding(&quot;utf-8&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>int rannum = (int) (new Random().nextDouble() * (99999 - 10000 + 1)) + 10000;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>nowTimeStr = new SimpleDateFormat(&quot;yyyyMMddHHmmss&quot;).format(new Date());</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>if (fileuploadFileName.lastIndexOf(&quot;.&quot;) &gt;= 0) {</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>extName = fileuploadFileName.substring(fileuploadFileName</div><div><span class="Apple-tab-span" style="white-space:pre">					</span>.lastIndexOf(&quot;.&quot;));</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>newFileName = nowTimeStr + rannum + extName;</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>fileupload.renameTo(new File(savePath + newFileName));</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>response.getWriter().print(saveFloder + newFileName);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>return null;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>/**</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> * 删除文件</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> *&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> * @return</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> * @throws IOException</div><div><span class="Apple-tab-span" style="white-space:pre">	</span> */</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>public String deleteFile() throws IOException {</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>HttpServletResponse response = ServletActionContext.getResponse();</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>response.setCharacterEncoding(&quot;utf-8&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>String savePath = ServletActionContext.getServletContext().getRealPath(</div><div><span class="Apple-tab-span" style="white-space:pre">				</span>&quot;&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>savePath += ServletActionContext.getRequest().getParameter(&quot;fileName&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>File pic = new File(savePath);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>if (pic.exists()) {</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>response.getWriter().print(pic.delete() ? &quot;ok&quot; : &quot;删除失败!&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">			</span>response.getWriter().print(&quot;没有找到相应的文件,删除失败!&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>}</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>return null;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>public void setFileupload(File fileupload) {</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>this.fileupload = fileupload;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div><div>&nbsp;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>public void setFileuploadFileName(String fileuploadFileName) {</div><div><span class="Apple-tab-span" style="white-space:pre">		</span>this.fileuploadFileName = fileuploadFileName;</div><div><span class="Apple-tab-span" style="white-space:pre">	</span>}</div><div>&nbsp;</div><div>}</div><hr /><div>&nbsp;</div></div><blockquote><p>&nbsp;</p></blockquote>]]></description><category>{JavaEE开发}</category><comments>http://www.hb4.org/Article/24.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=24</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=24&amp;key=30e449b1</trackback:ping></item><item><title>关于JavaEE项目性能问题</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/23.htm</link><pubDate>Fri, 07 May 2010 16:14:48 +0800</pubDate><guid>http://www.hb4.org/Article/23.htm</guid><description><![CDATA[<p>　　　　症状:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于Struts2+Spring+Hibernate架构的项目,hibernate开二级缓存.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用tomcat跑,最大200线程,默认64M内存,开40线程性能测试,出现堆内存溢出</p><p>&nbsp;</p><p>　　　&nbsp;&nbsp; 解决方案:</p><p>　　　　&nbsp; 调高Tomcat虚拟内存到512M,继续测试.内存未溢出,但导致整个应用卡死,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看tomcat线程,出现线程死锁</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分析死锁原因:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.资源未释放</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.线程池原因</p><p>　　　　 3.request的操作代码耗时较长.</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后新建测试项目:Action内Thread.sleping(1000);继续测试,未出现死锁现象</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibernate查10000条数据,第一次耗时&gt;2000ms,第二次耗时&gt;800ms,继续测试出现死锁现象</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibernate 查1000条,第一次耗时&lt;100ms,第二次&lt;50ms,测试,未出现死锁,但程序反应过慢</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDBC查10000条数据,第一次耗时&gt;16ms,第二次&lt;16ms,继续测试,未出现死锁</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 得出结论:用户操作比较频繁的页面数据库操作耗时不能超过50ms (CPU:赛扬D双核,内存1G)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然,测试的并发线程数40,根据硬件以及测试条件变动</p>]]></description><category>{JavaEE开发}</category><comments>http://www.hb4.org/Article/23.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=23</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=23&amp;key=41abd937</trackback:ping></item><item><title>Ring3新的键盘记录方法-适合盗号木马</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/22.htm</link><pubDate>Tue, 09 Mar 2010 15:51:16 +0800</pubDate><guid>http://www.hb4.org/Article/22.htm</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看了VXK的文章提示咱们:可以用dinput来捕获键盘输入值,想想,能够干什么呢?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哈哈,记录密码啦~~~用的就是<span lang="EN-US" style="font-size: 10pt; color: black; font-family: Tahoma; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>DirectInput</strong></span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: Tahoma; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> ... 不多说.贴代码:</span></p><p>=========================无聊的分割线======================</p><p><span lang="EN-US" style="font-size: 10pt; color: black; font-family: Tahoma; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="font-size: 10pt; color: black">游戏编程可不仅仅是图形程序的开发工作，实际上包含了许多方面，本文所要讲述的就是关于如何使用</span><span style="font-size: 10pt; color: black"> <b>DirectInput</b> </span><span style="font-size: 10pt; color: black">来对键盘编程的问题。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　在</span><span style="font-size: 10pt; color: black"> DOS </span><span style="font-size: 10pt; color: black">时代，我们一般都习惯于接管键盘中断来加入自己的处理代码。但这一套生存方式在万恶的</span><span style="font-size: 10pt; color: black"> Windows </span><span style="font-size: 10pt; color: black">社会下是行不通的，我们只能靠领</span><span style="font-size: 10pt; color: black"> API </span><span style="font-size: 10pt; color: black">或者</span><span style="font-size: 10pt; color: black"> DirectInput </span><span style="font-size: 10pt; color: black">的救济金过活。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　在</span><span style="font-size: 10pt; color: black"> Windows </span><span style="font-size: 10pt; color: black">的</span><span style="font-size: 10pt; color: black"> API </span><span style="font-size: 10pt; color: black">中，有一个</span><span style="font-size: 10pt; color: black"> GetAsyncKeyState() </span><span style="font-size: 10pt; color: black">的函数可以返回一个指定键的当前状态是按下还是松开。这个函数还能返回该指定键在上次调用</span><span style="font-size: 10pt; color: black"> GetAsyncKeyState() </span><span style="font-size: 10pt; color: black">函数以后，是否被按下过。虽然这个函数听上去很不错，但现在领这种救济金的程序员是越来越少了。原因无它，只因为</span><span style="font-size: 10pt; color: black"> DirectInput </span><span style="font-size: 10pt; color: black">的救济金比这丰厚，而且看上去似乎更专业？</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　为了早日成为职业的救济金用户，我们就从学习</span><span style="font-size: 10pt; color: black"> DirectInput </span><span style="font-size: 10pt; color: black">的键盘编程开始吧。</span><span style="font-size: 10pt; color: black"><br /><br />DIRECTINPUT </span><span style="font-size: 10pt; color: black">的初始化</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　前面讲</span><span style="font-size: 10pt; color: black"> DirectDraw </span><span style="font-size: 10pt; color: black">时，曾经提到，微软是按</span><span style="font-size: 10pt; color: black"> COM </span><span style="font-size: 10pt; color: black">来设计</span><span style="font-size: 10pt; color: black">DirectX</span><span style="font-size: 10pt; color: black">的，所以就有了一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">对象来表示输入设备，而某个具体的设备由</span><span style="font-size: 10pt; color: black"> DIRECTINPUTDEVICE </span><span style="font-size: 10pt; color: black">对象来表示。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　实际的建立过程是先创建一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">对象，然后在通过此对象的</span><span style="font-size: 10pt; color: black"> CreateDevice </span><span style="font-size: 10pt; color: black">方法来创建</span><span style="font-size: 10pt; color: black"> DIRECTINPUTDEVICE </span><span style="font-size: 10pt; color: black">对象。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　示例如下：</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">#include &lt;dinput.h&gt;<br /><br />#define DINPUT_BUFFERSIZE 16<br /><br />LPDIRECTINPUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDirectInput;&nbsp; // DirectInput object<br />LPDIRECTINPUTDEVICE&nbsp;&nbsp;&nbsp;&nbsp; lpKeyboard;&nbsp;&nbsp;&nbsp;&nbsp; // DirectInput device<br /><br />BOOL InitDInput(HWND hWnd)<br />{<br />&nbsp;&nbsp;&nbsp; HRESULT hr;<br /><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">创建一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">对象</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; hr = DirectInputCreate(hInstanceCopy, DIRECTINPUT_VERSION, &amp;lpDirectInput, NULL);<br /><br /></span></span></p><div align="left"><span style="font-size: 10pt; color: black">if FAILED(hr)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">失败</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">创建一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUTDEVICE </span><span style="font-size: 10pt; color: black">界面</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; hr = lpDirectInput-&gt;CreateDevice(GUID_SysKeyboard, &amp;lpKeyboard, NULL);<br />&nbsp;&nbsp;&nbsp; if FAILED(hr)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">失败</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">设定为通过一个</span><span style="font-size: 10pt; color: black"> 256 </span><span style="font-size: 10pt; color: black">字节的数组返回查询状态值</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;SetDataFormat(&amp;c_dfDIKeyboard);<br />&nbsp;&nbsp;&nbsp; if FAILED(hr)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">失败</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">设定协作模式</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);<br />&nbsp;&nbsp;&nbsp; if FAILED(hr)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">失败</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">设定缓冲区大小</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">如果不设定，缓冲区大小默认值为</span><span style="font-size: 10pt; color: black"> 0</span><span style="font-size: 10pt; color: black">，程序就只能按立即模式工作</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">如果要用缓冲模式工作，必须使缓冲区大小超过</span><span style="font-size: 10pt; color: black"> 0<br />&nbsp;&nbsp;&nbsp; DIPROPDWORD&nbsp;&nbsp;&nbsp;&nbsp; property;<br /><br />&nbsp;&nbsp;&nbsp; property.diph.dwSize = sizeof(DIPROPDWORD);<br />&nbsp;&nbsp;&nbsp; property.diph.dwHeaderSize = sizeof(DIPROPHEADER);<br />&nbsp;&nbsp;&nbsp; property.diph.dwObj = 0;<br />&nbsp;&nbsp;&nbsp; property.diph.dwHow = DIPH_DEVICE;<br />&nbsp;&nbsp;&nbsp; property.dwData = DINPUT_BUFFERSIZE;<br /><br />&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;SetProperty(DIPROP_BUFFERSIZE, &amp;property.diph);<br /><br />&nbsp;&nbsp;&nbsp; if FAILED(hr)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">失败</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br /><br />&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;Acquire();<br />&nbsp;&nbsp;&nbsp; if FAILED(hr)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">失败</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; return TRUE;<br />}</span></div><div align="left"><span style="font-size: 10pt; color: black">　　在这段代码中，我们首先定义了</span><span style="font-size: 10pt; color: black"> lpDirectInput </span><span style="font-size: 10pt; color: black">和</span><span style="font-size: 10pt; color: black"> lpKeyboard </span><span style="font-size: 10pt; color: black">两个指针，前者用来指向</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">对象，后者指向一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUTDEVICE </span><span style="font-size: 10pt; color: black">界面。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　通过</span><span style="font-size: 10pt; color: black"> DirectInputCreate(), </span><span style="font-size: 10pt; color: black">我们为</span><span style="font-size: 10pt; color: black"> lpDirectInput </span><span style="font-size: 10pt; color: black">创建了一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">对象。然后我们调用</span><span style="font-size: 10pt; color: black"> CreateDevice </span><span style="font-size: 10pt; color: black">来建立一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUTDEVICE </span><span style="font-size: 10pt; color: black">界面。参数</span><span style="font-size: 10pt; color: black"> GUID_SysKeyboard </span><span style="font-size: 10pt; color: black">指明了建立的是键盘对象。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　接下来</span><span style="font-size: 10pt; color: black"> SetDataFormat </span><span style="font-size: 10pt; color: black">设定数据格式，</span><span style="font-size: 10pt; color: black">SetCooperativeLevel </span><span style="font-size: 10pt; color: black">设定协作模式，</span><span style="font-size: 10pt; color: black">SetProperty </span><span style="font-size: 10pt; color: black">设定缓冲区模式。因为这些函数方法的参数很多，我就不逐个去详细解释其作用了，请直接查看</span><span style="font-size: 10pt; color: black"> DirectX </span><span style="font-size: 10pt; color: black">的帮助信息，那里面写得非常清楚。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　完成这些工作以后，我们便调用</span><span style="font-size: 10pt; color: black"> DIRECTINPUTDEVICE </span><span style="font-size: 10pt; color: black">对象的</span><span style="font-size: 10pt; color: black"> Acquire </span><span style="font-size: 10pt; color: black">方法来激活对设备的访问权限。在此要特别说明一点，任何一个</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">设备，如果未经</span><span style="font-size: 10pt; color: black"> Acquire</span><span style="font-size: 10pt; color: black">，是无法进行访问的。还有，当系统切换到别的进程时，必须用</span><span style="font-size: 10pt; color: black"> Unacquire </span><span style="font-size: 10pt; color: black">方法来释放访问权限，在系统切换回本进程时再调用</span><span style="font-size: 10pt; color: black"> Acquire </span><span style="font-size: 10pt; color: black">来重新获得访问权限。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　所以，我们通常要在</span><span style="font-size: 10pt; color: black"> WindowProc </span><span style="font-size: 10pt; color: black">中做如下处理：</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">long FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)<br />{<br />&nbsp;&nbsp;&nbsp; switch(message)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; case WM_ACTIVATEAPP:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bActive)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(lpKeyboard) lpKeyboard-&gt;Acquire();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(lpKeyboard) lpKeyboard-&gt;Unacquire();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; break;<br />&nbsp;&nbsp;&nbsp; ...<br />}</span></div><div align="left"><span style="font-size: 10pt; color: black">　　哦，对了，前一段例程中还提到了立即模式和缓冲模式。在</span><span style="font-size: 10pt; color: black"> DirectINPUT </span><span style="font-size: 10pt; color: black">中，这两种工作模式是有区别的。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　如果使用立即模式的话，在查询数据时，只能返回查询时的设备状态。而缓冲模式则将记录所有设备状态变化过程。就个人喜好而言，笔者偏好后者，因为这样一般不会丢失任何按键信息。对应的，如果在使用前者时的查询频度太低，则很难保证采集数据的完整性。</span><span style="font-size: 10pt; color: black"><br /><br />DIRECTINPUT </span><span style="font-size: 10pt; color: black">的数据查询</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　立即模式的数据查询比较简单，请看下面的示例：</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">BYTE diks[256]; // DirectInput keyboard state buffer </span><span style="font-size: 10pt; color: black">键盘状态数据缓冲区</span><span style="font-size: 10pt; color: black"><br /><br />HRESULT UpdateInputState(void)<br />{<br />&nbsp;&nbsp;&nbsp; if(lpKeyboard != NULL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">如果</span><span style="font-size: 10pt; color: black"> lpKeyboard </span><span style="font-size: 10pt; color: black">对象界面存在</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HRESULT hr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = DIERR_INPUTLOST;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">为循环检测做准备</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if input is lost then acquire and keep trying<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(hr == DIERR_INPUTLOST)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">读取输入设备状态值到状态数据缓冲区</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;GetDeviceState(sizeof(diks), &amp;diks);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(hr == DIERR_INPUTLOST)<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; // DirectInput </span><span style="font-size: 10pt; color: black">报告输入流被中断</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">必须先重新调用</span><span style="font-size: 10pt; color: black"> Acquire </span><span style="font-size: 10pt; color: black">方法，然后再试一次</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;Acquire();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hr;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; return S_OK;<br />}</span></div><div align="left"><span style="font-size: 10pt; color: black">　　在上面的示例中，关键处就是使用</span><span style="font-size: 10pt; color: black"> GetDeviceState </span><span style="font-size: 10pt; color: black">方法来读取输入设备状态值以及对异常情况的处理。通过使用</span><span style="font-size: 10pt; color: black"> GetDeviceState </span><span style="font-size: 10pt; color: black">方法，我们把输入设备的状态值放在了一个</span><span style="font-size: 10pt; color: black"> 256 </span><span style="font-size: 10pt; color: black">字节的数组里。如果该数组中某个数组元素的最高位为</span><span style="font-size: 10pt; color: black"> 1</span><span style="font-size: 10pt; color: black">，则表示相应编码的那个键此时正被按下。例如，如果</span><span style="font-size: 10pt; color: black"> diks[1]&amp;0x80&gt;0</span><span style="font-size: 10pt; color: black">，那么就表示</span><span style="font-size: 10pt; color: black"> ESC </span><span style="font-size: 10pt; color: black">键正被按下。</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　学会了立即模式的数据查询以后，下面我们开始研究缓冲模式的情况：</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">HRESULT UpdateInputState(void)<br />{<br />&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp; i;<br /><br />&nbsp;&nbsp;&nbsp; if(lpKeyboard != NULL)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIDEVICEOBJECTDATA&nbsp; didod[DINPUT_BUFFERSIZE];&nbsp; // Receives buffered data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwElements;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HRESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = DIERR_INPUTLOST;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(hr != DI_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwElements = DINPUT_BUFFERSIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;GetDeviceData(sizeof(DIDEVICEOBJECTDATA), didod, &amp;dwElements, 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (hr != DI_OK)<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; // </span><span style="font-size: 10pt; color: black">发生了一个错误</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">这个错误有可能是</span><span style="font-size: 10pt; color: black"> DI_BUFFEROVERFLOW </span><span style="font-size: 10pt; color: black">缓冲区溢出错误</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">但不管是哪种错误，都意味着同输入设备的联系被丢失了</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">这种错误引起的最严重的后果就是如果你按下一个键后还未松开时</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">发生了错误，就会丢失后面松开该键的消息。这样一来，你的程序</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">就可能以为该键尚未被松开，从而发生一些意想不到的情况</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">现在这段代码并未处理该错误</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">解决该问题的一个办法是，在出现这种错误时，就去调用一次</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // GetDeviceState()</span><span style="font-size: 10pt; color: black">，然后把结果同程序最后所记录的状态进行</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">比较，从而修正可能发生的错误</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = lpKeyboard-&gt;Acquire();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(FAILED(hr))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hr;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; // GetDeviceData() </span><span style="font-size: 10pt; color: black">同</span><span style="font-size: 10pt; color: black"> GetDeviceState() </span><span style="font-size: 10pt; color: black">不一样，调用它之后，</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; // dwElements </span><span style="font-size: 10pt; color: black">将指明此次调用共读取到了几条缓冲区记录</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">我们再用一个循环来处理每条记录</span><span style="font-size: 10pt; color: black"><br /><br />&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;dwElements; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">此处放入处理代码</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // didod[i].dwOfs </span><span style="font-size: 10pt; color: black">表示那个键被按下或松开</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // didod[i].dwData </span><span style="font-size: 10pt; color: black">记录此键的状态，低字节最高位是</span><span style="font-size: 10pt; color: black"> 1 </span><span style="font-size: 10pt; color: black">表示按下，</span><span style="font-size: 10pt; color: black">0 </span><span style="font-size: 10pt; color: black">表示松开</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // </span><span style="font-size: 10pt; color: black">一般用</span><span style="font-size: 10pt; color: black"> didod[i].dwData&amp;0x80 </span><span style="font-size: 10pt; color: black">来测试</span><span style="font-size: 10pt; color: black"><br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return S_OK;<br />}</span></div><div align="left"><span style="font-size: 10pt; color: black">　　其实，每条记录还有</span><span style="font-size: 10pt; color: black"> dwTimeStamp </span><span style="font-size: 10pt; color: black">和</span><span style="font-size: 10pt; color: black"> dwSequence </span><span style="font-size: 10pt; color: black">两个字段来记录消息发生的时间和序列编号，以便作更复杂的处理。本文是针对初学者写的，就不打算去谈论这些内容了。</span><span style="font-size: 10pt; color: black"><br /><br />DIRECTINPUT </span><span style="font-size: 10pt; color: black">的结束处理</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">　　我们在使用</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">时，还要注意的一件事就是当程序结束时，必须要进行释放处理，其演示代码如下：</span><span style="font-size: 10pt; color: black"><br /><br /></span><span style="font-size: 10pt; color: black">void ReleaseDInput(void)<br />{<br />&nbsp;&nbsp;&nbsp; if (lpDirectInput)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(lpKeyboard)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Always unacquire the device before calling Release().<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpKeyboard-&gt;Unacquire();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpKeyboard-&gt;Release();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpKeyboard = NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDirectInput-&gt;Release();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDirectInput = NULL;<br />&nbsp;&nbsp;&nbsp; }<br />}</span></div><p><span style="font-size: 10pt; color: black">　　这段代码很简单，就是对</span><span style="font-size: 10pt; color: black"> DIRECTINPUT </span><span style="font-size: 10pt; color: black">的各个对象去调用</span><span style="font-size: 10pt; color: black"> Release </span><span style="font-size: 10pt; color: black">方法来释放资源。这种过程同使用</span><span style="font-size: 10pt; color: black"> DIRECTX </span><span style="font-size: 10pt; color: black">的其它部分时是基本上相同的。</span></p>]]></description><category>{C/C++相关}</category><comments>http://www.hb4.org/Article/22.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=22</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=22&amp;key=fd4bc9da</trackback:ping></item><item><title>IIS+Resin整合遇到的问题</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/19.htm</link><pubDate>Fri, 05 Mar 2010 08:55:04 +0800</pubDate><guid>http://www.hb4.org/Article/19.htm</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 闲着无聊,想配置一下支持ASP,ASPX,PHP,JSP的全能的WEB环境.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前面三种的配置十分正常,配置JSP支持我用的是Resin3.2</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只要一加上Resin3.2的isapi,整个IIS所有网站都报404错误,网上搜到很多类似的问题</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据网上给出的方式都无法解决,重装IIS,错误依然,最后只有去掉Resin的ISAPI</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除服务拓展,恢复正常...这个问题记下,有待深入了解&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>]]></description><category>{JavaEE开发}</category><comments>http://www.hb4.org/Article/19.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=19</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=19&amp;key=78fc24f1</trackback:ping></item><item><title>[原创]Asp.Net三层架构表示层代码生成器</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/AspxCoding.htm</link><pubDate>Wed, 20 Jan 2010 19:05:45 +0800</pubDate><guid>http://www.hb4.org/Article/AspxCoding.htm</guid><description><![CDATA[<p><strong><span style="font-family: 新宋体"><span style="font-size: small">&nbsp;&nbsp;&nbsp; 由于最近在做ASp.net的项目,表多字段多,烦躁不已,我就是一个喜欢偷懒的家伙,看到这么多重复的工作我就烦恼不已了!</span></span></strong></p><p><strong><span style="font-family: 新宋体"><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp; 所以想办法偷偷懒啦,是的,花了一上午研究了一下.Net相关的代码生成器,CodeSmith是好用,很强大</span></span></strong></p><p><strong><span style="font-family: 新宋体"><span style="font-size: small">&nbsp;&nbsp;&nbsp; 但是,写的模板比一个项目下来编码的工作没得少,语法又很多,动软呢,也不错,不过生成的页面难看,不符合要求.</span></span></strong></p><p><strong><span style="font-family: 新宋体"><span style="font-size: small">&nbsp;&nbsp; 所以再花一下午时间,做了一个生成器,以为模型层和业务层的代码都写好了,这个小东西呢,只能生成显示层...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (过段时间放代码上来,服务器上传卡的要死)</span></span></strong></p><p><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.hb4.org/upload/2010/1/201001201907382852.jpg" /></p><p>&nbsp;</p><p><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.hb4.org/upload/2010/1/201001201907577873.jpg" /></p>]]></description><category>{个人原创}</category><comments>http://www.hb4.org/Article/AspxCoding.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=18</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=18&amp;key=36d51c38</trackback:ping></item><item><title>迅雷5 XPPlayer Activex控件远程代码执行0day漏洞</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/17.htm</link><pubDate>Tue, 05 Jan 2010 19:56:55 +0800</pubDate><guid>http://www.hb4.org/Article/17.htm</guid><description><![CDATA[<div class="post-hr">影响版本:</div><div class="post-content"><pre>Xunlei5.9.14.1246以下所有版本</pre></div><div class="post-hr">漏洞描述:</div><div class="post-content">Xunlei 是一款在线加速下载程序。更多详细信息请参考：<a href="http://www.xunlei.com{F3E70CEA-956E-49CC-B444-73AFE593AD7F}Xunlei">http://www.xunlei.com{F3E70CEA-956E-49CC-B444-73AFE593AD7F}Xunlei</a> 提供的XPPlayer ActiveX控件存在缓冲区溢出，远程攻击者可以利用漏洞以应用程序权限执行任意指令。问题存在于DapFileSize，VodUrl等方法处理中，由于对参数缺少充分过滤，构建恶意WEB页，诱使用户访问，可导致以应用程序权限执行任意指令。</div><div><span class="post-vuln"><strong>&lt;*参考</strong></span> <blockquote>superli@Safe-mail.net</blockquote><span class="post-vuln"><strong>*&gt;</strong></span></div>]]></description><category>{网络安全}</category><comments>http://www.hb4.org/Article/17.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=17</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=17&amp;key=d6d67a47</trackback:ping></item><item><title>[原创]HBs_RAT V1.0 Beta 超强远程控制软件</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/16.htm</link><pubDate>Sun, 03 Jan 2010 01:54:59 +0800</pubDate><guid>http://www.hb4.org/Article/16.htm</guid><description><![CDATA[<p><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.hb4.org/upload/2010/1/rat.jpg" />&nbsp;&nbsp;&nbsp;<strong><span style="font-size: large">&nbsp;&nbsp;&nbsp; </span></strong></p><p><strong><span style="font-size: large">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HBs_RAT V1.0 Beta Build 20100102</span></strong></p><p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong><span style="font-size: small"><strong>辛苦了好一段时间,打算写一长久免杀的远程控制,这段时间辛苦是没有白费的</strong></span><strong><span style="font-size: small">&nbsp;</span></strong></p><p><strong><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所以暂时以HBs_RAT命名,&nbsp;功能很多吸收了gh0st和NB的思想.</span></strong></p><p><strong><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打算把服务端做成模块式的,就像国外Ivy一样,可以配置服务端的功能&nbsp; </span></strong></p><p><strong><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前开发环境是:VC++6 + WINXP SP3 + PSDK2003</span></strong></p><p><strong><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打算将服务端用汇编重写一次..着重解决屏幕控制的问题</span></strong></p><p>&nbsp;</p><p><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .&nbsp;皮肤使用了SkinMagic第三方库</span></p><p><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 使用了IOCP心跳包服务器机制,支持同时万机上线</span></p><p><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .服务端只包含自动上线功能和对抗安全软件功能</span></p><p><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .其他功能全部由插件来实现</span></p><p><span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .优化屏幕传输模块,实现低带宽流畅控制</span></p>]]></description><category>{个人原创}</category><comments>http://www.hb4.org/Article/16.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=16</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=16&amp;key=47770981</trackback:ping></item><item><title>元旦大奉献--JSmart2.0_hbs完善版[+部分源码]</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/JSmart_2_0_fix_by_hbs.htm</link><pubDate>Fri, 01 Jan 2010 08:42:41 +0800</pubDate><guid>http://www.hb4.org/Article/JSmart_2_0_fix_by_hbs.htm</guid><description><![CDATA[<p><span style="font-size: x-large"><strong>强大的代码生成功能</strong></span></p><p>1.自动生成基于SSH,SSH2,SSI架构的代码</p><p>2.自动生成JSP页面及后台代码</p><p>3.自动生成增、删、改、查相关代码及存储过程</p><p>4.自动生成验证代码</p><p>5.生成的代码直接可以发布运行</p><p><strong><span style="font-size: x-large">灵活的代码生成方式定义</span></strong></p><p>1.可以自由设定命名规则及相关包名</p><p>2.根据列注释自动生成相应页面的列头，属性的注释等</p><p>3.JSP页面风格多样性，支持自定义模板生成</p><p>4.支持单表及多表一键生成</p><p>5.框架技术可以切换，如数据访问层可以在Hibernate和iBatis之间切换</p><p>&nbsp;</p><p><u><font color="#810081"><a href="http://www.hb4.org/upload/jsmart/JSamrt2.0.2-hbslover.jar"><span style="color: #ff0000"><span style="font-size: large">http://www.hb4.org/upload/jsmart/JSamrt2.0.2-hbslover.jar</span></span></a></font></u><a href="http://www.hb4.org/jsmart/JSamrt2.0.2-hbslover.jar"></a></p>]]></description><category>{JavaEE开发}</category><comments>http://www.hb4.org/Article/JSmart_2_0_fix_by_hbs.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=15</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=15&amp;key=9b836b65</trackback:ping></item><item><title>解密比尔.盖茨能傲世全球IT行业的真实原因</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/eclipse_chunge.htm</link><pubDate>Tue, 08 Dec 2009 13:02:14 +0800</pubDate><guid>http://www.hb4.org/Article/eclipse_chunge.htm</guid><description><![CDATA[<p>在全球金融危机的冲击之下,咱们的口袋越来越薄,可是盖茨的口袋不管刮风下雨依旧是不断的膨胀!</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这,到底是为什么呢???经过本人不顾生死,明察暗访,终于知道了盖茨发家并且屹立不倒的真实原因:</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为,盖茨,信春哥!!! 如果网络流行一句话:信春哥,好处多,这不是假的,这是真实的存在:</p><p>　　　<strong>春哥开始进入并傲视&nbsp;IT&nbsp;行业:</strong></p><p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><font size="2"><font size="3">1</font>.</font><font size="3">春哥的键盘没有退格键，因为春哥从来没有输错的时候。</font></p><p>　　　2.春哥只要瞥一眼你的桌面就知道你最近上过哪些成人网站。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.春哥从来不用vim/emacs，因为cat对他来说就是一个相当够用的编辑器了。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.春哥编程序从来不需要编译器，因为春哥用的是机器语言，写出来保存后可以直接运行，而且从来不用调试。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.&nbsp;春哥可以从你的/dev/null中发现并破解你的root密码，所以任何Unix系统对春哥来说毫无安全可言。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.春哥的计算机从来不需要重启，因为春哥的系统（Chun Ge OS）不会出任何问题，而这个系统据说是春哥用抽一支烟的功夫用机器语言写成的。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.自从有了春哥，软件工程彻底完蛋了。&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.世界上最准确的电子时钟也不如春哥心中的时钟准确，所以NTP其实最终都是到春哥那里去同步的。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.春哥都是一个比特一个比特地来完成网络数据传输的，但即便如此，世界上最快的计算机也仍然跟不上春哥的传送速度。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.IBM深蓝计算机和春哥下国际象棋，在春哥让了它128步的情况下它仍然输了，哦，对了，春哥只有一个&ldquo;国王&rdquo;。</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就是因为盖茨早世人取得先机,强烈的信了春哥,并从春哥那个拿到了废弃的垃圾-Windows,从而发迹.</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以,自从我知道春哥如此事迹之后,让我更加的膜拜春哥.所以,我想让那些挣扎在IT底层的程序员们脱离苦海,在此,我将公布春哥给的独门秘笈:让你编写出世界上最牛的代码:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p>　　　信春哥，无bug！</p><p>　　　Coding的时候能得到GE的保护，写出无Bug的代码，是每个程序员的终极梦想。</p><p>　　　eclipse是Java-er们常用的IDE开发环境，笔者经过研究，发现了打造有GE保护的eclipse开发环境的方法，与大家分享，步骤如下：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 下载春哥开光过的eclipse启动图片：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img class="size-full wp-image-73 alignnone" title="chunge" height="279" alt="chunge" width="452" src="http://wangk.net/wp-content/uploads/2009/11/b_large_8Eat_51b50001e9352d0b.jpg" /></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你下到的图片不是bmp格式的，请重转换为bmp格式，本示例中将文件命名为ge_eclipse.bmp；</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 将ge_eclipse.bmp copy到eclipse文件夹中（就是有eclipse.exe和eclipse.ini的那个文件夹）；</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 更改eclipse.ini，在&ldquo;-vmargs&rdquo;下面（注意，一定要加在这个下面，否则无法生效）加一行&ldquo;-Dosgi.splashLocation=.\ge_eclipse.bmp&rdquo;，保存；</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. 每次启动的eclipse的时候心中默念新法口诀&ldquo;GE，我要coding了，你懂的，我知道！&rdquo;，大功告成！</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：以上为为windows环境下的示例，linux环境原理类似。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 效果图：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img class="alignnone size-full wp-image-72" title="b_large_9FWi_51b50001ed232d0b" height="395" alt="b_large_9FWi_51b50001ed232d0b" width="523" src="http://wangk.net/wp-content/uploads/2009/11/b_large_9FWi_51b50001ed232d0b.jpg" /></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 教程终于写完了，大汗淋漓，我要开始coding了，GE，你懂的，我知道！</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PS:资源全部来自网络,希望春哥对春哥信徒有效,至此,也是为表达我对春哥强烈的膜拜,一切责任与我无关</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请找我春哥~~~~~~~~~~~~~~~</p>]]></description><category>{个人杂记}</category><comments>http://www.hb4.org/Article/eclipse_chunge.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=14</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=14&amp;key=400c87a7</trackback:ping></item><item><title>基于SOA的JavaEE企业管理系统设计思路</title><author>a@b.com (hbslover)</author><link>http://www.hb4.org/Article/JavaEE_soa_system.htm</link><pubDate>Sat, 28 Nov 2009 10:17:03 +0800</pubDate><guid>http://www.hb4.org/Article/JavaEE_soa_system.htm</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近构思了一个JavaEE+MySQL的企业管理系统,此系统将作为组件化设计</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将一个一个功能作为子系统组件设计,主系统将只提供容器级别的服务</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目的是为容纳各个功能组件,各个组件之间可以独立运行,不过也需要协同工作~</p><p>&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的想法是基于Web Services,由主系统来提供高效率的组件管理调度系统,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使各个组件相对独立,又能协同功能~,主系统还要有严格的权限控制系统,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和高度的可拓展性,这是大体思路:遇到了一些瓶颈问题:路过的朋友请指教一下:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.怎么才能使组件之间相对独立又能紧密协同呢???(Web Services可以解决这样的问题,不过使得组件之间的独立性相对减弱,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有没有更加好的方法基于Web Services使得组件相对独立呢&gt;????)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.怎样才能是系统具体高度的拓展性呢&gt;&gt;???有没有比较成熟的解决方案呢????</p>]]></description><category>{JavaEE开发}</category><comments>http://www.hb4.org/Article/JavaEE_soa_system.htm#comment</comments><wfw:comment>http://www.hb4.org/</wfw:comment><wfw:commentRss>http://www.hb4.org/feed.asp?cmt=13</wfw:commentRss><trackback:ping>http://www.hb4.org/cmd.asp?act=tb&amp;id=13&amp;key=b86aed02</trackback:ping></item></channel></rss>
