2008年10月10日星期五

卸载 Internet Explorer 7

概要
本文介绍在 Microsoft Windows XP 和 Microsoft Windows Server 2003 中如何卸载 Windows Internet Explorer 7。本文还指出,在卸载 Internet Explorer 7 后,Microsoft Internet Explorer 6 将会恢复。

本文可用作中级计算机用户的着手点。

如果您先打印本文,可能会发现更容易按照其中的步骤操作。


方法 1:使用“添加或删除程序”卸载 Internet Explorer 7
步骤 1:使用“添加或删除程序”卸载 Internet Explorer 7
a. 单击“开始”,然后单击“运行”。
b. 在“打开”框中,键入 appwiz.cpl,然后单击“确定”。
c. 在程序列表中,单击“Windows Internet Explorer 7”,然后单击“删除”。
d. 按照向导中的说明卸载 Internet Explorer 7。
卸载了 Internet Explorer 7 后,双击 Internet Explorer 图标,验证 Internet Explorer 6 是否已恢复。

如果通过此方法无法卸载 Internet Explorer 7,请尝试方法 2。


方法 2:使用 Spuninst.exe 卸载 Internet Explorer 7
步骤 1:使隐藏文件和隐藏文件夹可见
a. 单击“开始”,然后单击“我的文档”。
b. 在“工具”菜单上,单击“文件夹选项”。
c. 单击“查看”选项卡。
d. 在“高级设置”列表中的“隐藏文件和文件夹”下,单击“显示所有文件和文件夹”,然后单击“确定”。



步骤 2:运行 Spuninst.exe 卸载 Internet Explorer 7
a. 单击“开始”,然后单击“运行”。
b. 在“打开”框中,键入 %windir%\ie7\spuninst\spuninst.exe,然后单击“确定”。
c. 按照向导中的说明卸载 Internet Explorer 7。
卸载了 Internet Explorer 7 后,双击 Internet Explorer 图标,验证 Internet Explorer 6 是否已恢复。

2008年10月9日星期四

网页游戏开发简明教程

研究所有点缺乏资料啊。讨论的问题怪怪的。只有很少是能用到的。

一、简单的程序框架。
webgame程序构成:
三大部分。
第一是数据流程。第二是程序。第三是美术。
其中,数据流程包括了功能。也只有在功能中才能体现数据流程。

数据流程相当的麻烦,后面再讨论。
比如最简单的卖买产品。
要实现这个功能。
那么需要有产品基础表、产品详细表、商店表、背包表。如果扩展性更强,相应的双表是少不不了的。
表的问题都简单了。关键是这个物品有什么用。这样物品的来源,一大堆数据,物品的走向,又是一大堆数据。
最后,这些数据得绕成一个圈。
绕圈是一件困难的事情。特别是功能和道具多了起来的时候。难度是2的n次方。


美术:

UI。简洁漂亮的界面总会有好处。

小图标。道具,地图,装备。一类至少10个吧?大体上百把个是需要的。


程序分5个部分:
服务器定时器。(C语言或自己设定服务器)定时循环执行某一段代码。而这段代码主要是根据数据库的数据进行更新。这个可以找个C语言程序员来做。对于C语言程序员来讲,这个功能是相当的简单。当然,具体的处理数据的判断和操作数据库,需要你自己写。让C语言程序员给你段标准代码就行了。完全支持sql语句的。

功能页面、功能函数。主要就是数据存取,判断,数据走向。


ajax函数。(可选)某些需要伪即时的功能要用到。

javascript函数。(可选)模拟客户端的数据计算。也就是webgame的与时间相关的数据。分为两部分。一部分是真实数据,是由服务器端的定时器计算的。另一部分是只有初始值,客户端显示用的。不需要即时同步,仅仅需要模拟同步就行。


数据库。一大堆基础数据表和详细数据表。基础数据表:比如等级1到等级100的用户的属性初始值。详细数据表:每个用户的具体属性。

二、一个详细的例子。

单纯的讨论数据流程是件痛苦的事情。
讨论程序而不给代码也是比较痛苦。
这里用的是php+mysql的。

那就按一个超简单的webgame的方式来讨论。配上适当的代码。应该有所帮助。不足的地方也请大家指出,对我个人也是帮助。

我们不去考虑游戏的可玩性,数值平衡等等问题。我们先只考虑一个简单例子的实现。

那么一个webgame的基本内容需要些什么呢?

数据库:玩家、地图、城市、建筑、武器、士兵。

功能:登陆、升级、个人战斗、士兵之间的战斗、与城市的战斗、修建建筑、打造武器、买卖道具。
(注意:每一个功能,必然对应1个或多个数据表。上面数据库中所列的只是基础中的基础。)


首先是地图、城市、建筑。
这里认为,地图可以有多张,城市在地图上,建筑在城市内。


地图表
Map :Map_ID ,X坐标, Y坐标,City_ID(城市ID),描述。
其中Map_ID是指地图的id。不是自动编号。一张地图就是一个Map_ID,可以重复。

城市表
City:City_ID,城市名字,城市所有人,城市等级,城市资源,描述。

建筑表
Build:ID,City_ID,建筑名称,建筑等级,建筑功能。

其中,地图表确定城市的位置,城市表确定城市的相关数据以及所有人,建筑表内的多条信息属于某一个城市。

建表后,显示出来。
一个for循环。把地图表整个取出来就ok。
跟普通网站的新闻列表没太大区别。不同的是,你需要取得X坐标和Y坐标定位。可以用tabel也可以用div。


class Map//地图类
{
var $Map_ID;
function Map_bg_css($Map_ID) {

$this->Map_ID = $Map_ID;

mysql_select_db($db_name,$link);
$sql="select * from map where Map_ID='".$this->Map_ID."' limit 1";
$result=mysql_query($sql,$link);
echo '<Style type='.'text'.'/'.'css>';
$rs=mysql_fetch_array($result);

echo "#map{";
echo "position:absolute;";
echo "width:".$rs[X坐标]."px;";
echo "height:".$rs[Y坐标]."px;";
echo "z-index:0;";
echo "left:0px;top:0px;}";

}

function Map_bg($Map_ID){

$this->Map_ID = $Map_ID;

$sql="select * from map where Map_ID='".$this->Map_ID."'";
$result=mysql_query($sql,$link);
while($rs=mysql_fetch_array($result))
{
echo "
";
echo "
";

}

}
}

上面是一个很简单的地图类。代码可能不太正确,意思是正确的。就是根据map表中的坐标,生成了一组div层,以及这一组层的css。
你可以改为table的。你可以也把坐标放到一个字段里,用数组的形式取。

使用的时候,用

new map;
map(N);

其中N是map表里的地图Map_ID.

城市内的建筑也类似。如果要显示出来的话。

2008年10月2日星期四

一周内使你的WordPress Google Page Rank 达到 1

以下是让你的网站的 Google Page Rank 达到 1 的办法,本人测试中。希望大家都可以看看,方法还是基本,最重要的是自己文章的质量,是不?

首先到 Google Analytics 注册一个账户,让 Google 跟踪你的文章。一般 Google robots 会在一两天内爬到你的网站上的。
使用 Google Sitemap plugin for wordpress,我想大家都已经装了这个东西了。
把你的网站添加到 Google Webmaster (如果你已经做了上面的步骤,你应该也会做这一步的)。
把你的网站添加到 Google add URL。
不断更新你的网站内容!拼命的发表文章吧,一天10篇,怎样?是有点累的了。
不断的用 Google 搜索你网站的关键词,直到你的网站名字出现在搜索的最顶部!(汗,这个超累)
注册到 Google Adsense ,然后把广告投放到你的网站上吧。这此广告一般会根据你的网站的关键词进行内容决定的。这也就说你在告诉 Google “我的网站有这些内容,你知道了吧?”
广泛对你发表的文章进行推介,吸引更多的眼球!
接着还是对网站的内容进行更新,更新,再更新……
时常关注你的 PageRank 排名,以此努力……
希望这些方法能对你有点帮助吧。

Delphi用拼音首字符序列实现检索功能

在日常工作和生活中我们经常使用电子记事本查找个人通讯录信息,或在单位的应用程序中查询客户档案或业务资料,这个过程中往往需要输入大量的汉字信息,对于熟悉计算机的人这已经是一件头疼的事,那些不太熟悉计算机或根本不懂汉字输入的用户简直就望而生畏。作为对数据检索技术的一种新的尝试,作者探索使用汉字拼音的首字符序列作为检索关键字,这样,用户不必使用汉字,只须简单地键入要查询信息的每个汉字的拼音首字符即可。比如你想查找关键字“中国人民银行”,你只需要输入“zgrmyh”。作者希望通过下面的例子,为广大计算机同行起一个抛砖引玉的作用,让我们开发的程序更加便捷、好用。

原理很简单,找出汉字表中拼音首字符分别为“A”至“Z”的汉字内码范围,这样,对于要检索的汉字只需要检查它的内码位于哪一个首字符的范围内,就可以判断出它的拼音首字符。

程序更简单,包括3个控件:一个列表存放着所有待检索的信息;一个列表用于存放检索后的信息;一个编辑框用于输入检索关键字(即拼音首字符序列)。详细如下:

1.进入Delphi创建一个新工程:Project1

2.在Form1上创建以下控件并填写属性:

控件类型 属性名称 属性值
Edit Name Search
ListBox Name SourceList
Items 输入一些字符串,如姓名等,用于提供检索数据
ListBox Name ResultList



3.键入以下两个函数

// 获取指定汉字的拼音索引字母,如:“汉”的索引字母是“H”
function GetPYIndexChar( hzchar:string):char;
begin
case WORD(hzchar[1]) shl 8 + WORD(hzchar[2]) of
$B0A1..$B0C4 : result := 'A';
$B0C5..$B2C0 : result := 'B';
$B2C1..$B4ED : result := 'C';
$B4EE..$B6E9 : result := 'D';
$B6EA..$B7A1 : result := 'E';
$B7A2..$B8C0 : result := 'F';
$B8C1..$B9FD : result := 'G';
$B9FE..$BBF6 : result := 'H';
$BBF7..$BFA5 : result := 'J';
$BFA6..$C0AB : result := 'K';
$C0AC..$C2E7 : result := 'L';
$C2E8..$C4C2 : result := 'M';
$C4C3..$C5B5 : result := 'N';
$C5B6..$C5BD : result := 'O';
$C5BE..$C6D9 : result := 'P';
$C6DA..$C8BA : result := 'Q';
$C8BB..$C8F5 : result := 'R';
$C8F6..$CBF9 : result := 'S';
$CBFA..$CDD9 : result := 'T';
$CDDA..$CEF3 : result := 'W';
$CEF4..$D188 : result := 'X';
$D1B9..$D4D0 : result := 'Y';
$D4D1..$D7F9 : result := 'Z';
else
result := char(0);
end;
end;
// 在指定的字符串列表SourceStrs中检索符合拼音索引字符串
PYIndexStr的所有字符串,并返回。
function SearchByPYIndexStr
( SourceStrs:TStrings;
PYIndexStr:string):string;
label NotFound;
var
i, j :integer;
hzchar :string;
begin
for i:=0 to SourceStrs.Count-1 do
begin
for j:=1 to Length(PYIndexStr) do
begin
hzchar:=SourceStrs[i][2*j-1]
+ SourceStrs[i][2*j];
if (PYIndexStr[j]<>'?') and
(UpperCase(PYIndexStr[j]) <>
GetPYIndexChar(hzchar)) then goto NotFound;
end;
if result=' then result := SourceStrs[i]
else result := result + Char
(13) + SourceStrs[i];
NotFound:
end;
end;



4.增加编辑框Search的OnChange事件:

procedure TForm1.SearchChange(Sender: TObject);
var ResultStr:string;
begin
ResultStr:=';
ResultList.Items.Text := SearchByPYIndexStr
(Sourcelist.Items, Search.Text);
end;



5.编译运行后

在编辑框Search中输入要查询字符串的拼音首字符序列,检索结果列表ResultList就会列出检索到的信息,检索中还支持“?”通配符,对于难以确定的的文字使用“?”替代位置,可以实现更复杂的检索。

本程序在Delphi4.0中编译运行通过。

2008年9月15日星期一

PHP防刷新

session_start();
$k=$_GET['k'];
$t=$_GET['t'];
$allowTime = 1800;//防刷新时间
$ip = get_client_ip();
$allowT = md5($ip.$k.$t);
if(!isset($_SESSION[$allowT]))
{
$refresh = true;
$_SESSION[$allowT] = time();
}elseif(time() - $_SESSION[$allowT]>$allowTime){
$refresh = true;
$_SESSION[$allowT] = time();
}else{
$refresh = false;
}
?>

ASP防刷新重复提交、防后退方法

提交后禁用提交按钮(大部分人都是这样做的)

如果客户提交后,按F5刷新怎么办?

使用Session

在提交的页面也就是数据库处理之前:



if session("ok")=true then
response.write "错误,正在提交"
response.end
end if

数据处理完后,修改session("ok")=false。

数据处理成功马上Redirect到另外一个页面

操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。

缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。)

如果客户按后退,怎么办?

防止网页后退--禁止缓存

我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了

ASP:
Response.Buffer = True
Response.ExpiresAbsolute = Now() - 1
Response.Expires = 0
Response.CacheControl = "no-cache"
ASP.NET:
Response.Buffer=true;
Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1);
Response.Expires=0;
Response.CacheControl="no-cache";
究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”

遗憾的是,我们无法禁用浏览器的后退按钮。

防止网页后退--新开窗口

用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close();
简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?

呵呵,罗嗦了一堆废话,知道怎么处理了么?混合运用客户端脚本和服务器端脚本。

Discuz 通行证的制作方法和详细说明

通行证是个大题目,说白了也就是如何维护客户的会话,在php中所能用的方法无非几种:

● Cookie
● Session
● POST或GET的方法传值

一般中小型的单服务器应用程序站点,如Discuz论坛,采用的cookie+session+mysql的方法来维持用户会话。

考虑到网站规模和复杂性,例如多台服务器多个应用程序,例如163的通行证系统,登陆成功后会在客户端写一个cookie,里面保存用户名等信息。其他应 用程序,都是通过读取这个Cookie重新将客户带入自己的会话中,重而实现通行证功能。163的这种做法不失为一种好办法。

Discuz! Passport 接口技术文档


从 Discuz! 4.0.0 版本开始,Discuz! 内嵌了一个独特的 Passport(通行证) 接口,利用此接口,用户将很容易将论坛与其他应用程序整合,而实现统一登录与退出、用户数据共享、积分同步等功能。可以整合的应用程序包括内容管理系统(CMS)、商城系统、游戏系统等等,如您对这方面功能有兴趣或有需求,请继续阅读本文档。

Discuz! Passport 的优点

Discuz! Passport 系统使用了 Discuz! 独有的技术,并不等同于以往使用过的一些方法,与传统的实现方式相比,具备(不限于)以下优势:


基于私有密匙的低相关性可逆加密算法,配合 MD5 校检码技术,使得暴力破解或伪造几乎不可能。
应用程序可与论坛放置于不同的服务器及不同的域名下。可基于不同操作系统、不同程序语言和不同数据库平台,具备真正的平台无关性。
不需要任何形式的数据库连接、或强制把两套应用程序的数据放在同一数据库甚至同一数据表中。论坛与应用程序都有各自的用户数据表,只是在需要时进行无缝同步操作。
对应用程序的代码改动简便易行,可最快速的完成应用程序与论坛间的整合。
Discuz! Passport 的局限

您在开始利用 Discuz! Passport 进行二次开发时,需要了解这个系统的局限性,以对未来的工作进行正确的评估与安排。

只能工作在用户密码不加密、可逆加密或 MD5 加密的情况下,否则论坛后台无法登录。
只能与一种应用程序关联,即二方关联。不能实现三方关联或与更多的应用程序进行关联。
应用程序需具有独立的注册、登录、退出页面和链接,否则需要自行修改论坛中的相应表单或程序。
由于论坛的注册人数可能很多,例如百万级以上,且应用程序和论坛间的用户数据是同步的,因此要求应用程序能够稳定的负载大量用户的访问。


Discuz! Passport 原理与流程


假设已设置如下变量或参数

挂接 Discuz! Passport 的应用程序假设为一套 PHP 语言编写的 CMS 系统
Discuz! 的 URL 为 http://www.myforums.com
应用程序的 URL 为 http://www.mywebsite.com
应用程序的注册页面为 http://www.mywebsite.com/register.php
应用程序的登录页面为 http://www.mywebsite.com/login.php?action=login
应用程序的退出页面为 http://www.mywebsite.com/login.php?action=logout
开启通行证后的用户登录流程


如果用户在论坛点击“登录”,则转向到事先设置好的应用程序登录页面(http://www.mywebsite.com/login.php?action=login),并在登录页面的 URL 中加入参数 forward(加入 forward 后的链接例如 http://www.mywebsite.com/login.p ... orums.com/index.php),用于在登录后将用户导向到指定的 URL。


应用程序收到此请求后,按照惯例生成表单,并增加一个表单变量 ,将 GET 方式传递过来的 forward 参数通过表单进行传递。


用户在应用程序的表单中填写登录信息,并提交到应用程序的登录验证程序。应用程序验证用户提交的用户名和密码的合法性:


如果不通过:提示用户名密码错误,要求其返回上一页重新填写。


如果通过,需要进行如下操作:


设置自身 Cookie 或 Session,使得应用程序自身处于登录状态。


检查表单中是否提交了 forward 变量,如有,则意味着登录请求可能是由论坛而来,将此变量传递到后面的请求中;如没有,自行生成 forward 变量,使得论坛登录后能够跳转回到应用程序中。


通过 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz') 的方式,将登录请求传递到论坛进行处理。其中 auth 用来将用户信息与资料以特定的格式,加密传递给论坛,forward 用于告知论坛 Passport API 完成自身操作后转向到的 URL 地址,verify 用于验证前面两个变量的有效性。auth、forward、verify 格式与结构将在后面进行说明。



Discuz! Passport API 在接收到由应用程序通过 header() 提交过来的请求后,进行如下操作:


根据 verify 判断 auth 和 forward 变量是否合法,如合法则继续,否则终止。


将 auth 根据既定算法解密,并还原成数组,数组的内容与格式将在后面进行说明。根据数组中的内容,检查此用户是否存在。如存在,则根据上述数组中的内容 UPDATE 论坛中相应的用户资料;如不存在,则使用数组中的信息 INSERT 到论坛用户资料表中。


论坛设置 Cookie 或 Session,使得论坛自身处于登录状态。


根据应用程序反馈的 forward 值,通过 header('Location: http://xxx') 的形式将页面跳转到 forward 变量指定的 URL。



至此,登录流程结束
开启通行证后的用户退出流程


如果用户在论坛点击“退出”,则转向到事先设置好的应用程序退出页面(http://www.mywebsite.com/login.php?action=logout),并在登录页面的 URL 中加入参数 forward(例如 http://www.mywebsite.com/login.p ... orums.com/index.php),用于在退出后将用户导向到指定的 URL。


应用程序收到此请求后,清除自身 Cookie 或 Session,使得应用程序自身处于非登录状态。


检查是否提交了 forward 变量,如有,则意味着登录请求可能是由论坛而来,将此变量传递到后面的请求中;如没有,自行生成 forward 变量,使得论坛登录后能够跳转回到应用程序中。


通过 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz') 的方式,将退出请求传递到论坛进行处理。其中 forward 用于告知论坛 Passport API 完成自身操作后转向到的 URL 地址,verify 用于验证 forward 变量的有效性。forward、verify 格式与结构将在后面进行说明。


Discuz! Passport API 在接收到由应用程序通过 header() 提交过来的请求后,进行如下操作:


根据 verify 判断 forward 变量是否合法,如合法则继续,否则终止。


清楚论坛的 Cookie 或 Session,使得论坛自身处于非登录状态。


根据应用程序反馈的 forward 值,通过 header('Location: http://xxx') 的形式将页面跳转到 forward 变量指定的 URL。



至此,退出流程结束。
开启通行证后的用户注册流程


如果用户在论坛点击“注册”,则转向到事先设置好的应用程序注册页面(http://www.mywebsite.com/register.php),并在注册页面的 URL 中加入参数 forward(例如 http://www.mywebsite.com/registe ... orums.com/index.php),用于在注册后将用户导向到指定的 URL


应用程序收到此请求后,按照惯例生成表单,并增加一个表单变量 ,将 GET 方式传递过来的 forward 参数通过表单进行传递


用户在应用程序的表单中填写注册信息,并提交到应用程序的注册验证程序。应用程序验证用户提交信息的完整性和合法性:


如果不通过:提示其问题所在,要求其返回上一页重新填写


如果通过,需要进行如下操作:


将用户资料插入到应用程序自身用户数据库中


设置自身 Cookie 或 Session,使得应用程序自身处于登录状态

检查表单中是否提交了 forward 变量,如有,则意味着注册请求可能是由论坛而来,将此变量传递到后面的请求中;如没有,自行生成 forward 变量,使得论坛注册后能够跳转回到应用程序中


通过 header('Location: http://www.myforums.com/api/pass ... /yyy&verify=zzz') 的方式,将注册请求传递到论坛进行处理。其中 auth 用来将用户信息与资料以特定的格式,加密传递给论坛,forward 用于告知论坛 Passport API 完成自身操作后转向到的 URL 地址,verify 用于验证前面两个变量的有效性。auth、forward、verify 格式与结构将在后面进行说明



Discuz! Passport API 在接收到由应用程序通过 header() 提交过来的请求后,进行如下操作:


根据 verify 判断 auth 和 forward 变量是否合法,如合法则继续,否则终止


将 auth 根据既定算法解密,并还原成数组,数组的内容与格式将在后面进行说明。根据数组中的内容,检查此用户是否存在。如存在,则根据上述数组中的内容 UPDATE 论坛中相应的用户资料;如不存在,则使用数组中的信息 INSERT 到论坛用户资料表中


论坛设置 Cookie 或 Session,使得论坛自身处于登录状态


根据应用程序反馈的 forward 值,通过 header('Location: http://xxx') 的形式将页面跳转到 forward 变量指定的 URL



至此,注册流程结束
本部分中,加下划线显示的部分,是需要对您的应用程序进行更改的部分,事实上,这部分更改会非常容易和方便。


Discuz! Passport 参数规格与加密方式


私有密匙(passport_key)

由于一些关键参数采用了 GET 方式进行传递,即便两次 header 跳转并不会直接将链接显示在外面,但我们仍然对关键的参数进行了加密,私有密匙共有两个作用:其一是供下面提到的可逆加密算法(AzDGCrypt)进行 数据的加解密;其二是生成不可逆验证字串(verify),以防止关键信息被伪造。

在启用 Discuz! Passort 后,您需要在应用程序和 Discuz! 后台配置两处私有密匙,这两处的内容必须完全相同,这样应用程序和论坛之间才能正常通信。私有密匙决定了加密算法的强度,因此密匙长度请不要小于 10 个字节,并包含字母、数字和符号,以保证系统的安全。

加密算法

Discuz! Passport 采用 Azerbaijan Development Group(AzDG)开发的可逆加密算法 AzDGCrypt 对用户资料进行加密。如提供正确的私有密匙,可通过本加密算法对数据进行加密及解密,因此只要保证私有密匙的保密性,即可确保数据传递过程中的安全。以下 为 Discuz! Passport 中应用到的可逆加密算法,为了生成可以被 Discuz! Passport 正确解密的 auth 字串,需要将如下函数放置于应用程序中,并可在登录及注册时调用。

passport_encrypt()是加密函数,用法为 passport_encrypt($txt, $key),其中 $txt 是待加密的字串,$key 是私有密匙。
passport_decrypt()是解密函数,用法为 passport_decrypt($txt, $key),其中 $txt 是加密后的字串,$key 是私有密匙。


/**
* Passport 加密函数
*
* @param string 等待加密的原字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 原字串经过私有密匙加密后的结果
*/
function passport_encrypt($txt, $key) {

// 使用随机数发生器产生 0~32000 的值并 MD5()
srand((double)microtime() * 1000000);
$encrypt_key = md5(rand(0, 32000));

// 变量初始化
$ctr = 0;
$tmp = '';

// for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
for($i = 0; $i < strlen($txt); $i++) {
// 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
// $tmp 字串在末尾增加两位,其第一位内容为 $encrypt_key 的第 $ctr 位,
// 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
}

// 返回结果,结果为 passport_key() 函数返回值的 base65 编码结果
return base64_encode(passport_key($tmp, $key));

}

/**
* Passport 解密函数
*
* @param string 加密后的字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 字串经过私有密匙解密后的结果
*/
function passport_decrypt($txt, $key) {

// $txt 的结果为加密后的字串经过 base64 解码,然后与私有密匙一起,
// 经过 passport_key() 函数处理后的返回值
$txt = passport_key(base64_decode($txt), $key);

// 变量初始化
$tmp = '';

// for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
for ($i = 0; $i < strlen($txt); $i++) {
// $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
// 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1
$tmp .= $txt[$i] ^ $txt[++$i];
}

// 返回 $tmp 的值作为结果
return $tmp;

}

/**
* Passport 密匙处理函数
*
* @param string 待加密或待解密的字串
* @param string 私有密匙(用于解密和加密)
*
* @return string 处理后的密匙
*/
function passport_key($txt, $encrypt_key) {

// 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
$encrypt_key = md5($encrypt_key);

// 变量初始化
$ctr = 0;
$tmp = '';

// for 循环,$i 为从 0 开始,到小于 $txt 字串长度的整数
for($i = 0; $i < strlen($txt); $i++) {
// 如果 $ctr = $encrypt_key 的长度,则 $ctr 清零
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
// $tmp 字串在末尾增加一位,其内容为 $txt 的第 $i 位,
// 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
}

// 返回 $tmp 的值作为结果
return $tmp;

}

/**
* Passport 信息(数组)编码函数
*
* @param array 待编码的数组
*
* @return string 数组经编码后的字串
*/
function passport_encode($array) {

// 数组变量初始化
$arrayenc = array();

// 遍历数组 $array,其中 $key 为当前元素的下标,$val 为其对应的值
foreach($array as $key => $val) {
// $arrayenc 数组增加一个元素,其内容为 "$key=经过 urlencode() 后的 $val 值"
$arrayenc[] = $key.'='.urlencode($val);
}

// 返回以 "&" 连接的 $arrayenc 的值(implode),例如 $arrayenc = array('aa', 'bb', 'cc', 'dd'),
// 则 implode('&', $arrayenc) 后的结果为 ”aa&bb&cc&dd"
return implode('&', $arrayenc);

}




passport_encode()是将数组转换合成为字串形式存储的函数:变量名和数值之间用等号连接,如果数值包含特殊字符,使用 urlencode() 将其转码;多个变量间使用 & 分割。例如原始数组内容为 array('username' => 'abc', 'email' => 'my+discuz@gmail.com'),经过 passport_encode() 编码后结果为 username=abc&email=my%2Bdiscuz%40gmail.com。

信息字串(auth)

应用程序在收到登录或注册请求,并读取到用户资料后,请按如下的要求将用户资料及部分其他信息存放于一个数组之中。数组各键值的含义为:



cookietime
应用程序保存该用户登录记录的时间,可为非负整数,单位秒,Discuz! Passport 收到此参数后,会设置同样的 Cookie 过期时间,这样应用程序和论坛可以保证同样的登录有效性。如不传递此参数,或参数数值不正确,则 Discuz! Passport 按照 0 设置 Cookie 有效期。


time
应用程序所在服务器当前时间(9 或 10 位数字 Unix Timestamp),此参数用于 Discuz! 所在服务器当前时间进行比对,如果早于当前时间超过若干秒(取决于 Discuz! Passport 中的“验证字串有效期”设定),则视为本 auth 内容无效,避免此URL被人得知后可能的安全问题。


username
用户登录或注册的用户名。Discuz! 的注册用户名规则为:
长度 1~15 个字符,不得为空
不得为 c:concon、游客(gb2312 或 big5 内码)、Guest
不得包含 (,)、(*)、(")、([TAB])、([SPACE])、([r])、([n])、(<)、(>)、(&)其中之一

如果应用程序提交过来的用户名不符合上述规则,Passport 将自动去处其中的特殊字符,将过滤后的结果写入数据库中。


password
用户密码经 MD5 不可逆加密后的值。如果此密码使用非 MD5 加密,则应用程序和 Passport 不能正常关联和使用。


email
用户 Email 地址(50 个字节以内)。


isadmin
当前用户是否是应用程序的最高管理员,1=是,0=否。最高管理员的权限,将同步到论坛中去,其他下级管理员的身份将不进行同步,而由最高管理员分别在不同的系统中进行设置。

credits
当前用户在应用程序中的积分值,范围 -2147483648 到 2147483647,如果 Discuz! Passport 中设置了目标积分项,则用户登录时,Passport 会把应用程序传递过来的 credits 值同步到指定的论坛的指定积分项目中


gender
当前用户的性别,1=男,2=女,0=未知。


bday
当前用户的生日,格式 yyyy-mm-dd。


regip
当前用户注册时的 IP 地址。


regdate
当前用户注册的时间(9 或 10 位数字 Unix Timestamp)。


nickname
当前用户的昵称(30 个字节以内,如传递此参数,必须打开相应用户组的昵称权限,否则用户在控制面板中提交个人资料时,会导致昵称失效)。


site
当前用户的主页地址(包含http://)。


qq
当前用户的 QQ 号码。


ICQ
当前用户的 ICQ 账号。


msn
当前用户的 MSN Messenger 账号。


yahoo
当前用户的 Yahoo! Messanger 账号。
以上参数中,以黑体下划线显示的 time、username、password、email 是必须传递的参数,缺少上述参数 Passport 将无法正常工作;其他的参数是可选的,如果不传递某些参数,则 Passport 会进行识别,自动不更新没有传递的参数所在的字段;所有数值,请提供原始值,而非经过反斜线转义(addslashes)后的结果。

把上述信息存放于数组中,假定为如下的形式:


$member = array
(
'cookietime' => 31536000,
'time' => 1117415922,
'username' => 'Abcd',
'password' => 'e2fc714c4727ee9395f324cd2e7f331f',
'email' => 'abcd@efgh.com',
'credits' => 123,
'regip' => '210.120.222.111',
'regdate' => '1012752000',
'msn' => 'email@hotmail.com'
);




将其经过如下的加密变换,即可得到 auth 的值:


$auth = passport_encrypt(passport_encode($member), $passport_key);




其中,passport_encode() 在前文已做了说明,用于将数组内容存放于特定的格式,$passport_key 是私有密匙。

切记:由于 $auth 中可能含有等号、加号等特殊字符,请将 $auth 经过 rawurlencode() 编码后再在 URL 中传递,否则可能会产生问题。

导向字串(forward)

导向字串用于通知 Discuz! Passport 在完成自身操作后,返回到哪一个 URL 地址,例如 http://www.myforums.com/forumdisplay.php?fid=2。如果 forward 为空,则默认导向到应用程序的首页

切记:由于 $forward 中可能含有冒号、问号、等号等特殊字符,请将 $forward 经过 rawurlencode() 编码后再在 URL 中传递,否则可能会产生问题。

验证字串(verify)

验证字串用户检验 auth 和 forward 两个参数的合法性,避免非法构造参数进行破坏的可能。无论 auth 和 forward 变量是否存在,验证字串(verify)的值均为:


$verify = md5($action.$auth.$forward.$passport_key);




其中,$action 是当前执行的 Passport 操作,如 login 等等;$auth 是用户信息加密后,并经 rawurlencode() 之前的内容;$forward 是经 rawurlencode() 前的导向字串;$passport_key 是私有密匙。如果 verify 的值不匹配,则 Passport 拒绝进行下一步操作。


Discuz! Passport 设置与启用


内置关联

Discuz! 以战略合作的方式,与业内知名的产品实现了 Passport 关联,目前内置了 SiteEngine 建站引擎(http://www.siteengine.net)和 Shopex 通用型网上商店系统(http://www.shopex.cn)的相关接口,这样用户只须透过在两套软件中简单的设置,即可开启这些关联。

其他应用程序

由于 Discuz! Passport 的高可扩展性和平台无关性,使得您可以参照前文的说明,稍稍改动小部分的代码,便将任何 B/S 模式的应用程序与 Discuz! 进行关联。

参数设置

您可以在 Discuz! 系统设置中,看到相应的通行证设置功能,在 Discuz! 合作伙伴的软件中,也可以找到这些设置入口。相关的操作已比较简单,在此不再详细叙述。

特别说明

如果您先运营了论坛,后与其他应用程序启用了 Passport 关联,由于之前论坛中的用户数据没有同步,您需要先写一个导入程序,将论坛的用户数据导入到应用程序的用户表中,否则以往在论坛注册的用户将无法通过 Passport 登录。已成功关联后新注册的用户无此问题。

在开启了 Discuz! 通行证后,您仍然可以通过 logging.php?action=login 这个链接来登录论坛,以备调试之用,但页面上显示的链接将改为应用程序的登录 URL。注意:开启通行证后,建议您通过 Discuz! 选项关闭论坛本身的注册功能,以免用户通过论坛注册而产生无法同步的问题。

您可以在 Discuz! 的 api/passport.php 找到 Discuz! Passport 的全部源程序,您也许通过他更好的理解 Passport 的原理,更快的完成应用程序与 Discuz! 之间的整合。


典型错误提示


Illegal request

非法请求,当验证字串 verify 不匹配时会产生此提示。可能是应用程序与 Discuz! 配置的私有密匙不同,或是通过 URL 传递前,未将必要的参数(如 auth、forward 等)进行 URL 编码,也有可能是使用了经过 URL 编码的参数值用来计算 verify 的 md5 值造成。以 PHP 语言为例,正确的代码应当是类似于的如下的格式:


$action = 'login';
$auth = passport_encrypt(passport_encode($autharray), $passport_key);
$forward = 'http://www.discuz.net/index.php';
$verify = md5($action.$auth.$forward.$passport_key);

header("Location: http://www.discuz.net/api/passport.php".
"?action=$action".
"&auth=".rawurlencode($auth).
"&forward=".rawurlencode($forward).
"&verify=$verify");


Lack of required parameters

auth 内容解密后,缺少必要的信息 time、username、password、email。

Request expired

请求过期。当前服务器时间与应用程序提交过来的 time 之差大于 Discuz! Passport 中设置的请求有效期。可能是使用以往的代码非法尝试,也可能是由于应用程序和 Discuz! 论坛所在的两台服务器,时间设置有误造成。

Invalid action

没有指定 Passport 所执行的 action。

2008年9月9日星期二

JSP应用语法详解大全3

12)标签:
id="beanInstanceName"
scope="page | request | session | application"
{
class="package.class" |
type="package.class" |
class="package.class" type="package.class" |
beanName="{package.class | }" type="package.class"
}
/>other elements
用于创建一个JavaBeans组件,首先会试图定位一个Bean实例,如果不存在,那么就会从创建一个新的.
属性:
-id="创建的Bean变量名称"
在你所定义的范围中确认Bean的变量,你能在后面的程序中使用此变量名来分辨不同的Bean 这个变量名对大小写敏感,如果这个Bean已经在别的中创建,那么这个id的值必须与原来的那个id值一致.
-scope="page | request | session | application"Bean存在的范围以及id变量名的有效范围.缺省值是page.
13)标签:
type="bean | applet"
code="classFileName"
codebase="classFileDirectoryName"
[ name="instanceName" ]
[ archive="URIToArchive, ..." ]
[ align="bottom | top | middle | left | right" ]
[ height="displayPixels" ]
[ width="displayPixels" ]
[ hspace="leftRightPixels" ]
[ vspace="topBottomPixels" ]
[ jreversion="JREVersionNumber | 1.1" ]
[ nspluginurl="URLToPlugin" ]
[ iepluginurl="URLToPlugin" ] >
[
[
[ ]
[ text message for user ]
用于在浏览器中播放或显示一个对象(典型的就是applet和Bean),而这种显示需要在浏览器的java插件.当Jsp文件被编译,送往浏览器时,标签将会根据浏览器的版本替换成
或者元素.注意用于HTML 4.0 ,用于HTML 3.2.一般来说,这个标签会指定对象是Applet还是Bean,同样也会指定class的名字,还有位置,另外还会指定将从哪里下载这个Java插件.
属性:
-type="bean | applet"将被执行的插件对象的类型,你必须得指定这个是Bean还是applet,因为这个属性没有缺省值.
-code="classFileName"将会被Java插件执行的Java Class的名字,必须以.class结尾,这个文件必须存在于codebase属性指定的目录中.
-codebase="classFileDirectoryName"
将会被执行的Java Class文件的目录(或者是路径),如果你没有提供此属性,使用本标签的JSP文件的目录会被使用.
-name="instanceName"
这个Bean或applet实例的名字,它将会在Jsp其它的地方调用.
-archive="URIToArchive, ..."
一些由逗号分开的路径名,这些路径名用于预装一些将要使用的class,这会提高applet的性能.类似于classpath.
-align="bottom | top | middle | left | right"
图形,对象,Applet的位置.

JSP应用语法详解大全2

8)标签:
转发一个request对象.可以传参,目标文件必须能够处理参数.如果使用非缓冲输
出,而且在使用之前,jsp文件已经有了数据,那么文件执行就会出错.
属性:
-page="URL or 表达式"要转发的文件URL或者是一个代表URL的表达式.
-name参数名value参数值.
9)标签:
+
允许包含动态文件和静态文件,动态的会被Jsp编译器执行.不能从文件名上判断是动态的还是静态的.可以传递参数.
属性:
-page="URL or 表达式"要包含文件的相对路径,或者是代表相对路径的表达.式.
-flush="true"这里你必须使用flush="true",你不能使用false值.缺省值为false.
能传递一个或多个参数给动态文件,能在一个页面中使用多个来传递多个参数.

10)标签:
获得Bean的属性值之前,必须用创建Bean.name指定新建Bean的id.只能JavaBean
属性:
-name="bean的名字"由的id属性指定.
-property="bean的属性"所指定的Bean的属性名.

11)标签:
name="Bean的id"
{
property= "*"
property="propertyName" [ param="parameterName" ]
property="propertyName" value="{string | }"
}/>
的name的值应当于中id的值
多种方法来设定属性值 :
通过用户输入的所有值(被做为参数储存中request对象中)来匹配Bean中的属性
通过用户输入的指定的值来匹配Bean中指定的属性
在运行时使用一个表达式来匹配Bean的属性
属性:
-name="Bean名称"表示已经在中的id设置的Bean变量.
-property="Bean属性名" value="要设置的属性名"如果你使用了property="*",那么Bean的属性没有必要按Html表单中的顺序排序.
-property="*"储存用户在Jsp输入的所有值,用于匹配Bean中的属性.在Bean中的属性的名字必须和request对象中的参数名一致.从客户传到服器上的参数值一般都是字符类型,这些字符串为了能够在Bean中匹配就必须转换成其它的类型,下面的表中列出了Bean属性的类型以及他们的转换方法.把字符串转化为其它
类型的方法,Property 类型方法:
boolean or Boolean
java.lang.Boolean.valueOf(String)
byte or Byte
java.lang.Byte.valueOf(String)
char or Character
java.lang.Character.valueOf(String)
double or Double
java.lang.Double.valueOf(String)
integer or Integer
java.lang.Integer.valueOf(String)
float or Float
java.lang.Float.valueOf(String)
long or Long
java.lang.Long.valueOf(String)

JSP应用语法详解大全1

1)HTML注释:
可以用注释内容,也可以用表达式.
2)隐藏注释:
注释会被JSP编译时被忽略.编译器不会对之间的语句编译,它不会显示在客户的浏览器和源代码中.

3)声明:
声明你将要在JSP程序中用到的变量和方法.可以一次性声明多个变量和方法,要以";"结尾,声明在Java中要合法.

4)表达式:
JAVA中的表达式,会被显示在JSP页面中,注意不要有";".

5)JAVA代码:
包含有效JAVA代码.

6)Include指令:

可以包含HTML,JSP,文本文件,JAVA代码,要注意在这个包含文件中不能使用有时会导致错误.
属性:
file指相对路径,如:"error.jsp""templates/onlinestore.html""/beans/calendar.jsp"
如果这个路径以"/"开头,那么这个路径主要是参照JSP应用的上下关系路径,如果路径是以文件名或目录名开头,那么这个路径就是正在使用的JSP文件的当前路径.

7)Page指令:
属性:
-language="java"
声明脚本语言的种类,暂时只能用"java"
-extends="package.class"
继承一个类
-import="{package.class | package.* }, ..."
导入一个包,下面的包是默认自动导入的.
java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*
-session="true | false"
是否允许session会话,默认true.
-buffer="none | 8kb | sizekb"
设置缓冲区大小默认值是8kb,none是关闭缓冲区,sizekb是自己设置大小.
-autoFlush="true | false"
是否刷新缓冲区,true(缺省值)输出正常,false这个buffer溢出,就会导致一个错误,buffer设置为none,就要把这个设置为false.
-isThreadSafe="true | false"
设置Jsp文件是否能多线程使用。缺省值是true.
-info="text"
就是JSP的一些信息,能够使用Servlet.getServletInfo方法取回.
-errorPage="relativeURL"
指定接收Exception对象的JSP页面的URL.
-isErrorPage="true | false"
设置是否接收一个Exception对象.
-contentType="text/html;charset=ISO-8859-1"
设置页面类型和字符集.缺省类型是:text/html,缺省字符集为 ISO-8859-1.

JSP 汉字转拼音

<%...@ page language="java" import="java.util.*" contentType="text/html; charset=GBK" %>
<%...!
Hashtable ht=new Hashtable(10);
String g(Integer n){
int num=n.intValue();
if(num>0&&num<160){
return String.valueOf((char)num);
}
else if(num<-20319||num>-10247){
return "";
}
else{
if(ht.size()==0){b();}
while(!ht.containsKey(Integer.toString(num)))num--;
return ht.get(Integer.toString(num)).toString();
}
}
String c(String str){
char[] hz=str.toCharArray();
int len=str.length();
int p,q;
String ret="";
for(int i=0;i p=(int)hz[i];
if(p>160){
q=(int)hz[++i];
p=p*256+q-65536;
}
ret+=g(new Integer(p));
ret=ret+""+String.valueOf(p)+"
";
}
return ret;
}
void b(){
ht.put("-20319","a");
ht.put("-20317","ai");
ht.put("-20304","an");
ht.put("-20295","ang");
ht.put("-20292","ao");
ht.put("-20283","ba");
ht.put("-20265","bai");
ht.put("-20257","ban");
ht.put("-20242","bang");
ht.put("-20230","bao");
ht.put("-20051","bei");
ht.put("-20036","ben");
ht.put("-20032","beng");
ht.put("-20026","bi");
ht.put("-20002","bian");
ht.put("-19990","biao");
ht.put("-19986","bie");
ht.put("-19982","bin");
ht.put("-19976","bing");
ht.put("-19805","bo");
ht.put("-19784","bu");
ht.put("-19775","ca");
ht.put("-19774","cai");
ht.put("-19763","can");
ht.put("-19756","cang");
ht.put("-19751","cao");
ht.put("-19746","ce");
ht.put("-19741","ceng");
ht.put("-19739","cha");
ht.put("-19728","chai");
ht.put("-19725","chan");
ht.put("-19715","chang");
ht.put("-19540","chao");
ht.put("-19531","che");
ht.put("-19525","chen");
ht.put("-19515","cheng");
ht.put("-19500","chi");
ht.put("-19484","chong");
ht.put("-19479","chou");
ht.put("-19467","chu");
ht.put("-19289","chuai");
ht.put("-19288","chuan");
ht.put("-19281","chuang");
ht.put("-19275","chui");
ht.put("-19270","chun");
ht.put("-19263","chuo");
ht.put("-19261","ci");
ht.put("-19249","cong");
ht.put("-19243","cou");
ht.put("-19242","cu");
ht.put("-19238","cuan");
ht.put("-19235","cui");
ht.put("-19227","cun");
ht.put("-19224","cuo");
ht.put("-19218","da");
ht.put("-19212","dai");
ht.put("-19038","dan");
ht.put("-19023","dang");
ht.put("-19018","dao");
ht.put("-19006","de");
ht.put("-19003","deng");
ht.put("-18996","di");
ht.put("-18977","dian");
ht.put("-18961","diao");
ht.put("-18952","die");
ht.put("-18783","ding");
ht.put("-18774","diu");
ht.put("-18773","dong");
ht.put("-18763","dou");
ht.put("-18756","du");
ht.put("-18741","duan");
ht.put("-18735","dui");
ht.put("-18731","dun");
ht.put("-18722","duo");
ht.put("-18710","e");
ht.put("-18697","en");
ht.put("-18696","er");
ht.put("-18526","fa");
ht.put("-18518","fan");
ht.put("-18501","fang");
ht.put("-18490","fei");
ht.put("-18478","fen");
ht.put("-18463","feng");
ht.put("-18448","fo");
ht.put("-18447","fou");
ht.put("-18446","fu");
ht.put("-18239","ga");
ht.put("-18237","gai");
ht.put("-18231","gan");
ht.put("-18220","gang");
ht.put("-18211","gao");
ht.put("-18201","ge");
ht.put("-18184","gei");
ht.put("-18183","gen");
ht.put("-18181","geng");
ht.put("-18012","gong");
ht.put("-17997","gou");
ht.put("-17988","gu");
ht.put("-17970","gua");
ht.put("-17964","guai");
ht.put("-17961","guan");
ht.put("-17950","guang");
ht.put("-17947","gui");
ht.put("-17931","gun");
ht.put("-17928","guo");
ht.put("-17922","ha");
ht.put("-17759","hai");
ht.put("-17752","han");
ht.put("-17733","hang");
ht.put("-17730","hao");
ht.put("-17721","he");
ht.put("-17703","hei");
ht.put("-17701","hen");
ht.put("-17697","heng");
ht.put("-17692","hong");
ht.put("-17683","hou");
ht.put("-17676","hu");
ht.put("-17496","hua");
ht.put("-17487","huai");
ht.put("-17482","huan");
ht.put("-17468","huang");
ht.put("-17454","hui");
ht.put("-17433","hun");
ht.put("-17427","huo");
ht.put("-17417","ji");
ht.put("-17202","jia");
ht.put("-17185","jian");
ht.put("-16983","jiang");
ht.put("-16970","jiao");
ht.put("-16942","jie");
ht.put("-16915","jin");
ht.put("-16733","jing");
ht.put("-16708","jiong");
ht.put("-16706","jiu");
ht.put("-16689","ju");
ht.put("-16664","juan");
ht.put("-16657","jue");
ht.put("-16647","jun");
ht.put("-16474","ka");
ht.put("-16470","kai");
ht.put("-16465","kan");
ht.put("-16459","kang");
ht.put("-16452","kao");
ht.put("-16448","ke");
ht.put("-16433","ken");
ht.put("-16429","keng");
ht.put("-16427","kong");
ht.put("-16423","kou");
ht.put("-16419","ku");
ht.put("-16412","kua");
ht.put("-16407","kuai");
ht.put("-16403","kuan");
ht.put("-16401","kuang");
ht.put("-16393","kui");
ht.put("-16220","kun");
ht.put("-16216","kuo");
ht.put("-16212","la");
ht.put("-16205","lai");
ht.put("-16202","lan");
ht.put("-16187","lang");
ht.put("-16180","lao");
ht.put("-16171","le");
ht.put("-16169","lei");
ht.put("-16158","leng");
ht.put("-16155","li");
ht.put("-15959","lia");
ht.put("-15958","lian");
ht.put("-15944","liang");
ht.put("-15933","liao");
ht.put("-15920","lie");
ht.put("-15915","lin");
ht.put("-15903","ling");
ht.put("-15889","liu");
ht.put("-15878","long");
ht.put("-15707","lou");
ht.put("-15701","lu");
ht.put("-15681","lv");
ht.put("-15667","luan");
ht.put("-15661","lue");
ht.put("-15659","lun");
ht.put("-15652","luo");
ht.put("-15640","ma");
ht.put("-15631","mai");
ht.put("-15625","man");
ht.put("-15454","mang");
ht.put("-15448","mao");
ht.put("-15436","me");
ht.put("-15435","mei");
ht.put("-15419","men");
ht.put("-15416","meng");
ht.put("-15408","mi");
ht.put("-15394","mian");
ht.put("-15385","miao");
ht.put("-15377","mie");
ht.put("-15375","min");
ht.put("-15369","ming");
ht.put("-15363","miu");
ht.put("-15362","mo");
ht.put("-15183","mou");
ht.put("-15180","mu");
ht.put("-15165","na");
ht.put("-15158","nai");
ht.put("-15153","nan");
ht.put("-15150","nang");
ht.put("-15149","nao");
ht.put("-15144","ne");
ht.put("-15143","nei");
ht.put("-15141","nen");
ht.put("-15140","neng");
ht.put("-15139","ni");
ht.put("-15128","nian");
ht.put("-15121","niang");
ht.put("-15119","niao");
ht.put("-15117","nie");
ht.put("-15110","nin");
ht.put("-15109","ning");
ht.put("-14941","niu");
ht.put("-14937","nong");
ht.put("-14933","nu");
ht.put("-14930","nv");
ht.put("-14929","nuan");
ht.put("-14928","nue");
ht.put("-14926","nuo");
ht.put("-14922","o");
ht.put("-14921","ou");
ht.put("-14914","pa");
ht.put("-14908","pai");
ht.put("-14902","pan");
ht.put("-14894","pang");
ht.put("-14889","pao");
ht.put("-14882","pei");
ht.put("-14873","pen");
ht.put("-14871","peng");
ht.put("-14857","pi");
ht.put("-14678","pian");
ht.put("-14674","piao");
ht.put("-14670","pie");
ht.put("-14668","pin");
ht.put("-14663","ping");
ht.put("-14654","po");
ht.put("-14645","pu");
ht.put("-14630","qi");
ht.put("-14594","qia");
ht.put("-14429","qian");
ht.put("-14407","qiang");
ht.put("-14399","qiao");
ht.put("-14384","qie");
ht.put("-14379","qin");
ht.put("-14368","qing");
ht.put("-14355","qiong");
ht.put("-14353","qiu");
ht.put("-14345","qu");
ht.put("-14170","quan");
ht.put("-14159","que");
ht.put("-14151","qun");
ht.put("-14149","ran");
ht.put("-14145","rang");
ht.put("-14140","rao");
ht.put("-14137","re");
ht.put("-14135","ren");
ht.put("-14125","reng");
ht.put("-14123","ri");
ht.put("-14122","rong");
ht.put("-14112","rou");
ht.put("-14109","ru");
ht.put("-14099","ruan");
ht.put("-14097","rui");
ht.put("-14094","run");
ht.put("-14092","ruo");
ht.put("-14090","sa");
ht.put("-14087","sai");
ht.put("-14083","san");
ht.put("-13917","sang");
ht.put("-13914","sao");
ht.put("-13910","se");
ht.put("-13907","sen");
ht.put("-13906","seng");
ht.put("-13905","sha");
ht.put("-13896","shai");
ht.put("-13894","shan");
ht.put("-13878","shang");
ht.put("-13870","shao");
ht.put("-13859","she");
ht.put("-13847","shen");
ht.put("-13831","sheng");
ht.put("-13658","shi");
ht.put("-13611","shou");
ht.put("-13601","shu");
ht.put("-13406","shua");
ht.put("-13404","shuai");
ht.put("-13400","shuan");
ht.put("-13398","shuang");
ht.put("-13395","shui");
ht.put("-13391","shun");
ht.put("-13387","shuo");
ht.put("-13383","si");
ht.put("-13367","song");
ht.put("-13359","sou");
ht.put("-13356","su");
ht.put("-13343","suan");
ht.put("-13340","sui");
ht.put("-13329","sun");
ht.put("-13326","suo");
ht.put("-13318","ta");
ht.put("-13147","tai");
ht.put("-13138","tan");
ht.put("-13120","tang");
ht.put("-13107","tao");
ht.put("-13096","te");
ht.put("-13095","teng");
ht.put("-13091","ti");
ht.put("-13076","tian");
ht.put("-13068","tiao");
ht.put("-13063","tie");
ht.put("-13060","ting");
ht.put("-12888","tong");
ht.put("-12875","tou");
ht.put("-12871","tu");
ht.put("-12860","tuan");
ht.put("-12858","tui");
ht.put("-12852","tun");
ht.put("-12849","tuo");
ht.put("-12838","wa");
ht.put("-12831","wai");
ht.put("-12829","wan");
ht.put("-12812","wang");
ht.put("-12802","wei");
ht.put("-12607","wen");
ht.put("-12597","weng");
ht.put("-12594","wo");
ht.put("-12585","wu");
ht.put("-12556","xi");
ht.put("-12359","xia");
ht.put("-12346","xian");
ht.put("-12320","xiang");
ht.put("-12300","xiao");
ht.put("-12120","xie");
ht.put("-12099","xin");
ht.put("-12089","xing");
ht.put("-12074","xiong");
ht.put("-12067","xiu");
ht.put("-12058","xu");
ht.put("-12039","xuan");
ht.put("-11867","xue");
ht.put("-11861","xun");
ht.put("-11847","ya");
ht.put("-11831","yan");
ht.put("-11798","yang");
ht.put("-11781","yao");
ht.put("-11604","ye");
ht.put("-11589","yi");
ht.put("-11536","yin");
ht.put("-11358","ying");
ht.put("-11340","yo");
ht.put("-11339","yong");
ht.put("-11324","you");
ht.put("-11303","yu");
ht.put("-11097","yuan");
ht.put("-11077","yue");
ht.put("-11067","yun");
ht.put("-11055","za");
ht.put("-11052","zai");
ht.put("-11045","zan");
ht.put("-11041","zang");
ht.put("-11038","zao");
ht.put("-11024","ze");
ht.put("-11020","zei");
ht.put("-11019","zen");
ht.put("-11018","zeng");
ht.put("-11014","zha");
ht.put("-10838","zhai");
ht.put("-10832","zhan");
ht.put("-10815","zhang");
ht.put("-10800","zhao");
ht.put("-10790","zhe");
ht.put("-10780","zhen");
ht.put("-10764","zheng");
ht.put("-10587","zhi");
ht.put("-10544","zhong");
ht.put("-10533","zhou");
ht.put("-10519","zhu");
ht.put("-10331","zhua");
ht.put("-10329","zhuai");
ht.put("-10328","zhuan");
ht.put("-10322","zhuang");
ht.put("-10315","zhui");
ht.put("-10309","zhun");
ht.put("-10307","zhuo");
ht.put("-10296","zi");
ht.put("-10281","zong");
ht.put("-10274","zou");
ht.put("-10270","zu");
ht.put("-10262","zuan");
ht.put("-10260","zui");
ht.put("-10256","zun");
ht.put("-10254","zuo");
ht.put("-10247","zz");
}
%>
<%...
if(request.getParameter("hz")!=null)
{
out.println(c(request.getParameter("hz")));
}
%>

请在此处输入中文:


输入出结果格式是这样的:

如:我输入“请在此处输入中文”

输出结果为:

qing-14357
zai-11046
ci-19253
chu-19290
shu-13596
ru-14101
zhong-10544
wen-12604

关面是拼音 ,后面是算出来的代号(为什么得到这样的数字,我也不知道),如果有时汉字不常用,没有加入,就只会显示出来代号,而不显示拼音,此时,你可以将其加入到里面就行了,格式如:ht.put("-10247","zz");

Delphi实现屏幕抓图技术

  摘 要:本文以Delphi7.0作为开发平台,给出了网络监控软件中的两种屏幕抓图技术的设计方法和步骤。介绍了教师在计算机机房内教学时,如何监控学生计算机显示器上的画面,以保证教学的质量和效果。

  引言

  随着网络技术的飞速发展,计算机网络在各高等院校教学中的使用已非常普遍,但是,我们发现一个问题,在教学的过程中,由于老师是面对着学生,而背对着学生计算机的显示器,不能随时查看学生计算机显示器上的内容,所以,有的学生在教学中偷玩游戏,影响了教学的质量和效果,因此,设计一款网络监控软件,监控学生计算机,十分必要。为了实现这一目的,此系统应具有以下功能:

  (1)教师用机可以循环显示学生计算机的显示器上的画面。

  (2)教师用机可以动态显示某一学生计算机的显示器上的画面。

  (3)教师用机可以对学生用计算机发出警告信息和控制信息。

  (4)学生用计算机开机自动运行服务端监控程序。

  (5)为了防止学生用计算机的服务端监控程序,被学生发现用Ctrl+Alt+Del关闭,在Ctrl+Alt+Del对话框中必须隐藏程序。同时,应该隐藏程序在任务栏的按钮。

  本文结合应用实践,重点向大家介绍在Delphi7.0中可以采用的两种实现屏幕抓图技术的操作方法。

  程序实现

  (1)抓取屏幕图像的难点有两个:一是如何夺取屏幕的句柄,二是知道屏幕句柄后如何获取屏幕的图像。Borland公司的设计人员用画布(Tcanvas)对象封装了Windows的大部分图形输出功能,可以通过它以更直观的方式和Windows的屏幕打交道,而不必关心令人头疼的Windows API函数。具体程序如下:

procedure TForm1.Timer1Timer(Sender:TObject);//抓取屏幕,并保存到Image控件中
var
 Fullscreen:Tbitmap;
 FullscreenCanvas:TCanvas;
 dc:HDC;
begin
 Fullscreen:=TBitmap.Create;
 //创建一个BITMAP来存放图象
 Fullscreen.Width:=screen.width;
 Fullscreen.Height:=screen.Height;
 DC:=GetDC(0); //取得屏幕的DC,参数0指的是屏幕
 FullscreenCanvas:=TCanvas.Create;
 //创建一个CANVAS对象
 FullscreenCanvas.Handle:=DC;
 Fullscreen.Canvas.CopyRect(Rect(0,0,screen.Width,screen.Height),
 fullscreenCanvas,Rect(0,0,Screen.Width,Screen.Height));
 //把整个屏幕复制到BITMAP中
 FullscreenCanvas.Free;
 //释放CANVAS对象
 ReleaseDC(0,DC); //释放DC
 //*******************************
 image1.picture.Bitmap:=fullscreen; //拷贝下的图象赋给IMAGE对象
 image1.Width:=fullscreen.Width;
 image1.Height:=fullscreen.Height;
 fullscreen.free; //释放bitmap
 form1.WindowState:=wsNormal; //复原窗口状态
 form1.show; //显示窗口
 messagebeep(1); //BEEP叫一声,报告图象已经截取好了。
end;

  (2)Delphi的第三方控件ScreenCapture,它是一个很好的免费的截图控件,可以轻松抓取任意大小(全屏当然行)、屏幕的任何位置,还可以设置所截图像的形状、以及用何种模式截图。下面介绍的是用TcmWindow模式截图,使用非常简单,使用效果可以与著名的抓图软件SnagIt32媲美。

procedure TForm1.BtnStartClick(Sender:TObject);
begin
 ScreenCapture1.start; //开始截图
end;

 //当截取屏幕成功时,此事件发生
 procedure TForm1.ScreenCapture1Capture(Sender:TObject;Bitmap:TBitmap);
begin
 //调整滚动窗口的大小以适应截获图像的大小
 Scrollbox1.HorzScrollBar.Range:= Image1.width;
 Scrollbox1.VertScrollBar.Range:= Image1.height;
end;

procedure TForm1.FormCreate(Sender:TObject);
begin
 //载入entntacp.dll文件
 BtnStart.enabled:= ScreenCapture1.dllavailable;
 //显示版本信息
 caption:= '屏幕抓图软件' + ScreenCapture1.version;
end;

//当没有足够的内存支持截取屏幕时,此事件发生
procedure TForm1.ScreenCapture1Error(Sender:TObject);
begin
 MessageDlg('屏幕截取时发生一个错误!请关闭其他应用程序以获得更多内存资源.', mtError,[mbOK],0);
end;

 //当用户按“Esc”键,即取消屏幕截取时,此事件发生
procedure TForm1.ScreenCapture1UserCancelled(Sender:TObject);
begin
 MessageDlg('用户取消屏幕截取。',mtInformation,[mbOK],0);
end;

简易对象垃圾回收框架for Delphi

1.1 我的一个出错程序

程序名称:呼叫处理模块的压力测试工具,分为客户端和服务端。

开发工具:Delhpi 5

相关技术:客户端通过与服务端建立Socket连接来模拟一组电话机的拨入、按键、等待、挂机等过程。服务端对Socket事件以及收到的数据包进行预处理,并转化为抽象的呼叫模型数据,然后发送给更上层的呼叫处理模块。由于呼叫处理模块是硬件无关的(与语音板卡、交换机类型均无关),因此通过此压力测试工具可以比较真实地模拟海量呼叫,以达到测试呼叫处理模块程序的逻辑正确性及其性能的目的。

由于系统设计时的某些考虑,该测试工具被分作客户端和服务端两个程序来实现,且采用socket进行通讯。现在想来,其实不如整合成一个程序实现更为简单——但也正因为采用两个程序来实现,才引发了后面的一些问题,并由此引入了简单的垃圾回收框架。

1.2 问题

在测试工具的使用过程中,我们发现当呼叫量巨大,且测试工具动作频繁的情况下,系统出现以下错误:

n 访问地址错(EAccessViolation),代码地址位于$0046FC80附近,访问地址多为$00000028。

n 出现EinvalidCast错误,该错误表明对一个地址进行类类型转换时出错(采用as关键字)。

n 程序内多处断言失败,出现许多引用已销毁对象的情况。

仔细检查程序后,我仍然认为这一切简直是不可思议!而且,本来用于对别的程序进行测试的程序自身却出现这类问题,几乎让我无地自容!

为了挽回自己的声誉,我不得不成沉住气来仔细跟踪错误,排解问题!

2 解决办法

2.1 查错

其实问题的解决还比较顺利。

通过查看程序的调用栈,发现程序出错前总是停留在发送Socket数据包的过程里。接着,进一步通过单步跟踪,发现在发送数据包的过程中,Socket检测到对端连接已经断开,就会触发OnDisconnect事件。而我正是在ServerSocket的OnDisconnect事件中根据传递进来的Socket句柄,找到对应的对象将之销毁的。

我在ServerSocket的OnDisconnect事件中的代码如下:

procedure Txxxx.ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); Begin…FLines.DestroyLineBySocket(Socket);//正是这一句,在不合适的时机释放了对象…End;
问题是这么出现的。

比如,在某个过程中具有如下代码(前面为行号):

1 FLine.DoSomething;

2 FLine.SendSocketData;

3 FLine.DoOtherThings;

其中,FLine是代表一路呼叫的对象。该对象内部引用了一个TCustomWinSocket指针。SendSocketData就是利用此Socket进行数据发送。

Flines是TLine对象的容器类的一个实例。

由此不难解读前述的各类错误:

1. 由于行2的Socket连接断开导致FLine对象释放,因此行3访问DoOtherThings几乎必然造成访问地址错;

2. 由于行2的对象销毁,因此程序中类似“Object as TLine”的代码导致第二类错误;

3. 由于对象提前销毁,善后处理工作未到位导致第三类错误;

2.2 解决方案

明白其原因后,问题解决起来就容易多了。

上述问题不外乎两个方案:

一, 判断实例是否存在

在DoOtherThings之后,判断FLine对象是否仍然处于Flines之中,若是则继续处理,否则结束处理;

二, 延迟销毁FLine对象

在ServerSocket的OnDisconnect中,将FLine对象抛入垃圾池,待时机成熟时再销毁。

考虑到方案一所要改动的代码量较大,同时,此种方案代码也不甚优美,因此决定采用方案二,即引入垃圾回收机制来解决问题。方案二的要点是选择合适的时机真正销毁对象。而对于这一点,问题倒不大,只需选择消息循环中处理消息的第一个环节进行回收即可。因为在之后的处理环节中,必然能够确保对FLine是否仍然有效的检查。

3 简易对象垃圾回收框架(untGarbagCollector)

3.1 概述

简易的垃圾回收非常简单:

n 使用TThreadList支持线程并发访问,并保存待回收的对象指针;

n 提供Put方法保存待回收对象;

n 提供Recycle方法进行真正的回收(因为所有对象均自TObject派生而来)。

3.2 实现代码

unit untGarbagCollector;interfaceusesClasses;typeTGarbagCollector = Class(TObject)privateFList: TThreadList;publicconstructor Create;destructor Destroy; override;procedure Put(const AObject: TObject);procedure Recycle(const MaxCount: Integer);end;function GarbagCollector: TGarbagCollector;implementationvar_GarbagCollector: TGarbagCollector;function GarbagCollector: TGarbagCollector;beginif not Assigned(_GarbagCollector) then_GarbagCollector := TGarbagCollector.Create;result := _GarbagCollector;end;{ TGarbagCollect }constructor TGarbagCollector.Create;beginFList := TThreadList.Create;end;destructor TGarbagCollector.Destroy;begintryRecycle(FList.LockList.Count);finallyFList.UnlockList;end;FList.Free;end;procedure TGarbagCollector.Put(const AObject: TObject);begintryFList.LockList.Add(AObject);finallyFList.UnlockList;end;end;procedure TGarbagCollector.Recycle(const MaxCount: Integer);varI: Integer;AList: TList;beginAList := FList.LockList;tryI := 0;while (AList.Count > 0) and (I < MaxCount) dobeginTObject(AList.Last).Free;AList.Delete(AList.Count - 1);Inc(I);end;finallyFList.UnlockList;end;end;initializationfinalizationif Assigned(_GarbagCollector) then_GarbagCollector.Free;end.

3.3 使用举例

引用untGarbagCollector单元后,可以直接使用GarbagCollector进行对象的销毁和回收。

n 销毁

AObject := TObject.Create;

GarbagCollector.Put(AObject);

n 回收

可以在定时器、线程以及其他场合调用Recycle方法。

MaxCount是用于控制每次销毁个数的参数,主要是怕一次性销毁太多占用过多的cpu。

(突然发现还可以扩展为限制时间进行销毁,比如每次销毁耗时不超过的n毫秒)。

3.4 使用场合

在本案例中,为了防止对象过早销毁引起访问冲突,而引入了垃圾回收技术。

在其它场合,比如为了提高某些程序的主观性能,也可以引入该技术。比如完成某些特定任务的程序,在处理过程中会产生临时的对象,而销毁这些对象又比较耗时。因此,为了尽早地结束任务,可以把这些临时对象保存至垃圾池中。待作业(任务)完成,并且等一段时间后cpu比较空闲时,再把临时对象真正销毁。此做法的真谛就是以空间换取时间——与某些系统预创建对象,并重复利用对象以提高性能的做法相同。

2008年9月8日星期一

精妙SQL语句收集

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删%u966

(转载)开发人员必须用到的开发软件破解

解决一些中文软件在英文操作系统里安装不成功和安装后标识都是问号的问题:
1.路径不要有中文,都应为英文,则安装成功
2.Start-Settings-Control Panel-Regiona and Language Options-将Regional Options项里的Standards Options的值改成Chinese (PRC)则标识都显示出来了

软件破解网址:
http://www.cracksearchengine.net/
http://www.crackfound.com/
http://www.astalavista.ws/
http://www.t1000.net/
http://www.cracklib.net/
http://cracksearch.ws/
http://www.zcrack.com/
http://www.serials.ws/

http://www.9down.com/

.NET:
项目管理:
(9)思维导图软件MindManager:
ftp://ftp2.mindjet.com/download/MM60-E-643_Pro.exe mindmanager 6.0注册版(SN:MP66-982-DPMA-AF55-27EE)
ftp://ftp2.mindjet.com/download/MMX52-E-344_Pro.exe MindManager.X5.Pro 5.2.344 修正汉化版-原英文版下载-安装序列号:MP5M-555-7P19-133C-D5CE
http://www.hanzify.org/index.php?Go=Show::List&ID=8152 MindManager.X5.Pro 5.2.344汉化包
汉化说明:
1. 请先安装原英文软件,必须保证是Mindmanager.X5.Pro.v5.2.344,否则汉化不能正常进行。
2. SN:MP5M-555-7P19-133C-D5CE
3. 退出Mindmanager.X5.Pro.v5.2.344 应用程序!
4. 解压缩后运行汉化包,软件会自动查找原英文软件的安装目录。
5. 有些用户汉化后可能菜单还是英文的,这时可以选择“工具”菜单下的“自定义”然后选择“全部重启”,就可以变为中文菜单了。
6. 如果无法安装汉化补丁,请重新安装MindManager.

(10)原型设计软件:
你用什么工具画原型图?
http://www.moond.com/lab/?p=136
试试用这些工具记录你的概念和创意
http://moond.com/lab/?p=146
Axure-不得不推荐的原型设计工具
http://www.caiwangqin.com/post/283

开发团队工具:
(1)http://www.grigsoft.com/ 比较两个文件不同的工具Compare It! 3。可将其作为Perforce的比较工具,方法如下:打开Perforce的“Settings-Options”,在弹出的对话框中点击“Files-Diff”,选择“User Supplied diff application”,选择路径为C:\Program Files\0JasonLi\Perforce\MyPlugin\Compare It!\wincmp3.exe,其他默认,点OK,然后在Perforce中右键你想比较的文件,然后选Diff 2 Files or Revisions,就可调用出此软件使用了。

(2)Project Server Connector for Visual Studio Team Foundation Server:
http://www.gotdotnet.com/workspaces/workspace.aspx?id=b9f69ea5-ace1-4a21-846f-6222a507cc9c

(3)Peer Code Review Tool代码审查工具:
http://www.smartbear.com/ CodeReviewer官网
http://www.hammurapi.biz Open source Java code inspection tool
http://www.laatuk.com/tools/review_tools.html 各种Code Review工具比较

桌面开发:
(1)
ReSharper
http://www.jetbrains.com/resharper/ 官网
http://www.3ddown.com/soft/23528.htm ReSharper v3.0 注册版
http://www.codeproject.com/csharp/DTReSharperPlugin.asp ReSharper 2.5.2 build# 376插件
http://www.cnblogs.com/xiaoyin_net/archive/2006/03/16/351298.html ReSharper2.0 for VS2003/2005 最新注册机

(2)vb.net与c#相互转换工具
vb.net与c#相互转换工具 http://www.ragingsmurf.com/vbcsharpconverter.aspx http://w1.311.telia.com/~u31115556/desc/programs.htm http://authors.aspalliance.com/aldotnet/examples/translate.aspx http://csharpconverter.claritycon.com/Default.aspx http://www.kamalpatel.net/ConvertCSharp2VB.aspx http://www.developerfusion.co.uk/utilities/convertvbtocsharp.aspx

(3)
加密
http://www.maxtocode.com/

混淆
http://www.xenocode.com/ 混淆代码
http://www.cnblogs.com/xiaoyin_net/archive/2007/06/08/776707.html 箫音Blog
http://www.ayxz.com/soft/9935.htm Xenocode Postbuild Fox 2007 v5.0.1 Build 2433 破解版
http://www.blogcn.com/u2/5/70/loyee/blog/39290136.html或
http://www.cnblogs.com/Files/loyee/Xenocode%202006%20crack.rar Xenocode2006破解补丁
http://hi.baidu.com/%D6%D0%B9%FA%B4%B4%D4%EC/blog/item/341ac75c4b925d43fbf2c0be.html或http://dev.csdn.net/article/76805.shtm 解密被XenoCode混淆的代码。
http://blog.csdn.net/yezie/archive/2005/09/13/479048.aspx?Pending=true 解密XenoCode加密的字符串

Dotfuscator
http://www.preemptive.com/dotfuscator/index.html
DotFuscator使用步骤
http://time-is-life.cnblogs.com/articles/310693.html

Salamander .NET obfuscator
http://www.remotesoft.com/salamander/obfuscator.html
Salamander .NET Protector
http://www.remotesoft.com/salamander/protector.html

Demeanor for .NET
http://www.wiseowl.com/products/Products.aspx

.Net IL-Obfuscator
http://9rays.net/cgi-bin/components.cgi?act=1&cid=86

LSW IL Obfuscator
http://www.lesser-software.com/ilobf.htm
http://www.lesser-software.com/en/content/products/LSW%20DotNet-Tools/LSW_DotNet_IL-Obfuscator.htm
http://www.wiseowl.com/products/Products.aspx

ILDog

dnguard

Anti .Net 2.0

Aspose.Obfuscator
http://www.aspose.com/

Deploy .NET
http://www.junglecreatures.com/jungle/index.jsp

Thinstall
http://thinstall.com/dotnet/

反混淆
Xenocode Fox 2007

Reflecotr
http://www.aisto.com/roeder/dotnet/ Lutz Roeder's .NET Reflector
或Microsoft Visual Studio 2005的\SDK\v2.0\Bin\ildasm.exe或\Common7\Tools\Bin\OleView.Exe
或Microsoft Visual Studio 2003的\SDK\v1.1\Bin\ildasm.exe或\Common7\Tools\oleview.exe
或\Common\Tools\OLEVIEW.EXE

pedumper+Reflecotr

Disa#

Salamander .NET Decompiler
http://www.remotesoft.com/salamander/index.html

Exemplar/Anakrino
http://www.saurik.com/net/exemplar/

格式化:
UniversalIndentGUI
http://sourceforge.net/project/showfiles.php?group_id=167482
使用说明:
http://blog.pixnet.net/Nelson/post/2576146 或 http://www.wretch.cc/blog/nelson&article_id=4510406

WEB开发:
(4)http://www.iconico.com/colorpic/gettingStarted.aspx ColorPic,这也是一个免费的软件,用于拾取颜色的,鼠标移动到哪里就拾取哪里的颜色,可以对拾取的颜色分组,这样我们就可以把需要的颜色都一次性拾取完,再慢慢的用了。拾取颜色和重新拾取时都是用Ctrl + G 快捷键(要使软件处于激活状态此快捷键才起作用),其它功能靠大家自己琢磨了。

好色鬼 2006 V02.08-取色工具
http://www.skycn.com/soft/5144.html#
色值传递员-取色工具
屏幕取色-取色工具

(4)http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en 使用方法:打开IE浏览器-选View-选Explorer Bar-选IE DOM Explorer,之后再打开网页时在页面的下面就有IEDevToolBar这个工具了。
点Find-Select Element By Click。
如果要独立出窗口点“unpin”就可以了,恢复回来按“pin”。

其实不用IEDevToolBar也行,IE里面的Powerband和Firefox下面的DOM Inspector都可以的。Powerband我也有装,感觉和DevToolBar易用性相差挺大。

微软的IEDevToolBar,这是一个免费的转为Web开发人员制作的IE插件,做博客Skin时用到的主要功能有:
1.以树结构查看CodeDom,并查看每个Element属性,可以使用鼠标点击选中Element,这个在我们制作Skin时很有用
2.生成图片报表,就是将页面上说有出现的图片生成一份详细的报表,这样就省的我们自己去找图片路径和量图片大小等等。
3.高亮显示表格,表格单元,Div等的边框,这个在我们调整布局时也是很有用
4.页面尺子,可以然你任意在页面上度量长度,这个是大大的提高了我们的工作效率,不用为了量个长度而抓图再用画图工具量
我也强烈推荐你装上,Web项目调整界面时它真的是用处很多啊

(4)http://outofhanwell.com/ieleak/index.php?title=Main_Page 或

http://www.host01.com/Print.Html?57968 IE Leak Tool-Drip

(8)http://support.businessobjects.com/downloads/merge_modules.asp 水晶报表Merge模块

Mercury:
http://downloads.mercury.com/cgi-bin/portal/download/index.jsp Mercury公司下载页面

下载地址:
http://esd.mercury.com/akdlm/trial/lr/LR8DownLoad.exe
http://www.cnblogs.com/gdgzboy/archive/2007/01/11/617390.html
http://blog.csdn.net/yifeiyuann/archive/2005/12/22/558325.aspx

http://www.cnblogs.com/liyunsohu/archive/2007/01/30/199811.html简单使用LoadRunner for Visual Studio 2003插件(入门级)

:
http://www.17testing.com/zyxz/csgjzy/190.html
http://www.agiletesting.cn/bbs/utility.php?mode=news&forumid=10&topicid=1090306391

:
http://www.17testing.com/zyxz/193.html

:
EasyWebLoad v1.8(网络站点负载测试工具)

QuickTest:
QuickTest Pro.8.2.中文版.强大测试工具
http://www.tomore.com/searchtools.php?job=search&s=3
在上面的seach中输入QuickTest.Pro即可搜出01-18

QuickTest Pro 8.2 中文版破解文件
http://mumayi1.999kb.com/pic/2007-01-18/w6sl3n7y4qi89q2896um.rar
QTP8.2破解文件
http://www.rapidtesting.cn/Html/soft/10128.html
注册码:0123-2820602186
安装完毕将mgn-mqt82.exe复制到安装目录,运行进行破解即可。

QTP8.2 JAVA ADD-IN 破解完全解决办法
1、安装QTP8.2后,先安装QTP82-java-addin;
2、然后再安装QTP82Java65upgrade.exe,我安装时没有修改默认的路径
3、将破解的QTPro.exe 复制到安装目录下的bin目录里,以我的路径为例,即D:\Program Files\Mercury Interactive\QuickTest Professional\bin
4、再启动QTP,终于看见JAVA ADD IN后讨厌的时间限制消失了,取而代之的是另人爽心悦目的permanent

http://www.subei.com.cn/bbs/viewthread.php?tid=607
QTP82-java-addin
http://esd.mercury.com/akdlm/trial/qtp/QTP82-java-addin.zip
QTP82Java65upgrad
http://www.rapidtesting.cn/bbs/attachments/QTP82Java65UPGRADE.zip

QuickTest.Pro.8.2.中文版
http://lib.verycd.com/2005/09/19/0000065551.html

Quicktest 1.5 & Astra Site Manager v1.08:
Name: Pirate Company: Pentium Inc. s/n: 999000023AS09128c354

WinRunner:
WinRunner永久注册方法
装完WR,打开C:\Program Files\Common Files\Mercury Interactive\License Manager的lservrc,将内容替换成下面的内容:

5SFDHYECAW7F8V8ULAEHCVYQSIRG93D29XAQ8KKM4FC#
# Dynamically installed.
FF2VLB3CX43FE7GRYIB3W96MVFUFK7UX5IM6DTS2WL4YR8JS4N27M6DWEM9
# Dynamically installed.
G8A9EF79GM5Z7C2V6IKBQZ64773ZBDCLMWETBCRHBG57634GFVY9K#
# Dynamically installed.
NRDDL7SPI9LDT5PUG8E4MHVA2933VROPSPBIEZ95JLHMH48OC7P8UEFJXNLRGG8W274AHT
# Dynamically installed.

WinRunner8.2
http://lib.verycd.com/2005/09/18/0000065515.html

WinRunner 7.0.1
1234-5858585858

Quality Center:
Mercury测试管理工具Quality Center 9.0下载
http://bbs.51testing.com/thread-64725-1-1.html

TestDirector:
TestDirector 8.0
http://www.xa-btesting.com/download/show.asp?id=1717

http://bbs.51testing.com/viewthread.php?tid=32954&highlight=TestDirector%2B7.6%2B%CE%DE%CF%DE%D6%C6
破解TD7.6无限制使用方法
以下是TestDirector 7.6的一些破解方法,希望对大家有帮助
TestDirector 7.6
7FFFK-A2722-FF7AC-A6KKN
安装之前将日期往后改几年,如2006-04-02,安装完成后使用期限自然是到2006-06-02.
成功后,在将当前日期改回来,2004-04-02,再进去看看License的使用期限,还是2006-06-02。

----------------------------------------------------------------------------------------------------------

TD 7.6 License Code 日期限制 合作 缺陷 需求 TestPlan-TestLab
--------------------------------------------------------------------------
7DFDM-8EFEE-EA68C-A6KKN 4个月 无限 25 25 25
NPPPF-WGGGG-RPHWS-UH330 无限 无限 32 16 16

----------------------------------------------------------------------------------------------------------

B343P-44B44-43444-6444S (无任何限制)
FF2VLB3CX43FE7GRYIB3W96MVFUFK7UX5IM6DTS2WL4YR8JS4N27M6DWEM9#
TD8.0用7.6的也可以
code1:JSTS0-TTJTT-TSTTT-VTTT3
code2:7FFFK-A2722-FF7AC-A6KKN
NPPPF-WGGGG-RPHWS-UH330
code3:W000000-0000000-0000000-0000000
我的机器安装了7.6以后,用版主提供的序列好7FFFK-A2722-FF7AC-A6KKN,只有5个用户并行操作,换为NPPPF-WGGGG-RPHWS-UH330以后,用户增加了,但是每次登陆的时候都会有一个提示::you are not licensed to register module .please consult your project administrator.
那位高手能不能帮忙解决一下
先声明,我不是高手,我安装TestDirector7.6是稀里糊涂的安装好了,其序列号是安装时自动有的是:JSTS0-TTJTT-TSTTT-VTTT3;
而机器码我用的是:W000000-0000000-0000000-0000000

TestDirector80
http://lib.verycd.com/2006/03/19/0000095046.html

TestDirector 7.0.1
w000000-0000000-0000000-0000000
TestDirector 7.2
18AM9CA-H98RD98-P398P38-A3J8AI0

安装篇:
XP和2000都可以安装,2003似乎有兼容性问题,没试过,装过的朋友可以说一下。TestDirector的安装环境要求 IIS。如果你没有,请在控制面板添加/删除程序中安装IIS。(这里需要注意的一点是,你系统的administrator用户不能使用空密码,也就是说你必须为管理员用户指定一个密码,不然安装完成后无法正常运行TestDirector,会报那个著名的RPC错误)。安装之前请关闭一些IE的辅助工具,并关闭其功能,在初次运行时,会要求更新部分IE空间,很有可能被IE的辅助工具所拦截。所以为了能让我们顺利的完成它,把杀毒软件也关掉吧。
运行安装程序。
输入你的License 继续Next
License可以用TD7.6的:B343P--44B44--43444--6444S
根据环境选择需要的数据库,这里使用的是Access,继续Next
注意User 里面默认的是 你的机器名\管理员
Password:输入管理员密码(要想正确安装你的Administrator必须有密码,不能为空)
继续Next
如果你有邮件服务器,则选择SMTP Server 输入你的邮件服务器
继续Next
Virtual Directory Name 输入你虚拟目录名,即你在IIS中访问要用的地址,默认即可
继续Next
继续Next
配置完成后,可以在上面的栏目中查看你前面的详细配置,如果可以点击Install开始安装过程
安装完成后,需要重起一下机器,在登陆系统的时候会发现多了一个关于员用户,这里是无法登陆,是TD自动创建的一个系统用户,不用去管它。
接着继续安装SP1补丁,中途会要求输入一次系统管理密码,然后再要求重起一次
重复上面步骤安装SP2补丁。即安装完成

LoadRunner:
LR8.1(中文版)破解方法大公布!(破解成功)
LR8.1版本已经将7.8和8.0中通用的license封了,因此目前无法使用LR8.1版本,包括该版本的中文补丁。
破解思路:由于软件的加密程序和运行的主程序是分开的,因此可以使用7.8的加密程序覆盖8.1中的加密程序,这样老的7.8和8.0中通用的license就可以使用了。

操作步骤:
1、用官方版的LR8.1安装,也可以安装中文补丁。
2、将LR7.8或者LR8.0(安装包或者安装后目录中的都可以)中的
lm70.dll
mlr5lprg.dll
这两个文件复制并粘贴到LR8.1安装目录下的bin文件夹下,一般是C:\E:\Program Files\Mercury\LoadRunner\bin;

lm70.dll 文件的描述是 with conbined license support,是一个license的支持文件;
mlr5lprg.dll应该是一个保存license的文件。
大家可以试一试,其实不要替换mlr5lprg.dll也是可以的,只替换lm70.dll文件,老的license一样能注册通过,但是软件的试用的license还在。

3、运行LR8.1,打开license管理器,点击添加new license,将老license复制进去,OK,验证通过!
7.8、8.0通用的license有:
golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

此方法适用于英文原版8.1和中文版8.1。

LoadRunner8.1(含汉化包)的下载地址
http://lib.verycd.com/2006/08/11/0000114991.html

软件测试工具:
http://www.ml570.com/default.asp?cateID=4

可用于LoadRunner 8.0 以下版本的序列号
100 clients
AEAMAUIK-YAFEKEKJJKEEA-BCJGI
10000 web clients
AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

LoadRunner.8.0.工业级测试工具
http://lib.verycd.com/2005/10/01/0000067173.html

LoadRunner 6.5 20H-4D82-7F
license 20H-4D82-7F

LoadRunner 7.5 AEAMAUIK-YAFEKEKJJKEEA-BCJGI
Global 100

LoadRunner 7.5 AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
WEB 10000
dummy8 10
Serial:
KWC500R6538415-885

loadrunner 7.51
License: BGAUGLIX-AJGI-AEIEKEKJJKEAFJP-BDFHW

LoadRunner v6.0 SP1 S/n: 9606-4774477437 Key: 20H-4D82-7F
LoadRunner v5.01 S/n: 9876-5432102521 Key: 218-1-EA1-BB-AD
LoadRunner Addin for SAP v2.1 S/n: 9876-5432102521
LoadRunner for DOS S/n: 856464092302113
LoadRunner v7.0.0 S/nLicense: FNCU-CVBQ-BEFQ

Astra LoadTest:
Astra LoadTest 4.5
s/n: AEAJIVII-AKEAE-AVEG

Astra LoadTest 5.4.3
s/n: BKANCFCV-YKEAF-GJUEG
(Note: Install as in evalution version and after that goto LoadTest Controller and use this maintena
nce s/n)

Astra Loadtest 5.4.1.7
s/n: BKANCFCV-YKEAF-GJUEG

Astra QuickTest 5.0
Code: 7972-1234567890 Key: AEAJDDFR-Y-AQBK

Telelogic:
http://www.telelogic.com/ 官方总网址
http://www.telelogic.com/index.cfm 官方英文首页
http://www.telelogic.com.cn/index.cfm 官方中文文首页
https://support.telelogic.com/en/ 官方下载
http://www.telelogic.com/campaigns/2007/global/doors_fastrak_release/index.cfm

IBM Rational:
http://www.rational.com 官方首页
http://www-900.ibm.com/cn/software/rational/
http://www14.software.ibm.com/webapp/download/brand.jsp?b=Rational 所有Rational产品

盟动力Rational下载:
http://www.tomore.com/searchtools.php?s=3&job=search&key=Rational&select=1&select1=0&jumpto=1&njumpto=0

IBM.Rational.Suite.V2003.06.00.Multilanguage:
http://download.csdn.net/search/IBM.Rational.Suite.V
Rational Suite Enterprise 2003 产品安装及破解办法
http://www.tomore.com/3/7338.html

Rational RequisitePro下载
http://www-306.ibm.com/software/awdtools/reqpro/

Rational Rose 2003 汉化版
http://www.hnspace.com/downinfo/41830.html
rational rose 2003破解
拷贝rational_perm.dat到rational安装目录下的Common里,覆盖原文件即可破解。

rational rose破解文件为:
http://zixi.bokee.com/inc/sdasdas.rar
如果还不能破解,就按照下面的步骤来做:
1.安装Rose后,默认是需要许可证书的..去下载个破解的..
http://www.cnblogs.com/Files/lixianhuei/rose2003crack.rar
2.先用破解压缩包里的 rational.exe,lmgrd.exe 覆盖到你的 \安装目录的Rartional\commen\下
3.然后记事本打开 license.dat, 修改里面的 SERVER yourPC ANY DAEMON rational "C:\Program Files\Rational\Common\rational.exe"
改成 SERVER 你的机器名 ANY DAEMON rational "你的安装目录\rational.exe" ,拷贝到Common目录下
4. 将Flexlm.cpl拷贝到C:\winnt\system32\下, 在控制面板里运行 FlexLm License Manager,
运行后, 在 Setup 面板配置文件路径,lmgrd.exe -> 你的安装目录 \Common\lmgrd.exe, 而 License File 为你改过的 license.dat(我用的是xp,目录为C:\WINDOWS\system32)
5.在Control面板点击Start,如果成功的话点击Status按钮将显示 你的机器名:license server UP (MASTER) 说明成功了
失败的话重启一下FlexLm License Manager就没问题了。
6.如果弹出对话框License Key Administrator Wizard后, 选定Point to a Rational License Server to get my licenses,单击下一步,Server Name文本框中填写你的机器号(可能已经填好),单击完成。 (成功的话会出现两屏的licenses)

Borland:
http://www.borland.com/ 官网首页
http://www.borland.com/us/products/index.html 所有产品

http://download.csdn.net/down/148368 CaliberRM 2005 Keygen

http://trial.borland.com/survey.aspx?sid=638 JBuilder 2007 Enterprise Trial下载
http://www.wujianrong.com/blog/archives/SHOCK.jar JBuilder 2005、JBuilder 2006 Enterprise注册破解

http://www.xyju.com/bbs/attachments/07-01/jbuilder2007注册机.rar JBuilder2007注册机
http://jones.javaeye.com/blog/52939 JBuilder2007破解补丁
http://www.xyju.com/bbs/attachments/07-01/jbuilder2007%D7%A2%B2%E1%BB%FA.rar
http://lib.verycd.com/2007/01/15/0000135764.html

JBuilder2007破解终于出来了大家快下载啦
1.用eMule下载[JBuilder.2007].sanct6.jar和[JBuilder.2007].sanctuary.jar两个文件:
[JBuilder.2007].sanctuary.jar文件的BT链接地址:
ed2k://|file|[JBuilder.2007].sanctuary.jar|1128426|AF3D21D1A0E8E4A138CA85ABBBF8E8C6|h=ELGPRR6UYLOLDA2AKQEUX3BFMUXW7VGV|/ [JBuilder.2007].sanct6.jar文件的BT链接地址:
ed2k://|file|[JBuilder.2007].sanct6.jar|22172|88C833D4A11F2F7601231F756B81D3C8|h=LR7V6SVYYU5FKM4S2IKHVRKSNJ7FEXGT|/
2.把[JBuilder.2007].sanct6.jar改为sanct6.jar
3.把[JBuilder.2007].sanctuary.jar改为sanctuary.jar
4.把sanct6.jar复制到JBuilder安装目录下的jbuilder\eclipse\plugins\com.borland.sanctuary.client.core_6.0.0文件夹,并复盖原件
5.把sanctuary.jar复制到JBuilder安装目录下的jbuilder\eclipse\plugins\com.borland.sanctuary.client.core_6.0.0文件夹,并复盖原件
6.恭喜你!OK了

JBuilder 2005 Enterprise破解方法:
JBuilder 2005 Enterprise安装结束,安装文件中提供了破解文件shock.jar 。 此注册文件使用方法:
运行注册文件前不要运行JBuilder 2005 Enterprise。
将shock.jar拷到c:\Borland\JBuilder2005\jdk1.4\jre\bin目录下,当然,可以不用COPY,指定路径也是可以的。
运行CMD
C:\Documents and Settings\Administrator>cd c:\ 进入到安装目录下的jdk1.4\jre\bin下
C:\Borland\JBuilder2005\jdk1.4\jre\bin>java -jar shock.jar SHOCK presents JBuilder 2005 Enterprise Enjoy another quality product from SHOCK C:\Program Files\JBuilder2005\jdk1.4\jre\bin> 运行JBuilder 2005 Enterprise,会发现不再提示你进行注册,直接进入界面。

JBuilder 2006 企业版
地址:http://www.borland.com/downloads/download_jbuilder.html
破解方法:
1.安装Jbuilder2006
2.将破解文件包Crack.zip中的*.JAR文件(有两个)复制到JBuilder2006\lib目录中,
将*.SLIP复制到JBuilder2006\(即安装好后的根目录),
再将*.SLIP放至JBuilder2006\license下
3.更新JDK核心: 从网络上下载最新JDK1.5.0 安装上,将\JAVA\JDK1.5.0\下所有文件,包括子目录所有文件复制到JBuilder2006\jdk1.5\下,就可以了。
破解文件网上有的是,如果找不到请Email索取


Java系列:
项目管理:
(1)
需求管理软件:
1.Telelogic DOORS占70%份额
2.Rational Requisite Pro
3.Borland CaliberRM
4.Microsoft SharePoint Portal Server
5.OpenCollective
6.Dragonfly算是唯一的中文版本吧

Rational公司对UML语言建模以及RUP提供的CASE工具:
Rational Requisite Pro 通过使需求更易于书写交流和修改使在整个应用开发中全体开发小组能实时更新和跟踪.
Rational ClearQuest Windows和基于Web的需求变更管理产品时,项目小组能跟踪和管理开发生命期中的所有变更活动.
Rational Rose 世界领先的用于商业过程建模需求分析构建结构设计的可视化建模工具.
Rational SoDA 为整个软件开发过程提供产品文档自动化的工具,极大减少了文档工作的时间和成本.
Rational Purify c/c++构件和应用程序开发者使用的运行错误检查工具帮助检查内存错误.
Rational Visual Quantify C/C++,VB,Java构件和应用程序开发者使用的高级性能评测工具,帮助评估性能瓶颈.
Rational Visual PureCoverage 自动的软件测试覆盖率工具,使开发者能全面地有效地测试他们的应用程序.
Rational TeamTest 创建,维护和执行自动化的功能测试,允许全面地测试代码和决定软件是否满足期望的需求和性能.
Rational PerformanceStudio 评测和预计Client/Server和Web系统性能的易于使用,准确和可升级的工具.
Rational ClearCase 主导市场的软件配置工具,为项目经理提供跟踪每个软件开发项目进化的能力.
Rational XDE 为最流行的集成开发环境提供了真正的无缝集成的可视化建模环境.
Rational Apex--Rational Apex系列产品为一集成开发环境,使程序员能够设计、开发和维护复杂的C/C++或Ada系统。Apex除提供程序编译器、纠错器外,还具备版本控制(Version Control)、架构规划(Architecture Organizing)、发布管理(Release Management)等先进的软件工程能力
测试工具SQA

(4)http://www.itpub.net/attachment.php?attachmentid=385396&postid=6498216 ITPub的Rose、Borland和UML等的下载

(5)解决安装和应用rational rose时报错“MEM_BAD_POINTER”的问题:
环境:
windows xp pro sp2
RationalSuiteEnterprise.2003.06
原因:
同样出在winxp sp2系统上。
对此,官方的解释是:
1) extract shw32.dll from the attached rar file.
2) locate the copy of shw32.dll that the affected program (the one
that's giving the MEM_BAD_POINTER error) is using. Rename this file,
or move it to some other directory for safe keeping. Note: this step
is not strictly necessary, BUT if you experience problems with our
new DLL, the first thing we're going to suggest is that you revert to
your old one.
3) with your old shw32.dll renamed or moved for safe keeping, install
the new shw32.dll where the old one used to be. Now run your app as
usual and verify that the error no longer appears.

4) if after step 3 you still see the MEM_BAD_POINTER error, search
your hard drives for any other occurrences of shw32.dll and replace
those (using the above procedures), one at a time, until the error no
longer appears.
实际上,解决这个问题无需那么复杂,只须下载show32.dll补丁(地址:http://www.cnblogs.com/Files/begincsdn/MEM_BAD_POINTER_EMEND.rar),再到Rose对应的目录中(C:\Program Files\Rational\Rose)将原文件替换成新文件,下次退出时就没有这种错误了。

原文地址http://blog.csdn.net/Fjnu_Angel/archive/2007/01/10/1479032.aspx
其他下载地址http://blog.chinaunix.net/u/20117/showart.php?id=124064
http://www.blogjava.net/lyjjq/articles/69217.html

开发工具:
(1)
混淆
proguard
http://proguard.sourceforge.net/
RetroGuard
joc.jar

反混淆
http://www.blogjava.net/huanzhugege/archive/2007/05/13/117123.html Java反编译工具Jodeclipse for eclipse3.2
jad

(2)MyEclipse 5.1.0
http://downloads.myeclipseide.com/downloads/products/eworkbench/5.1.0GA/F

ullStack_MyEclipseEnterpriseWorkbenchInstaller_5.1.0GA_E3.2.1.exe

License Name : TLF
License Key : GLR8ZC|065444|545454|7663624914

License Name : EastGame
License Key : RLR8ZC|065444|545454|352499020

License Name : eastgame.net
License Key : rLR8ZC|065444|545454|340248553

Subscriber: www.1cn.biz
Subscriber Code: jLR8ZC-444-55-4467865481680090
注册成功后会发现:

Subscriber: www.1cn.biz
Product ID: E3MP (MyEclipse Professional Subscription)
License version: 9.99
Full Maintenance Included
Subscription expiration date (YYYYMMDD): 20991231
Number of licenses: Unlimited

Eclipse插件:
如果新加的插件不能被发现,可以关掉JBuilder,之后run cmd出现命令窗,输入相应盘符如e:,之后退到JBuilder的安装目录如cd E:\0JasonLi\JBuilder2007,之后键入jbuilder -clean启动JBuilder就可以看到你加的插件了。插件我是加到E:\0JasonLi\JBuilder2007\jbuilder\eclipse\plugins和E:\0JasonLi\JBuilder2007\jbuilder\eclipse\features里,而不是E:\0JasonLi\JBuilder2007\plugins和E:\0JasonLi\JBuilder2007\features里。插件也可以放在自己建立的文件夹里,但此文件夹要建立个.eclipseextension文件,没有扩展名,内容为:
id=com.borland.jbuilder.productname=JBuilderversion=1.0.0
也可以通过Help-Software Updates-Find and Installing-Search for new features to install-在更新的时候将保存路径改为你自己的,这时候会自动为你添加一个.eclipseextension文件。

http://www.eclipseplugincentral.com/Web_Links+main.html 插件网

JavaScript插件:
Aptana IDE(js,css有智能提示,有浏览器类型和DOM版本提示,输入即提示,无格式化)
http://www.aptana.com/
http://www.aptana.tv/
http://www.aptana.com/dev/index.php/Main_Page

JavaScript Reporter(tm) JavaScript Tool
调试查错的工具
http://www.dhitechnologies.com/products/reporter/

Teniga(js有智能提示,无浏览器类型提示,Alt+.提示,js有格式化)
Teniga是一个Javascript编辑器插件。它提供运行期语法错误检查,内容大纲,代码提示和语法着色等功能。 它能够帮助你快速,轻松编写javascript代码。Teniga还支持动态扩展用户包。
http://sourceforge.net/projects/teniga/

JSEclipse(js有智能提示,有浏览器类型和版本提示,Ctrl+.或Alt+.或Alt+/提示,无格式化,可以识别是"JavaScript类"和"javascript 函数"-outline视图,Ctrl+/是注释一行)
可以编辑JavaScript 文件,支持语法突出显示和包括了一些常用的面向对象的方法。支持的面向对象的功能有:构造函数,类方法,实例方法,类变量等等。支持代码错误提示,警靠报告等。
http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/?&error=1
http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/

For JSEClipse plugin Ext of the code completion library
http://extjs.com/forum/showthread.php?t=6112
这个东东可完善JSEclipse对extjs的代码自动完成功能.

install: unzip the file,put all xml files to "YourWorkspace\.metadata\.plugins\com.interaktonline.jseclipse\user_library",reboot eclipse.if the user_library not exists,then create it.
Another solution:
1. Copy ext-all-debug.js into your project in your project.
2. Refresh your code completion library from JSEclipse menu.
JSEclipse plugin will generate library for you.

I installed Ext lib for Jseclipse 1.5.X and Eclispe 3.1.2 successfully!
--------------------------------------------------------------------------------
I installed Ext lib for Jseclipse 1.5.X and Eclispe 3.1.2 successfully!
1.Download the two zip files.extract them to a temporary folder.
2.In Eclipse ,create a new js file, choose the menu "jsEclipse->add library",choose one xml file of the extracted temporary folder. then eclipse will create a folder named "user_library" under path "\yourworkspace\.metadata\.plugins\com.interaktonl ine.jseclipse\".
3.Copy all files from temporary folder to the "user_library" folder.
Hope it's helpful!

JSEditor-不好用。
JSEditor也是一个可以在eclipse下编写JavaScript的插件。
http://sourceforge.net/projects/jseditor

myJSEditor-MyJSEditor-0.9.0-RC.zip-不好用。
myJSEditor是一个JavaScript编辑器。它的功能包括:语法高亮显示,代码自动完成等。myJSEditor还对自定义的JavaScript对象有高亮显示,代码自动完成的功能。这个插件主要是支持Rhino JavaScript引擎,但也能够兼容其它符合Ecma262标准的JavaScript引擎。
http://eclipse.moelleryoung.com/jseditor/index.php

SpketIDE-(Spket IDE 1.5.11)spket-1.5.11.zip-不好用。
SpketIDE提供很多功能用于帮助Mozilla Extensions开发人员提高开发效率。其强大的JavaScript编辑器提供了像代码自动补全,目录大纲,代码(包括XML代码)折叠,语法(包括XUL/XBL语法)高亮显示,XPCOM组件视图这些功能都有助于提高开发人员编写JavaScript代码的效率。此外SpketIDE还是Yahoo!UI组件的一个辅助开发工具。
http://www.spket.com/

(JavaScript Editor PlugIn for Eclipse)net.sf.wdte.js_0.0.9b.zip-不好用。
(EclipseHTMLEditor)tk.eclipse.plugin.htmleditor_2.0.4.zip-不好用,无智能提示,无浏览器类型提示,无格式化功能。

(VelocityWebEdit)VelocityWebEdit-1.0.8.zip-不好用。

CSS插件:
CSS Editor-(CSS Editor)net.sourceforge.csseditor_0.0.4.zip-不好用,无智能提示,无浏览器类型提示,无格式化功能。
CSS Editor (Eclipse Plugin)这是一个为Eclipse 提供的插件,可以编辑复杂的CSS功能。
http://sourceforge.net/projects/csseditor/


Implementors
当追踪方法代码时,Eclipse默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。
http://eclipse-tools.sourceforge.net/implementors/

Call Hierarchy
Call Hierarchy 显示一个方法的调用层次
http://eclipse-tools.sourceforge.net/call-hierarchy/

EclipseTidy
EclipseTidy基于HTML Tidy提供校验和格式化HTML/XML文件的功能
http://eclipsetidy.sourceforge.net/

EclipseHTMLEditor
EclipseHTMLEditor是一个可以在Eclipse下编辑,校验HTML/ XML / JSP的插件。
http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?

page=EclipseHTMLEditor

Checkclipse
Checkclipse 检查代码的风格、写法是否符合规范
http://checkstyle.sourceforge.net/ CheckStyle官网
http://sourceforge.net/projects/checkstyle/ CheckStyle下载页

Spell Checker
这是一个适用于Eclipse3.1平台的拼写检查程序插件,它可用于ava,JavaScript,JavaProperties,XML,HTML,JSP,与PHP的拼写检查。eSpell支持自定拼写字典,针对项目的特殊设置,检查键入的词语等。
http://www.bdaum.de/eclipse/

JAutodoc
JAutodoc是一个能够自动为你的源代码加上Javadoc注释的Eclipse插件。
http://jautodoc.sourceforge.net/

eclipse UML
UML建模插件功能其全。
http://www.eclipsedownload.com/download/index.html

Violet UML Editor
Violet UML Editor是一个强大的UML编辑器,易于使用,开发快捷.它能画出好看的类图,对象图,顺序图,状态图和use-case图。这个插件把Violet嵌入到Eclipse中。
http://sourceforge.net/projects/violetumlplugin

AmaterasUML
UML建模插件,可利用该插件来绘制UML类图和UML时序图。
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=AmaterasUML

VUML
该Eclipse插件是一个可视化UML2.0编辑器。

Jupe
Jupe是一个基于GEF和UML2框架的UML插件,它为UML类图创建,代码生成,逆向转换提供支持。Jupe支持利用鼠标创建UML类图,并把图导成XMI,加载和保存类图。支持基于源代码创建UML类图,并且源代码如果有变动将自动改变类图。
http://jupe.binaervarianz.de/

ArgoEclipse
这个插件把ArgoUML建模工具集成到Eclipse IDE中。支持UML1.4所有类图。
http://argoeclipse.tigris.org/

Topcased UML Edit
UML2.1建模工具,支持9种模型图包括:UML用例图,类图,包图,顺序图,协作图,状态图,活动图,构件图,部署图。并提供Java与模型图的转换引擎。
http://topcased-mm.gforge.enseeiht.fr/modeling/uml/index.php

Green UML
Green UML一个UML类图创建工具,主要是针对学生使用而设计。你可以利用Green UML从代码创建UML类图,或者通过UML类图来生代码。类图中的所有关联都是以插件的形式存在可动态增/删。Green支持把UML类图导出成jpg与gif的格式。
http://green.sourceforge.net/

Relo
Relo是一个帮助开发人员研究大型代码库的好工具,它能够一步步的跟踪你所展开的代码包,并快速生成类似UML的类图。
http://relo.csail.mit.edu/

Google Code Search
Google Code Search插件。
下载:org.proteus.google.code.search-1.0.0.zip

VSSplugin
VSS客户端插件,VSS是一个和CVS齐名的版本管理系统。
http://sourceforge.net/projects/vssplugin


StrutsIDE
StrutsIDE是开发Struts框架开发工具。它提供了struts-config.xml配置文件的图形管理界面。
http://amateras.sourceforge.jp/cgi-bin/fswiki_en/wiki.cgi?page=StrutsIDE

StrutsBox
StrutsBox主要特点包括:
◆基于Eclipse3.1开发平台
◆一个用来编辑Struts配置文件的可视化编辑器
◆以图形的方式来显示Struts应用程序的Web Flow
◆一个可高亮显示语法的JSP编辑器
◆可利用向导来创建Struts项目与一个新的Struts form
◆支持Struts 1.0,1.1与1.2标准
http://www.strutsbox.de/

Struts-It
Struts-It为开发基于Struts的Web应用程序提供全面的支持。它基于Eclipse 3.1并能够很好的与WTP 0.7集成。Struts-It支持Struts1.1,1.2与JSTL。
http://sourceforge.net/projects/struts-it/

Flux
Flux是一个支持采用模型驱动来设计一个Struts1.1 web应用程序的Eclipse插件。它能够从UML活动图生成struts-config.xml和struts-config-.xml配置文件。在其主页和Eclipse帮助系统中有提供详细的用户使用手册。
http://flux4eclipse.sourceforge.net/

QuickREx
正则表达式测试插件.
http://www.bastian-bergerhoff.com/eclipse/features/web/QuickREx/toc.html

J2EE design pattern generator
一个可以生成J2EE设计模式代码Eclipse插件并支持J2EE refactorings。它使用XML文件来存储设计模式描述。这个插件有一个友好的用户界面向导。支持的设计模式有:
* Front Controller -
* Session Facade -
* Service Activator -
* Service Locator -
* Composite Entity -
* Transfer Object Supporterd refactorings: -
* Hide Entity behind Session -
* Move business Logic to Facade -
* Iintroduce Front Controller
http://sourceforge.net/projects/j2ee-dp-gen

PatternBox
PatternBox是一个Java设计模式编辑器。它提供一个基于模板的代码生成器。这个基于XML的模板机制使得你能够定义自己的代码模板。PatternBox当前能够为16种

GoF设计模式生成代码。
http://www.patternbox.com/index.html

SEDS Design Pattern Pugin
这个插件将使利用设计模式来开发Java应用程序变得更加容易。它内建一些基本的模式如Singleton,Factory等,但用户也可以配置其它模式。SEDS Design Pattern Pugin内建的具体设计模式包括:Chain of Responsibility,Iterator,Mediator ,Memento ,Observer,Strategy,Command ,Factory Method,Prototype,Singleton,Holder,Bridge ,Composite,Facade,DAO,Type Safe Enumeration ,Visitor,Flyweight,Facade。
http://home.icslab.agh.edu.pl/~shogun/iosr/site/maven/

Jinto:国际化插件
http://www.guh-software.de/

java sdk docs for eclipse
这个插件把Java SDK文档(包括Java™ 2 SE 5.0 SDK (JDK 5.0) Docs、Java™ 2 SE 1.4.2 SDK Documentation、Java™ 2 EE 5.0 SDK API Docs)和其它一些文档(Apache Ant 1.6.5、陆续将添加Apache SOAP v2.3.1 Documentation、Apache Struts Framework、Xerces Java Parser 1.4.4、Xerces Java Parser 2.8.0、C++相关文档)集成到Eclipse帮助系统便于开发过程中浏览与搜索。
http://eclipsedocs.sourceforge.net/

Eclipse Instant Messenger
Eclipse即时消息插件,它结合了一些常用的协议如:MSN,YAHOO,ICQ,AIM等。
http://eimp.sourceforge.net/d/

Eclipse Messenger
即时消息插件,方便开发者交流。不需要任何其它应用程序。
http://www.myjavaserver.com/~cosmologic/

测试工具:
(3)推荐两个非常好用的测试工具JMeter和Badboy:
JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现:
官方网址:http://jakarta.apache.org/jmeter/index.html

Badboy也是一个强大的测试工具:
官方网址:http://www.badboy.com.au/

Badboy不比jmeter功能多,但是有了badboy可以让你的测试脚步制作更加轻松。

PHP系列:
http://www.zend.com/ Zend Studio官网

Zend Studio v5.5.0破解
http://www.4x4y.com/86701_down_Zend.Studio.v5.5.0_crack.html
PHPChina论坛ZendStudio-5_2_0下载
http://www.phpchina.com/html/down.html

http://files.zend.com/videos/zend_studio_demo/ Zend Studio Demo

http://www.phped.com/ NuSphere PHPEd官网
http://www.nusphere.com/ NuSphere PHPEd官网

NuSphere PHPeD IDE v4.6.4616 特别版
http://down.chinaz.com/s/10200.asp

http://www.nusphere.com/products/phped.htm PHPEd Debug Demo

Javascript系列:
http://bbs.51js.com/forum-24-1.html 无忧脚本

http://www.w3schools.com/js/default.asp W3英文学校

(1)调试javascript的好方法:
修改IE的设置:
IE的“选项-高级”,有两个选项默认是钩选的:
Disable Script Debugging(Internet Explorer)
Disable Script Debugging(Other)
中文可能是“禁用脚本调试”,去掉这两项的钩选。

在VS2005“工具-选项-调试-实时”,选中脚本调试。

在需要调试的地方加上debugger;例如:

打开或刷新一下页面就进入断点了。

(2)Javascript IDE开发工具:
1)软件Eclipse+Javascript插件:
见本页-Java系列:-(7)Eclipse插件:-JavaScript插件。

2)软件1st JavaScript Editor Pro 3.8(有比较全面的智能提示,可以设计HTML代码)
http://www.yaldex.com/JSFactory_Pro.htm
1st javascript editor 3.8破解
下载地址:http://download.csdn.net/source/163908
http://blog.csdn.net/hertcloud/archive/2007/04/03/1551053.aspx
使用破解后 程序启动后是不能智能提示的 需要在 设置里面打开(每次启动都需要手动打开..:)破解的不完善.)

3)软件AceHTML Pro v6.6 特别版(有一点智能提示但不是所需要的)
name:www.chinaz.com
sn:WRSG-XCQC-4XXZ-NCGS

4)软件Antechinus JavaScript Editor 9.0(有一点智能提示但不是所需要的)

5)软件JavaScript Plus! 4.1(无智能提示)

6)软件ScrypTik 1.14(无智能提示)

(3)Javascript源码格式化
SourceFormatX-格式化js代码,可以格式被任何软件混淆的js代码,原样保留但中文注释会变成乱码,提供的功能多,界面专业,可以不修改源文件。
http://cn.textrush.com/integrate.htm
SourceFormatX 2.56 的注册破解版
http://hi.baidu.com/hn123/blog/item/41b10df44a75556edcc4742f.html
http://vxer.cn/downloads/SourceFormatX.rar

http://vxer.cn/downloads/SourceFormatX.rar SourceFormatX破解
仅一个功能“格式化目录”不能用(需要正版KEY解码)。使用的时候最好不要开调试器,filemon等工具,因为这个软件有主要的危险代码:
1,用winexec无限开窗口,直到你死机
2,删除你注册表,删了你肯定要重装了!
http://www.textrush.com/download/sfx256sp3.zip SourceFormatX SP3下载

使用 Key Maker 165 制作 内存补丁 针对 2.56 非SP
SP3 版本没有找到下载地址,CRACK提供的版本中部分菜单有英文,且功能莫明其妙,不知道是否有问题.
建议"等待进程闲置时修改"
带上做好的 MemPatch 程序.
http://bbs.pediy.com/attachment.php?attachmentid=3544&d=1164863022
SourceFormatX SP3 内存补丁 带上做好的 MemPatch 程序
http://bbs.pediy.com/attachment.php?attachmentid=3546&d=1164872805


JavaScript Code Improver-格式化js代码,可以格式被任何软件混淆的js代码,但只有第一个注释被保留且不是中文乱码,提供的修改参数少,界面简单,可以不修改源文件。
http://www.jcay.com/javascript-code-improver.html
JavaScript Code Improver 中文语言包
http://blog.csdn.net/KimSoft/archive/2006/05/23/750407.aspx

polystyle-格式化js代码,不能格式被Javascript Obfuscator软件混淆的js代码,很多js文件都不能完全格式化,原样保留但中文注释会变成乱码,提供的功能多,但界面混乱,提供右键格式化功能,不提供保存格式化后的文件的功能要自己copy粘贴,不修改源文件。
http://www.polystyle.com/integrations/
http://www.polystyle.com/walkthrough/

Trita 1.6a-格式化js代码
http://as.onlinedown.net/down/trita-source-formatter-windows-setup.exe
code:1748314567063
注册码:1734759207571

JavaScript源代码格式化工具
http://cn.textrush.com/formatter-javascript.htm

MyEclipse中的默认的JavaScript编辑器提供了格式化格能,只要按一下(CTRL+SHIFT+F)就OK

在线格式化js代码
http://files.cnblogs.com/matrix/beautyjs.htm
http://www.div-css.com/f/tool/js-format-compress.html javascript格式化及压缩工具
http://www.div-css.com/f/tool/js-format-color.html javascript格式化及代码着色工具

(4)Javascript源码混淆压缩
Jasob2.1-混淆器,混淆后不马上修改源文件,提示你保存,而且有两个窗口显示混淆前后的文件,不支持拖入文件,可打开嵌入到页面文件如.aspx文件里的js代码而且灰显其他代码只显示js代码。
http://www.jasob.com/Downloads.html
http://www.jasob.com/Features.html

Javascript Obfuscator-混淆器,混淆后即将源文件修改了,但通过他生成的备份文件可以原样恢复,支持拖入文件,只能打开.js文件,不能打开嵌入到其他文件里的js代码。
http://www.javascript-source.com/
http://www.javascript-source.com/tutorial.html
http://www.javascript-source.com/help.html
JsObfuscator2.01 Crack Version
http://www.sosuo8.com/article/show.asp?id=1383

JsMinGUI-javascript脚本压缩工具,界面简单,没有修改参数的地方,只有一个压缩按钮,其自身没提供恢复被混淆的文件的功能,被混淆后的内容已经去掉了注释内容,支持拖入文件,只能混淆.js文件,不能混淆嵌入到其他文件里的js代码。
http://www.sosuo8.com/article/show.asp?id=1382

JavaScript Chaos Edition(JCE)-JCE Pro Obfuscator,要用命令才能混淆,而且好像只是将字符换成编码,代码的格式都没变,没怎么混淆。
http://www.syntropy.se/?ct=downloads



ESC 1.14-压缩工具,没找到安装文件。
功能比较全的一个压缩程序,压缩分为0-4个级别,其中level4可以对变量进行替换。不过不能对使用回车结尾的语句自动添加分号。
这款工具可自定义压缩级别和是否进行混淆,当然缺点也不是没有,压缩效果一般,而且要求每个JS语句必须以分号结尾,有大括号也不行。
http://www.saltstorm.net/depo/esc/?pod=js

X2JSCompactor-我没用过
http://www.jb51.net/downtools/X2JSCompactor.rar

Rob Seiler的packer-我没用过
这款压缩混淆工具效果也不错,有三种版本,.Net,Perl,和WSH版本,Windows平台下WSH脚本比较适合,命令行操作。
http://dean.edwards.name/download/

在线混淆js代码
http://www.bizstruct.cn/JavascriptOnlineObfuscator/
http://editor.lionsky.net/JSConfusionWebDemo/
MemTronic's FREEWARE HTML/JavaScript Cruncher-Compressor v1.0k
压缩效果好得不一般,混淆出来的代码完全不可读,压缩率可达50%,IE 5+ / NS 7.0 / Mozilla / Opera 7.0 中均可使用
http://hometown.aol.de/_ht_a/memtronic/MemTronic_CruncherCompressor.html

(5)Javascript模块代码:
1-2-3 JavaScript Library!
http://www.wyka-warzecha.com/website/products/javascripts/123library/index.htm
http://www.51windows.net/hw/asp/myjs.htm 脚本收藏
JavaScript Collector 1.1.0.4
http://www.greencow.se/forums/index.php?page=3

第三方开发工具:
(10)http://www.enet.com.cn/article/2004/0421/A20040421304259.shtml FlashPlayer
(6)3DTTeam@Gmail.com 或http://www.ave-imperator.com/ Imperator FLA(可反编译Flash文件)
(11)
Macromedia Dreamweaver V8.0 简体中文破解版下载
http://www.opera.org.cn/download.html
序列号:WPD800-50438-28032-39991(可用)



WPD800-59931-35132-61278

WPD800-51733-95832-20591
WPD800-58830-07932-28016
WPD800-54836-25432-08558
WPD800-59539-90432-67146
WPD800-50834-02532-47689
WPD800-52432-81532-50112
WPD800-54638-29632-99596
WPD800-56234-85532-51032
WPD800-56038-66432-61440
WPD800-50232-89032-26372

WPD800-52838-61732-87019
WPD800-57739-91132-21421
WPD800-56830-42632-79940
WPD800-57939-52332-45529
WPD800-57133-58032-93705

WPD800-50636-01332-11223

序列号生成器,可生成dw8 flash8 fireworks8 的序列号:http://www.jlpop.com/keygen.exe

AV软件系列:
网络传送带 (Net Transport) 2.30.352 简体版(UNICODE)
http://www.onlinedown.net/soft/2919.htm

Streambox VCR V1.0
http://www.skycn.com/soft/8693.html

VideoGet 2.0.2.27
http://www.3ddown.com/soft/31203.htm
http://nuclear-coffee.com/php/download.php?id=VideoGet

一键下载视频(只能下载.flv文件)
http://www.pkez.com/external.html

灵狐网络视频下载大师V2.5.1(只能下载.flv文件)
http://www.qqtag.com/ringfox/

激流神探
http://www.colorwo.cn/

影片地址嗅探器 注册版2.02
http://www.gxdown.net/soft/27061.htm

Project URL Snooper V1.1 Beta 1 汉化版
http://www.skycn.com/soft/8770.html

系统工具:
(1)http://sns.xidian.edu.cn/showsoft.asp?soft_id=15 端口查看工具CurrPorts.v1.02
(3)http://www.codechina.net/resource/html/2006-07/26/152069.html 电脑快捷键大全 1.0
(5)http://www.sysinternals.com/ Process Explorer




(100)http://www.sellsbrothers.com/tools/genghis/ 我忘了这个页面是不是下载某个软件的。

2008年9月3日星期三

文竹的养护管理技术




文竹形态轻盈,秀丽纤细,四季青翠,给人一种清新淡雅的感觉,是家庭花卉植物中非常普遍的一种小型盆栽观赏植物。布置于书房之中更显文雅。

文竹又名云竹、云片竹、山草等。为百合科多年生草本植物,多呈攀援状生长,肉质细根,叶片较小,只有3-5毫米,花朵也小,白色,果实为球形,成熟时紫黑色。

栽培基质宜选用疏松透气且排水良好的微酸性土为最好,在粘质土中生长势差,甚至死亡。

文竹原产于非洲南部地区,性喜阴湿且微风流通的环境,不耐寒冷与酷暑,适宜生长的温度为12-20℃,越冬温度最好保持在5℃以上,当环境温度高于20℃生长时,枝叶容易徒长,使植株失去美丽的身姿而降低了观赏价值。高于25℃时,叶片枯萎发黄。夏季切忌曝晒,但可置于湿润且能通风的树荫下,如有条件,置于空调房间中,并提供较湿润的环境,则生长最适。

文竹不属于喜阳的植物,耐荫性较强,一般选择半阴环境养护最适宜。但冬季温度较低时,一定要给予较好的光照条件,才能利于御寒越冬,保持青翠。

文竹喜湿又怕涝,所以浇水要求比较高,应该十分注意浇水的次数,绝对不能干透再浇水。应在盆土不干透的情况下,保持湿润即可,每次浇水一定要浇透。过多的水分易出现黄叶症状,盆底有接水盘时,一定要及时将盘中的积水倒净,避免因底部被水堵塞而影响透气。所浇之水最好与植株生长的环境温度相近,如果温差过大,容易出现黄叶症状。

文竹喜肥而忌浓肥,最好每周一次浇灌稀释后的有机肥液,也可用无土栽培专用肥料。缺少肥料与浓肥都会造成文竹出现黄叶枯叶症状。温度高于20℃时或冬季低于10℃时停止施肥。

繁殖文竹的方法一般选用播种、分株进行,播种于3-4月进行,点播于10厘米的浅盆中,覆土后淋透水,加盖玻璃,温度保持20-25℃,需要20-30天发芽,苗高5厘米时可上盆。分株一般选择较大些的植株,结合换盆换土进行,只要掰开另植即可,只是注意勿伤根太严重,否则会影响恢复的。

文竹出现叶片发黄时,要及时剪除,如果小叶单独黄化,也要及时修剪。有徒长枝长出时,可以通过短截来整形,达到整株美观和谐的目的。

文竹喜欢清洁流通的环境,如果受到烟尘、煤气、剧性农药的刺激,叶片会发黄、卷曲,甚至枯死。清洗叶片时,应用清水喷洗,并轻轻抖落,然后置于通风处,尽快使叶片上的水分干燥些。

文竹 也称云竹

文竹均原产南非,喜温暖湿润,喜轻质松软肥沃的沙质壤土,宜在半阴处生长。所以千万不要晒太阳哦!
文竹叶子发黄有两个主要原因:一是温度低,二是盆土过干。文竹在18—28℃才能生长好。冬天要让文竹多见阳光,有条件的家庭可把文竹放在向南的阳台上;夏天则要避免见阳光,有散光即可,应放于向阴处。

冬天生暖气,家里比较干燥,这对文竹生长不利,所以每天要向文竹的叶面喷水,以增加湿度。文竹不能在太干或太湿的情况下浇水,这两种情况都会引起文竹叶子发黄。观察盆土的干湿,如果1—2厘米的盆土已干了,就表明应该浇水了。

如果文竹生长不太茂盛,应该施肥。这里有个土办法,给文竹浇白糖水,也能起到增加营养的作用,每20天用5—10%的白糖水浇文竹即可让它长得茂盛。

竹盆栽枝叶变黄的原因及防治方法?
a) 光照太强。文竹喜半阴、忌强光,在夏季如果将其放在阳光直射处,就会造成枝叶枯黄。一旦发生这种现象,就应将花盆移至阴凉处,同时经常对枝叶喷水,增加相对湿度,受害不严重的大多可恢复。
b) 浇水不当。文竹虽然喜欢湿润,但却很怕盆内积水,水多容易烂根,水少则叶尖易干枯。如果有烂根现象发生,就要控制浇水,并经常松土。叶尖干枯者,宜先浇少量水,以后逐渐增加,同时向枝叶上喷水。
c) 养分不足。文竹喜爱肥沃土壤,如果长期不换土加肥,养分供不应求,就会出现枝叶发黄的现象。此时,应每星期浇一次稀薄的液体肥料,并及时浇水和松土。
d) 施肥不当。如果追肥浓度过浓或施用未腐熟完全的肥料,很容易造成肥害,而导致叶子干枯、脱落,一旦发生肥害,就要将盆于倒出,并清除肥料,然后用清水冲洗土团,并更换新的培养土。
e) 冬天管理不善。文竹喜爱温暖,冬天宜向阳,如果此时将它长期放在光线不足的地方,加上通风不良和寒冷,均易引起枝叶枯黄。此时应将起其移放至有阳光的温暖处,同时适当控制浇水,就可以逐步恢复如常。
f) 感染病虫害。文竹一旦感染介壳虫等害虫,也会造成枝叶枯黄,应及时防治。

PHP 商品最新浏览

/*
RecentlyGoods File
Urchin Studio FoxCMS
Version: 1.1.6
Author: luckyfox (xhx@163.net)
Copyright: Urchin Studio (www.itocean.net)
Last Modified: 2008-9-3

*/

//TempNum 显示临时记录数

$TempNum=5;

//setcookie("RecentlyGoods", "12,31,90,39");

//RecentlyGoods 最近商品RecentlyGoods临时变量

if (isset($_COOKIE['RecentlyGoods']))
{
$RecentlyGoods=$_COOKIE['RecentlyGoods'];
$RecentlyGoodsArray=explode(",", $RecentlyGoods);
$RecentlyGoodsNum=count($RecentlyGoodsArray); //RecentlyGoodsNum 当前存储的变量个数

}

if($_GET['Id']!="")
{

$Id=$_GET['Id']; //ID 为得到请求的字符


//如果存在了,则将之前的删除,用最新的在尾部追加

if (strstr($RecentlyGoods, $Id))
{
//echo "已经存在,则不写入COOKIES
";
}
else
{
if($RecentlyGoodsNum <$TempNum) //如果COOKIES中的元素小于指定的大小,则直接进行输入COOKIES
{
if($RecentlyGoods=="")
{
setcookie("RecentlyGoods",$Id,time()+3600);
}
else
{
$RecentlyGoodsNew=$RecentlyGoods.",".$Id;
setcookie("RecentlyGoods", $RecentlyGoodsNew,time()+3600);
}
}
else //如果大于了指定的大小后,将第一个给删去,在尾部再加入最新的记录。
{
$pos=strpos($RecentlyGoods,",")+1; //第一个参数的起始位置
$FirstString=substr($RecentlyGoods,0,$pos); //取出第一个参数
$RecentlyGoods=str_replace($FirstString,"",$RecentlyGoods); //将第一个参数删除
$RecentlyGoodsNew=$RecentlyGoods.",".$Id; //在尾部加入最新的记录
setcookie("RecentlyGoods", $RecentlyGoodsNew,time()+3600);
}

}


}
?>

vb 文件传输函数

Const Max As Long = 65534 '每次最大传送数据
Dim SendPos As Double '发送数据位置
Dim RecPos As Double '接收数据位置(此二变量可实现断点续传)

'传送文件
Sub SendFile(FileName As String, Wnk As Winsock)
'FileName 预发送的文件.
Static iPoss As Double '当前发送位置
Dim SendData() As Byte '二进制数据
Dim Length As Double '记录文件长度
Dim FileNum As Integer
FileNum = FreeFile '获得文件号
Length = FileLen(FileName) '获得文件长度
Open FileName For Binary As FileNum
DoEvents
If Length <= Max Then
ReDim SendData(1 To Length)
Get FileNum, , SendData
Wnk.SendData SendData
Else
While iPos <= Length - Max
ReDim SendData(1 To Max)
Get FileNum, iPos + 1, SendData
Wnk.SendData SendData
iPos = iPos + Max
Wend
End If
ReDim SendData(Length - iPos - 1) '此处注意要-1,否则不会成功!
Get FileNum, iPos + 1, SendData
Wnk.SendData SendData
Close FileNum
Debug.Print FileLen(FileName)
End Sub
'==============================================================
'==============================================================
Sub ReceiveData(FileName As String, Wnk As Winsock, Lens As Long) '接收数据
'FileName 文件保存的位置
Dim RecData() As Byte
Dim Length As Double
Dim FileNum As Integer
FileNum = FreeFile
Open FileName For Binary As FileNum
Length = FileLen(FileName)
ReDim RecData(1 To Lens)
Wnk.GetData RecData
Put FileNum, Length + 1, RecData
Close FileNum
End Sub

2008年8月31日星期日

delphi常用网络函数

{=========================================================================
功 能: 网络函数库
时 间: 2002/10/02
版 本: 1.0
备 注: 没有事情干,抄抄写写整理了一些网络函数供大家使用。
希望大家能继续补充
=========================================================================}
unit Net;

interface
uses
SysUtils
,Windows
,dialogs
,winsock
,Classes
,ComObj
,WinInet;

//得到本机的局域网Ip地址
Function GetLocalIp(var LocalIp:string): Boolean;
//通过Ip返回机器名
Function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean ;
//获取网络中SQLServer列表
Function GetSQLServerList(var List: Tstringlist): Boolean;
//获取网络中的所有网络类型
Function GetNetList(var List: Tstringlist): Boolean;
//获取网络中的工作组
Function GetGroupList(var List: TStringList): Boolean;
//获取工作组中所有计算机
Function GetUsers(GroupName: string; var List: TStringList): Boolean;
//获取网络中的资源
Function GetUserResource(IpAddr: string; var List: TStringList): Boolean;
//映射网络驱动器
Function NetAddConnection(NetPath: Pchar; PassWord: Pchar;LocalPath: Pchar): Boolean;
//检测网络状态
Function CheckNet(IpAddr:string): Boolean;
//检测机器是否登入网络
Function CheckMacAttachNet: Boolean;

//判断Ip协议有没有安装 这个函数有问题
Function IsIPInstalled : boolean;
//检测机器是否上网
Function InternetConnected: Boolean;
implementation

{=================================================================
功 能: 检测机器是否登入网络
参 数: 无
返回值: 成功: True 失败: False
备 注:
版 本:
1.0 2002/10/03 09:55:00
=================================================================}
Function CheckMacAttachNet: Boolean;
begin
Result := False;
if GetSystemMetrics(SM_NETWORK) <> 0 then
Result := True;
end;

{=================================================================
功 能: 返回本机的局域网Ip地址
参 数: 无
返回值: 成功: True, 并填充LocalIp 失败: False
备 注:
版 本:
1.0 2002/10/02 21:05:00
=================================================================}
function GetLocalIP(var LocalIp: string): Boolean;
var
HostEnt: PHostEnt;
Ip: string;
addr: pchar;
Buffer: array [0..63] of char;
GInitData: TWSADATA;
begin
Result := False;
try
WSAStartup(2, GInitData);
GetHostName(Buffer, SizeOf(Buffer));
HostEnt := GetHostByName(buffer);
if HostEnt = nil then Exit;
addr := HostEnt^.h_addr_list^;
ip := Format('%d.%d.%d.%d', [byte(addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
LocalIp := Ip;
Result := True;
finally
WSACleanup;
end;
end;

{=================================================================
功 能: 通过Ip返回机器名
参 数:
IpAddr: 想要得到名字的Ip
返回值: 成功: 机器名 失败: ''
备 注:
inet_addr function converts a string containing an Internet
Protocol dotted address into an in_addr.
版 本:
1.0 2002/10/02 22:09:00
=================================================================}
function GetNameByIPAddr(IPAddr : String;var MacName:String): Boolean;
var
SockAddrIn: TSockAddrIn;
HostEnt: PHostEnt;
WSAData: TWSAData;
begin
Result := False;
if IpAddr = '' then exit;
try
WSAStartup(2, WSAData);
SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr));
HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
if HostEnt <> nil then
MacName := StrPas(Hostent^.h_name);
Result := True;
finally
WSACleanup;
end;
end;

{=================================================================
功 能: 返回网络中SQLServer列表
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败 False
备 注:
版 本:
1.0 2002/10/02 22:44:00
=================================================================}
Function GetSQLServerList(var List: Tstringlist): boolean;
var
i: integer;
sRetValue: String;
SQLServer: Variant;
ServerList: Variant;
begin
Result := False;
List.Clear;
try
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList := SQLServer.ListAvailableSQLServers;
for i := 1 to Serverlist.Count do
list.Add (Serverlist.item(i));
Result := True;
Finally
SQLServer := NULL;
ServerList := NULL;
end;
end;

{=================================================================
功 能: 判断Ip协议有没有安装
参 数: 无
返回值: 成功: True 失败: False;
备 注: 该函数还有问题
版 本:
1.0 2002/10/02 21:05:00
=================================================================}
Function IsIPInstalled : boolean;
var
WSData: TWSAData;
ProtoEnt: PProtoEnt;
begin
Result := True;
try
if WSAStartup(2,WSData) = 0 then
begin
ProtoEnt := GetProtoByName('IP');
if ProtoEnt = nil then
Result := False
end;
finally
WSACleanup;
end;
end;
{=================================================================
功 能: 返回网络中的共享资源
参 数:
IpAddr: 机器Ip
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
WNetOpenEnum function starts an enumeration of network
resources or existing connections.
WNetEnumResource function continues a network-resource
enumeration started by the WNetOpenEnum function.
版 本:
1.0 2002/10/03 07:30:00
=================================================================}
Function GetUserResource(IpAddr: string; var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
Begin
Result := False;
List.Clear;
if copy(Ipaddr,0,2) <> '\\' then
IpAddr := '\\'+IpAddr; //填充Ip地址信息
FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
NetResource.lpRemoteName := @IpAddr[1];//指定计算机名称
//获取指定计算机的网络资源句柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);
if Res <> NO_ERROR then exit;//执行失败
while True do//列举指定工作组的网络资源
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取指定计算机的网络资源名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕
if (Res <> NO_ERROR) then Exit;//执行失败
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1 do
begin
//获取指定计算机中的共享资源名称,+2表示删除"\\",
//如\\192.168.0.1 => 192.168.0.1
List.Add(Temp^.lpRemoteName + 2);
Inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;//执行失败
Result := True;
FreeMem(Buf);
End;

{=================================================================
功 能: 返回网络中的工作组
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function GetGroupList( var List : TStringList ) : Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
NetResource: TNetResource;
Buf: Pointer;
Count,BufSize,Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i,j: SmallInt;
NetworkTypeList: TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败
//获取整个网络中的网络类型信息
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//记录各个网络类型的信息
begin
NetworkTypeList.Add(p);
Inc(P);
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;
for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称
begin//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then break;//执行失败
while true do//列举一个网络类型的所有工作组的信息
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR) then break;
P := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列举各个工作组的信息
begin
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
Inc(P);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then break;//执行失败
end;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;

{=================================================================
功 能: 列举工作组中所有的计算机
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:00:00
=================================================================}
Function GetUsers(GroupName: string; var List: TStringList): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWord;
begin
Result := False;
List.Clear;
FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
NetResource.lpRemoteName := @GroupName[1];//指定工作组名称
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息
//获取指定工作组的网络资源句柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then Exit; //执行失败
while True do//列举指定工作组的网络资源
begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取计算机名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕
if (Res <> NO_ERROR) then Exit;//执行失败
Temp := TNetResourceArray(Buf);
for i := 0 to Count - 1 do//列举工作组的计算机名称
begin
//获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName + 2);
inc(Temp);
end;
end;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
if Res <> NO_ERROR then exit;//执行失败
Result := True;
FreeMem(Buf);
end;

{=================================================================
功 能: 列举所有网络类型
参 数:
List: 需要填充的List
返回值: 成功: True,并填充List 失败: False;
备 注:
版 本:
1.0 2002/10/03 08:54:00
=================================================================}
Function GetNetList(var List: Tstringlist): Boolean;
type
TNetResourceArray = ^TNetResource;//网络类型的数组
Var
p: TNetResourceArray;
Buf: Pointer;
i: SmallInt;
lphEnum: THandle;
NetResource: TNetResource;
Count,BufSize,Res: DWORD;
begin
Result := False;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
if Res <> NO_ERROR then exit;//执行失败
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息
//资源列举完毕 //执行失败
if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
P := TNetResourceArra
{=================================================================
功 能: 映射网络驱动器
参 数:
NetPath: 想要映射的网络路径
Password: 访问密码
Localpath 本地路径
返回值: 成功: True 失败: False;
备 注:
版 本:
1.0 2002/10/03 09:24:00
=================================================================}
Function NetAddConnection(NetPath: Pchar; PassWord: Pchar
;LocalPath: Pchar): Boolean;
var
Res: Dword;
begin
Result := False;
Res := WNetAddConnection(NetPath,Password,LocalPath);
if Res <> No_Error then exit;
Result := True;
end;

{=================================================================
功 能: 检测网络状态
参 数:
IpAddr: 被测试网络上主机的IP地址或名称,建议使用Ip
返回值: 成功: True 失败: False;
备 注:
版 本:
1.0 2002/10/03 09:40:00
=================================================================}
Function CheckNet(IpAddr: string): Boolean;
type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = packed record
TTL: Byte; // Time To Live (used for traceroute)
TOS: Byte; // Type Of Service (usually 0)
Flags: Byte; // IP header flags (usually 0)
OptionsSize: Byte; // Size of options data (usually 0, max 40)
OptionsData: PChar; // Options data buffer
end;

PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWord; // replying address
Status: DWord; // IP status value (see below)
RTT: DWord; // Round Trip Time in milliseconds
DataSize: Word; // reply data size
Reserved: Word;
Data: Pointer; // pointer to reply data buffer
Options: TIPOptionInformation; // reply options
end;

TIcmpCreateFile = function: THandle; stdcall;
TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
TIcmpSendEcho = function(
IcmpHandle: THandle;
DestinationAddress: DWord;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall;

const
Size = 32;
TimeOut = 1000;
var
wsadata: TWSAData;
Address: DWord; // Address of host to contact
HostName, HostIP: String; // Name and dotted IP of host to contact
Phe: PHostEnt; // HostEntry buffer for name lookup
BufferSize, nPkts: Integer;
pReqData, pData: Pointer;
pIPE: PIcmpEchoReply; // ICMP Echo reply buffer
IPOpt: TIPOptionInformation; // IP Options for packet to send
const
IcmpDLL = 'icmp.dll';
var
hICMPlib: HModule;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
hICMP: THandle; // Handle for the ICMP Calls
begin
// initialise winsock
Result:=True;
if WSAStartup(2,wsadata) <> 0 then begin
Result:=False;
halt;
end;
// register the icmp.dll stuff
hICMPlib := loadlibrary(icmpDLL);
if hICMPlib <> null then begin
@ICMPCreateFile := GetProcAddress(hICMPlib, 'IcmpCreateFile');
@IcmpCloseHandle:= GetProcAddress(hICMPlib, 'IcmpCloseHandle');
@IcmpSendEcho:= GetProcAddress(hICMPlib, 'IcmpSendEcho');
if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho = Nil) then begin
Result:=False;
halt;
end;
hICMP := IcmpCreateFile;
if hICMP = INVALID_HANDLE_VALUE then begin
Result:=False;
halt;
end;
end else begin
Result:=False;
halt;
end;
// ------------------------------------------------------------
Address := inet_addr(PChar(IpAddr));
if (Address = INADDR_NONE) then begin
Phe := GetHostByName(PChar(IpAddr));
if Phe = Nil then Result:=False
else begin
Address := longint(plongint(Phe^.h_addr_list^)^);
HostName := Phe^.h_name;
HostIP := StrPas(inet_ntoa(TInAddr(Address)));
end;
end
else begin
Phe := GetHostByAddr(@Address, 4, PF_INET);
if Phe = Nil then Result:=False;
end;

if Address = INADDR_NONE then
begin
Result:=False;
end;
// Get some data buffer space and put something in the packet to send
BufferSize := SizeOf(TICMPEchoReply) + Size;
GetMem(pReqData, Size);
GetMem(pData, Size);
GetMem(pIPE, BufferSize);
FillChar(pReqData^, Size, $AA);
pIPE^.Data := pData;

// Finally Send the packet
FillChar(IPOpt, SizeOf(IPOpt), 0);
IPOpt.TTL := 64;
NPkts := IcmpSendEcho(hICMP, Address, pReqData, Size,
@IPOpt, pIPE, BufferSize, TimeOut);
if NPkts = 0 then Result:=False;

// Free those buffers
FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData);

// --------------------------------------------------------------
IcmpCloseHandle(hICMP);
FreeLibrary(hICMPlib);
// free winsock
if WSACleanup <> 0 then Result:=False;
end;


{=================================================================
功 能: 检测计算机是否上网
参 数: 无
返回值: 成功: True 失败: False;
备 注: uses Wininet
版 本:
1.0 2002/10/07 13:33:00
=================================================================}
function InternetConnected: Boolean;
const
// local system uses a modem to connect to the Internet.
INTERNET_CONNECTION_MODEM = 1;
// local system uses a local area network to connect to the Internet.
INTERNET_CONNECTION_LAN = 2;
// local system uses a proxy server to connect to the Internet.
INTERNET_CONNECTION_PROXY = 4;
// local system's modem is busy with a non-Internet connection.
INTERNET_CONNECTION_MODEM_BUSY = 8;
var
dwConnectionTypes : DWORD;
begin
dwConnectionTypes := INTERNET_CONNECTION_MODEM+ INTERNET_CONNECTION_LAN
+ INTERNET_CONNECTION_PROXY;
Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;

end.
//错误信息常量
unit Head;

interface
const
C_Err_GetLocalIp = '获取本地ip失败';
C_Err_GetNameByIpAddr = '获取主机名失败';
C_Err_GetSQLServerList = '获取SQLServer服务器失败';
C_Err_GetUserResource = '获取共享资失败';
C_Err_GetGroupList = '获取所有工作组失败';
C_Err_GetGroupUsers = '获取工作组中所有计算机失败';
C_Err_GetNetList = '获取所有网络类型失败';
C_Err_CheckNet = '网络不通';
C_Err_CheckAttachNet = '未登入网络';
C_Err_InternetConnected ='没有上网';

C_Txt_CheckNetSuccess = '网络畅通';
C_Txt_CheckAttachNetSuccess = '已登入网络';
C_Txt_InternetConnected ='上网了';

implementation

end.