<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:content="http://purl.org/Rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>潇洒走一回！ (存储空间：http://kashim.ys168.com/)</title><link>http://www.i170.com/user/makowolf/Rss</link><description></description><language>zh-cn</language><pubDate>Sat, 22 Nov 2008 07:24:22  +0800</pubDate><generator>i170.com</generator><image><title>潇洒走一回！ (存储空间：http://kashim.ys168.com/)</title><url>http://www.i170.comattavatar_2/makowolf_2284.BMP</url><link>http://www.i170.com/user/makowolf/Rss</link></image> <item><link>http://www.i170.com/Article/58782</link><title><![CDATA[Windows 系统错误代码(收藏)]]></title><author>makowolf</author><category></category><pubDate>Thu, 01 Mar 2007 09:47:12  +0800</pubDate><description><![CDATA[Microsoft Windows 系统错误代码简单分析：<br>
<br>
0000 操作已成功完成。<br>
0001 错误的函数。<br>
0002 系统找不到指定的文件。<br>
0003 系统找不到指定的路径。<br>
0004 系统无法打开文件。<br>
0005 拒绝访问。<br>
0006 句柄无效。<br>
0007 存储区控制块已损坏。<br>
0008 可用的存储区不足，无法执行该命令。<br>
0009 存储区控制块地址无效。<br>
0010 环境错误。<br>
0011 试图使用不正确的格式加载程序。<br>
0012 访问代码无效。<br>
0 013 数据无效。<br>
0014 可用的存储区不足，无法完成该操作。<br>
0015 系统找不到指定的驱动器。<br>
0016 无法删除该目录。<br>
0017 系统无法将文件移到其他磁盘驱动器上。<br>
0018 没有其他文件。<br>
0019 媒体写保护。<br>
0020 系统找不到指定的设备。<br>
0021 设备尚未准备好。<br>
0022 设备无法识别该命令。<br>
0023 数据错误（循环冗余检查）。<br>
0024 程序发出命令，但是该命令的长度错误。<br>
0025 驱动器在磁盘上无法定位指定的区域或磁道。<br>
0026 无法访问指定的磁盘或软盘。<br>
0027 驱动器找不到所请求的扇区。<br>
0028 打印机缺纸。<br>
0029 系统无法写入指定的设备。<br>
0030 系统无法读取指定的设备。<br>
0031 与系统连接的设备不能正常运转。<br>
0032 其他进程正使用该文件，因此现在无法访问。<br>
0033 另一进程已锁定该文件的某一部分，因此现在无法访问。<br>
0034 驱动器中的软盘不正确。请将 %2 （卷标序列号: %3）插入驱动器 %1。<br>
0036 打开共享的文件太多。<br>
0038 已到达文件结尾。<br>
0039 磁盘已满。<br>
0050 不支持此网络请求。<br>
0051 远程计算机无法使用。<br>
0052 网络中存在重名。<br>
0053 找不到网络路径。<br>
0054 网络正忙。<br>
0055 指定的网络资源或设备已不可用。<br>
0056 已经达到网络命令的极限。<br>
0057 网络适配器出现错误。<br>
0058 指定的服务器无法执行所请求的操作。<br>
0059 网络出现意外错误。<br>
0060 远程适配器不兼容。<br>
0061 打印机队列已满。<br>
0062 服务器上没有存储等待打印的文件的空间。<br>
0063 已经删除等候打印的文件。<br>
0064 指定的网络名无法使用。<br>
0065 拒绝访问网络。<br>
0066 网络资源类型错误。<br>
0067 找不到网络名。<br>
0068 已超过本地计算机网络适配器卡的名称极限。<br>
0069 已超过网络 BIOS 会话的极限。<br>
0070 远程服务器已经暂停或者正在启动过程中。<br>
0071 由于该计算机的连接数目已达到上限，此时无法再连接到该远程计算机。<br>
0072 指定的打印机或磁盘设备已经暂停。<br>
0080 该文件存在。<br>
0082 无法创建该目录或文件。<br>
0083 INT 24 失败。<br>
0084 处理该请求的存储区不可用。<br>
0085 正在使用该本地设备名。<br>
0086 指定的网络密码不正确。<br>
0087 参数错误。<br>
0088 网络出现写入错误。<br>
0089 此时系统无法启动其他进程。<br>
0100 无法创建其他系统标志。<br>
0101 属于其他进程的专用标志。<br>
0102 标志已经设置，无法关闭。<br>
0103 无法再次设置该标志<br>
0104 中断时无法请求专用标志。<br>
0105 此标志先前的所有权已终止。<br>
0106 请将软盘插入驱动器 %1。<br>
0107 后续软盘尚未插入，程序停止。<br>
0108 磁盘正在使用或已由其他进程锁定。<br>
0109 管道已经结束。<br>
0110 系统无法打开指定的设备或文件。<br>
0111 文件名太长。<br>
0112 磁盘空间不足。<br>
0113 没有其他可用的内部文件标识符。<br>
0114 目标内部文件标识符不正确。<br>
0117 该应用程序所运行的 IOCTL 调用不正确。<br>
0118 校验写入的开关参数值不正确。<br>
0119 系统不支持所请求的命令。<br>
0120 该系统上不支持此功能。<br>
0121 标记已超时。<br>
0123 文件名、目录名或卷标语法错误。<br>
0124 系统调用层不正确。<br>
0125 磁盘没有卷标。<br>
0126 找不到指定的模块。<br>
0127 找不到指定的过程。<br>
0128 没有要等候的子进程。<br>
0129 模式下运行。<br>
0130 试图使用操作(而非原始磁盘I/O)的已打开磁盘分区的文件句柄。<br>
0131 试图将文件指针移至文件开头之前。<br>
0132 无法在指定的设备或文件中设置文件指针。<br>
0133 对于包含已连接驱动器的驱动器，不能使用 JOIN 或 SUBST 命令。<br>
0134 试图在已经连接的驱动器上使用 JOIN 或 SUBST 命令。<br>
0135 试图在已经替换的驱动器上使用 JOIN 或 SUBST 命令。<br>
0136 系统试图删除尚未连接的驱动器的 JOIN。<br>
0137 系统试图删除尚未替换的驱动器的替换项。<br>
0138 系统试图将驱动器连接到已连接的驱动器下的目录。<br>
0139 系统试图将驱动器替换成已替换的驱动器下的目录。<br>
0140 系统试图将驱动器连接到已替换的驱动器的一个目录中。<br>
0141 系统试图将驱动器替换成到已连接的驱动器下的目录。<br>
0142 此时系统无法运行 JOIN 或 SUBST。<br>
0143 系统无法将驱动器连接到或替换成同一驱动器下的目录。<br>
0144 此目录不是该根目录的子目录。<br>
0145 该目录未清空。<br>
0146 指定的路径已经在替换中使用。<br>
0147 资源不足，无法执行该命令。<br>
0148 此时无法使用指定的路径。<br>
0149 试图连接或替换某个驱动器目录，该驱动器上的某个目录是上一次替换的目标目录。<br>
0150 CONFIG.SYS 文件未指定系统跟踪信息，或禁止跟踪。<br>
0151 DosMuxSemWait 的指定信号事件的数目不正确。<br>
0152 DosMuxSemWait 没有运行；已经设置太多的标志。<br>
0153 DosMuxSemWait 列表不正确。<br>
0154 输入的卷标超过目标文件系统的标号字符长度极限。<br>
0155 无法创建其他线程。<br>
0156 接收进程拒绝该信号。<br>
0157 已经放弃该区域，因此无法锁定。<br>
0158 该区域已经解除锁定。<br>
0159 线程标识符的地址错误。<br>
0160 传到 DosExecPgm 的参数字符串错误。<br>
0161 指定的路径无效。<br>
0162 信号已挂起。<br>
0164 系统无法创建其他线程。<br>
0167 无法锁定文件的范围。<br>
0170 所要求的资源正在使用中。<br>
0173 锁定请求对于提供的取消区域不重要。<br>
0174 文件系统不支持到锁定类型的自动更改。<br>
0180 系统检测到错误的区域号码。<br>
0182 操作系统无法运行 %1。<br>
0183 不能创建已经存在的文件。<br>
0186 传送的标志不正确。<br>
0187 找不到指定的系统信号名称。<br>
0188 操作系统无法运行 %1。<br>
0189 操作系统无法运行 %1。<br>
0190 操作系统无法运行 %1。<br>
0191 无法在 Win32 模式下运行 %1。<br>
0192 操作系统无法运行 %1。<br>
0193 %1 不是有效的 Win32 应用程序。<br>
0194 操作系统无法运行 %1。<br>
0195 操作系统无法运行 %1。<br>
0196 操作系统无法运行此应用程序。<br>
0197 当前无法配置操作系统运行此应用程序。<br>
0198 操作系统无法运行 %1。<br>
0199 操作系统无法运行此应用程序。<br>
0200 代码段应小于 64K。<br>
0201 操作系统无法运行 %1。<br>
0202 操作系统无法运行 %1。<br>
0203 系统找不到输入的环境选项。<br>
0205 在命令子 树中的进程没有信号句柄<br>
0206 文件名或扩展名太长。<br>
0207 环 2 堆栈正在使用中。<br>
0208 输入的全局文件名字符 * 或 ? 不正确，或指定的全局文件名字符太多。<br>
0209 所发送的信号不正确。<br>
0210 无法设置信号处理程序。<br>
0212 区域已锁定，无法重新分配。<br>
0214 附加到此程序或动态链接模块的动态链接模块太多。<br>
0215 无法嵌套调用 LoadModule。<br>
0216 图像文件 %1 有效，但不适用于本机类型。<br>
0230 管道状态无效。<br>
0231 所有的管道实例都处于忙状态。<br>
0232 管道正在关闭。<br>
0233 在管道的另一端没有进程。<br>
0234 有更多可用的数据。<br>
0240 已取消会话。<br>
0254 指定的扩展属性名无效。<br>
0255 扩展属性不一致。<br>
0258 等待操作过时。<br>
0259 没有其他可用数据。<br>
0266 无法使用复制功能。<br>
0267 目录名无效。<br>
0275 扩展属性不匹配缓冲区。<br>
0276 所装载的文件系统上的扩展属性文件已被损坏。<br>
0277 扩展属性表格文件已满。<br>
0278 指定的扩展属性句柄无效。<br>
0282 安装的文件系统不支持扩展属性。<br>
0288 试图释放不属于调用者的多路同步信号。<br>
0298 信号投递的次数太多。<br>
0299 仅完成部分 ReadProcessMemory 或 WriteProcessMemory 请求。<br>
0300 操作锁定请求被拒绝。<br>
0301 系统接收了一个无效的操作锁定确认。<br>
0317 在 %2 的消息文件中，系统无法找到消息号为 0x%1 的消息文本。<br>
0487 试图访问无效地址。<br>
0534 运算结果超过 32 位。<br>
0535 该管道的另一方有一进程。<br>
0536 等候进程打开管道的另一端。<br>
0994 拒绝对扩展属性的访问。<br>
0995 由于线程退出或应用程序的要求，I/O 操作异常终止。<br>
0996 重叠的 I/O 事件不处于已标记状态。<br>
0997 正在处理重叠的 I/O 操作。<br>
0998 对内存位置的无效访问。<br>
0999 执行页内操作出错。<br>
1001 递归太深；堆栈溢出。<br>
1002 窗口无法用来发送消息。<br>
1003 无法完成此项功能。<br>
1004 标志无效。<br>
1005 卷不包含已识别的文件系统。请确认所有需要的文件系统驱动程序都已经加载，而且卷没有任何损坏。<br>
1006 某文件的卷已在外部改变，因而打开的文件不再有效。<br>
1007 要求的操作无法以全屏幕模式执行。<br>
1008 试图引用并不存在的符号。<br>
1009 配置注册表数据库已损坏。<br>
1010 配置注册表主键无效。<br>
1011 无法打开配置注册表主键。<br>
1012 无法读取配置注册表主键。<br>
1013 无法写入配置注册表主键。<br>
1014 必须使用日志文件或其他副本来恢复注册表数据库中的某个文件。恢复成功。<br>
1015
注册表已损坏。可能是一个包含注册表数据文件的结构已损坏，也可能内存中该文件的系统映像已损坏，或者因为备份副本（或日志）不存在（或损坏）导致无法恢复该文件。<br>
1016 由注册表引起的 I/O 操作发生了不可恢复的错误。注册表将不能读取、写出或刷新包含注册表系统映像的其中一个文件。<br>
1017 系统试图将文件加载或还原到注册表中，但是，指定的文件不是注册表文件格式。<br>
1018 试图在注册表键（已经标记为删除）中完成的操作非法。<br>
1019 系统无法在注册表日志文件中分配所需的空间。<br>
1020 无法在已经有子键或键值的注册表项中创建符号链接。<br>
1021 在易失的父键下不能创建固定的子键。<br>
1022 通知的更改请求已经完成，并且返回信息还没有被送到调用者的缓冲区中。调用者需要列举所有文件以找到改动的内容。<br>
1051 已将停止控制发送给与其他运行服务相关的服务。<br>
1052 所要求的控制对此服务无效。<br>
1053 服务没有及时地响应启动或控制请求。<br>
1054 无法为该服务创建线程。<br>
1055 服务数据库已锁定。<br>
1056 该服务的实例已在运行。<br>
1057 帐户名无效或者不存在，或者指定帐户名的密码无效。<br>
1058 服务无法启动，可能因为被禁用，也可能因为没有关联的可用设备<br>
1059 已付搜贩竦拇邮艄叵怠?<br>
1060 指定的服务不是所安装的服务。<br>
1061 该服务此时无法接收控制消息。<br>
1062 服务尚未启动。<br>
1063 服务进程无法连接到服务控制程序。<br>
1064 处理控制请求时，服务出现意外情况。<br>
1065 指定的数据库不存在。<br>
1066 服务返回服务特定的错误码。<br>
1067 进程意外地终止。<br>
1068 无法启动从属服务或组。<br>
1069 由于登录失败，没有启动服务。<br>
1070 启动后，服务保持在启<br>
动挂起状态。<br>
1071 指定的服务数据库锁定无效。<br>
1072 指定的服务已经标记为删除。<br>
1073 指定的服务已经存在。<br>
1074 系统当前正以上一次运行成功的配置运行。<br>
1075 从属服务不存在，或已经标记为删除。<br>
1076 已接受使用当前引导作为最后的有效控制设置。<br>
1077 自从上一次启动以后，没有再次启动过该服务。<br>
1078 该名称已经用作服务名或服务显示名。<br>
1079 此服务的帐户不同于运行于同一进程上的其它服务的帐户。<br>
1080 只能为 Win32 服务设置失败操作，不能为驱动程序设置。<br>
1081 这个服务所运行的进程和服务控制管理器相同。所以，如果服务进程意外中止的话，服务控制管理器无法进行任何操作。<br>
1082 这个服务没有设置恢复程序。<br>
1083 配置成在该可执行程序中运行的这个服务不能执行该服务<br>
1100 已经到达磁带的物理尽头。<br>
1101 磁带访问到文件标记。<br>
1102 到达磁带或分区首部。<br>
1103 磁带访问到文件组的末尾。<br>
1104 磁带上没有其他数据。<br>
1105 磁带无法分区。<br>
1106 访问多重卷分区的新磁带时，当前的区块大小不正确。<br>
1107 加载磁带时，找不到磁带分区信息。<br>
1108 无法锁定媒体退出功能。<br>
1109 无法卸载媒体。<br>
1110 驱动器中的媒体已<br>
<br>
<br>
<br>
<br>
<br>
经更改<br>
1111 已经复位 I/O 总线。<br>
1112 驱动器中没有媒体。<br>
1113 在目标多字节代码页中不存在对单码字符的映射。<br>
1114 动态链接库 (DLL) 初始化例程失败。<br>
1115 正在关闭系统。<br>
1116 无法终止系统关机，因为没有进行中的关机操作。<br>
1117 由于 I/O 设备出现错误，无法运行该请求。<br>
1118 串行设备初始化失败。将卸载串行驱动程序。<br>
1119 无法打开正与其他设备共享中断请求 (IRQ) 的设备。至少有一个使用该 IRQ 的设备已经打开。<br>
1120 由于再次写入串行口，串行 I/O 操作已结束。（IOCTL_SERIAL_XOFF_COUNTER 为零。）<br>
1121 由于超时，串行 I/O 操作已结束。 (IOCTL_SERIAL_XOFF_COUNTER 未达到零。)<br>
1122 在软盘上找不到标识符地址标记。<br>
1123 软盘扇区标识符字段与软盘控制器磁道地址不匹配。<br>
1124 软盘控制器报告软盘驱动程序不能识别的错误。<br>
1125 软盘控制器返回的结果和注册的不一致。<br>
1126 访问硬盘时，再校准操作失败，再试一次后也无法操作。<br>
1127 访问硬盘时，磁盘操作失败，再试一次后仍没有作用。<br>
1128 访问硬盘时，需要重启动磁盘控制器，但仍未成功。<br>
1129 磁带已卷到尽头。<br>
1130 可用的服务器存储区不足，无法执行该命令。<br>
1131 检测到潜在的死锁情况。<br>
1132 指定的基址或文件偏移量没有正确对齐。<br>
1140 试图更改系统电源状态的操作被另一应用程序或驱动程序禁止。<br>
1141 系统 BIOS 无法更改系统电源状态。<br>
1142 试图在一文件上创建超过系统允许数额的链接。<br>
1150 指定的程序需要新的 Windows 版本。<br>
1151 指定的程序不是 Windows 或 MS-DOS 程序。<br>
1152 无法启动指定程序的多个实例。<br>
1153 指定的程序是为 Windows 的早期版本编写的。<br>
1154 运行此应用程序所需的某个库文件已损。<br>
1155 没有应用程序与该操作中所指定的文件关联。<br>
1156 将命令发送到应用程序时出现错误。<br>
1157 找不到运行此应用程序所需的某个库文件。<br>
1158 当前进程已使用了 Window 管理器对象的系统允许的所有句柄。<br>
1159 消息只能与同步操作一起使用。<br>
1160 指出的源元素没有媒体。<br>
1161 指出的目标元素已包含媒体。<br>
1162 指出的元素不存在。<br>
1163 指出的元素是未显示的存储资源的一部分。<br>
1164 指出的设备需要重新初始化，因为硬件有错误。<br>
1165 设备显示在尝试进一步操作之前需要清除。<br>
1166 设备显示它的门仍是打开状态。<br>
1167 设备没有连接。<br>
1168 找不到元素。<br>
1169 索引中没有同指定项相匹配的项。<br>
1170 在对象上不存在指定的属性集。<br>
1171 传递到 GetMouseMovePoints 的点不在缓冲区中。<br>
1172 跟踪(工作站)服务没运行。<br>
1173 找不到卷 ID。<br>
1175 无法删除要被替换的文件。<br>
1176 无法将替换文件移到要被替换的文件。要被替换的文件保持原来的名称。<br>
1177 无法将替换文件移到要被替换的文件。要被替换的文件已被重新命名为备份名称。<br>
1178 卷更改记录被删除。<br>
1179 卷更改记录服务不处于活动中。<br>
1180 找到一份文件，但是可能不是正确的文件。<br>
1181 日志项已从日志中删除。<br>
1200 指定的设备名无效。<br>
1201 设备当前虽然未连接，但它是记忆连接。<br>
1202 试图记起已经记住的设备。<br>
1203 网络供应商不接受给定的网络路径。<br>
1204 指定的网络供应商名无效。<br>
1205 无法打开网络连接配置文件。<br>
1206 网络连接配置文件已损坏。<br>
1207 无法列举非包容类。<br>
1208 出现扩展错误。<br>
1209 指定组名的格式无效。<br>
1210 指定计算机名的格式无效。<br>
1211 指定事件名的<br>
1212 指定域名的格式无效。<br>
1213 指定服务名的格式无效。<br>
1214 指定网络名的格式无效。<br>
1215 指定共砻母袷轿扌А?<br>
1216 指定密码的格式无效。<br>
1217 指定的邮件名无效。<br>
1218 指定邮件目的地的格式无效。<br>
1219 所提供的凭据与现有凭据设置冲突。<br>
1220 试图与网络服务器建立会话，但目前与该服务器建立的会话太多。<br>
1221 网络上的其他计算机已经使用该工作组或域名。<br>
1222 网络不存在或者没有启动。<br>
1223 用户已经取消该操作。<br>
1224 所要求的操作无法在已经打开用户映射区域的文件中运行。<br>
1225 远程系统拒绝网络连接。<br>
1226 已经关闭网络连接。<br>
1227 网络传输的终点已经有一个地址与其关联。<br>
1228 网络终点尚未与地址关联。<br>
1229 试图在不存在的网络连接中操作。<br>
1230 试图在活动的网络连接上进行无效操作。<br>
1231 不能访问网络位置。有关网络疑难解答的信息，请参阅 Windows 帮助。<br>
1232 不能访问网络位置。有关网络疑难解答的信息，请参阅 Windows 帮助。<br>
1233 不能访问网络位置。有关网络疑难解答的信息，请参阅 Windows 帮助。<br>
1234 远程系统的目标网络端点没有运行任何服务。<br>
1235 该请求已经终止。<br>
1236 本地系统已经终止网络连接。<br>
1237 无法完成操作。请再试一次。<br>
1238 无法创建到该服务器的连接，因为已经到达了该帐户同时连接的最大数目。<br>
1239 试图在该帐户未授权的时间内登录。<br>
1240 尚未授权此帐户从该站登录网络。<br>
1241 网络地址无法用于要求的操作。<br>
1242 服务已经注册。<br>
1243 指定的服务不存在。<br>
1244 由于尚未验证用户身份，无法执行要求的操作。<br>
1245 由于用户尚未登录网络，无法运行要求的操作。指定的服务不存在。<br>
1246 继续工作。<br>
1247 完成初始化操作后，试图再次运行初始化操作。<br>
1248 没有其他本地设备。<br>
1249 指定的站点不存在。<br>
1250 具有指定名称的域控制器已经存在。<br>
1251 只有连接到服务器上时，才支持该操作。<br>
1252 即使没有改动，组策略框架也应该调用扩展。<br>
1253 指定的用户没有一个有效的配置文件。<br>
1254 Microsoft Small Business Server 不支持此操作。<br>
1300 不是对所有的调用方分配引用特权。<br>
1301 帐户名与安全标识符之间的映射未完成。<br>
1302 没有为该帐户明确地设置系统配额限制。<br>
1303 没有可用的密钥。返回已知的密钥。<br>
1304 密码太复杂，无法转换成 LAN Manager 密码。返回的 LAN Manager 密码是空字符串。<br>
1305 修订级别未知。<br>
1306 表示两个修订级别不兼容。<br>
1307 无法将此安全标识符指定为该对象的拥有者。<br>
1308 无法将此安全标识符指定为主要的对象组。<br>
1309 当前并未模拟客户的线程试图操作模拟令牌。<br>
1310 不可以禁用该组。<br>
1311 目前没有可用的登录服务器处理登录请求。<br>
1312 指定的登录会话不存在。该会话可能已终止。<br>
1313 指定的权限不存在。<br>
1314 客户不保留请求的权限。<br>
1315 提供的名称不是正确的帐户名称格式。<br>
1316 指定的用户已经存在。<br>
1317 指定的用户不存在。<br>
1318 指定的组已经存在。<br>
1319 指定的组不存在。<br>
1320 或者指定的用户帐户已经是某个特定组的成员，或者也可能指定的组非空而不能被删除。<br>
1321 指定的用户帐户不是所指定组帐户的成员。<br>
1322 上次保留的管理帐户无法关闭或删除。<br>
1323 无法更新密码。所输入的密码不正确。<br>
1324 无法更新密 码。所提供的新密码包含不可用于密码的值<br>
1325 无法更新密码。为新密码提供的值不符合字符域的长度、复杂性或历史要求。<br>
1326 登录失败: 用户名未知或密码错误。<br>
1327 登录失败: 用户帐户限制。<br>
1328 登录失败: 违反帐户登录时间限制。<br>
1329 登录失败: 禁止用户登录到该计算机上。<br>
1330 登录失败: 指定的帐户密码已过期。<br>
1331 登录失败: 当前禁用帐户。<br>
1332 未完成帐户名与安全性标识符之间的映射。<br>
1333 一次请求的本地用户标识符(LUID)太多。<br>
1334 没有其他可用的本地用户标识符(LUID)。<br>
1335 对这个特定使用来说，安全标识符的子部分是无效的。<br>
1336 访问控制清单(ACL)结构无效。<br>
1337 安全标识符结构无效。<br>
1338 安全描述符结构无效。<br>
1340 无法创建继承的访问控制列表(ACL)或访问控制项目(ACE)。<br>
1341 当前已禁用服务器。<br>
1342 当前已启用服务器。<br>
1343 所提供的值是无效的标识符授权值。<br>
1344 没有更多的内存用于更新安全信息。<br>
1345 指定的属性无效，或指定的属性与整个组的属性不兼容。<br>
1346 或者没有提供所申请的模仿级别，或者提供的模仿级别无效。<br>
1347 无法打开匿名级安全性符号。<br>
1348 所请求的验证信息类别无效。<br>
1349 该类符号不能以所尝试的方式使用。<br>
1350 无法在没有相关安全性的对象上运行安全操作。<br>
1351 未能从域控制器读取配置信息，或者是因为机器不可使用，或者是访问被拒绝<br>
1352 安全帐户管理程序(SAM)或本地安全颁发机构(LSA)服务器状态不正确，所以无法运行安全操作。<br>
1353 域处于执行安全操作的错误状态。<br>
1354 该操作只能在域的主域控制器中执行。<br>
1355 指定的域不存在或联系不上。<br>
1356 指定的域已经存在。<br>
1357 试图超过每个服务器域数目的极限。<br>
1358 由于严重的媒体错误或磁盘的数据结构损坏，无法完成所请求的操作<br>
1359 发生内部错误。<br>
1360 通用的访问类型包含在访问掩码中，该掩码已经映射为非通用类型。<br>
1361 安全性描述符的格式错误（绝对或自相关）。<br>
1362 请求的操作只准登录进程使用。该调用过程并未被记录为登录进程。<br>
1363 无法用已经使用的标识符来启动新的登录会话。<br>
1364 指定的确认数据包未知。<br>
1365 登录会话的状态与请求的操作不一致。<br>
1366 登录会话标识符正在使用中。<br>
1367 登录请求包含无效的登录类型值。<br>
1368 在使用命名管道读取数据之前，无法经由该管道模拟。<br>
1369 注册表子树的事务状态与所请求的操作不兼容。<br>
1370 突发的内部安全性数据库故障。<br>
1371 无法在内部帐户下运行该操作。<br>
1372 无法在该内部特定组中运行该操作。<br>
1373 无法在该内部特定用户中运行该操作。<br>
1374 因为该组当前是用户的主要组，所以不能从此组中删除用户。<br>
1375 该符号已作为主要符号使用。<br>
1376 指定的本地组不存在。<br>
1377 指定的帐户名不是本地组的成员。<br>
1378 指定的帐户名已经是本地组的成员。<br>
1379 指定的本地组已经存在。<br>
1380 登录失败: 用户在本计算机上没有被授与所需注册类型。<br>
1381 超过了可以存储在单个系统中的最大机密限制。<br>
1382 机密的长度超过了最大允许值。<br>
1383 本地安全授权数据库包含内部不一致的错误。<br>
1384 登录时，用户的安全性上下文累积太多的安全标识符。<br>
1385 登录失败: 用户在本计算机上没有被授与所需注册类型。<br>
1386 经交叉加密的密码必须更改用户密码。<br>
1387 成员不存在，因此无法将其添加到本地组或从中删除。<br>
1388 新成员的帐户类型有误，因此无法将其添加到本地组。<br>
1389 指定的安全标识符太多。<br>
1390 经交叉加密的密码必须更改该用户密码。<br>
1391 表示 ACL 没有可继承的组件。<br>
1392 文件或目录已损坏，无法读取数据。<br>
1393 磁盘结构已损坏，无法读取数据。<br>
1394 指定的登录会话没有用户会话密钥。<br>
1395 正在访问的服务允许特定数目的连接。因为连接的数目已达到服务可接受的数目，所以此时无法创建新的服务连接。<br>
1396 登录失败: 该目标帐户名称不正确。<br>
1397 相互身份验证失败。该服务器在域控制器的密码过期。<br>
1398 在客户机和服务器之间有一个时间差。<br>
1400 窗口句柄无效。<br>
1401 菜单句柄无效。<br>
1402 光标句柄无效。<br>
1403 加速键表的句柄无效。<br>
1404 挂接句柄无效。<br>
1405 多重窗口位置结构句柄无效。<br>
1406 无法创建最上层的子窗口。<br>
1407 找不到窗口类。<br>
1408 窗口无效；属于其他线程。<br>
1409 已经注册热键。<br>
1410 类已经存在。<br>
1411 类不存在。<br>
1412 类窗口仍打开着。<br>
1413 索引无效。<br>
1414 图标 句柄无效。<br>
1415 使用私人对话框窗口字。<br>
1416 找不到列表框标识符。<br>
1417 找不到任何通配符。<br>
1418 线程没有打开剪贴板。<br>
1419 尚未注册热键。<br>
1420 该窗口不是有效的对话框窗口。<br>
1421 找不到控制标识符。<br>
1422 由于没有编辑控制，因此该组合框的消息无效。<br>
1423 窗口不是组合框。<br>
1424 高度必须小于 256。<br>
1425 设备上下文(DC)句柄无效。<br>
1426 挂接过程类型无效。<br>
1427 挂接过程无效。<br>
1428 不能在无模块句柄的情况下设置非本地的挂接。<br>
1429 只能全局设置该挂接过程。<br>
1430 已安装日记挂接过程。<br>
1431 未安装挂接过程。<br>
1432 单选列表框的消息无效。<br>
1433 LB_SETCOUNT 发送到活动的列表框。<br>
1434 该列表框不支持制表符。<br>
1435 无法破坏由其他线程所创建的对象。<br>
1436 子窗口不能有菜单。<br>
1437 窗口没有系统菜单。<br>
1438 消息框样式无效。<br>
1439 系统范围内的(SPI_*)的参数无效。<br>
1440 屏幕已经锁定。<br>
1441 多重窗口位置结构中所有窗口句柄必须具有相同的父
]]></description><guid>http://www.i170.com/Article/58782</guid><trackback:ping>http://www.i170.com/Article/58782/trackback</trackback:ping><comments>http://www.i170.com/Article/58782#comment</comments><wfw:commentRss>http://www.i170.com/Article/58782/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/54481</link><title><![CDATA[PHP搜索引擎技术核心揭密(转)]]></title><author>makowolf</author><category></category><pubDate>Wed, 10 Jan 2007 14:20:03  +0800</pubDate><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
这是一篇精彩的编程教学文章，不但详细地剖析了搜索引擎的原理，也提供了笔者自己对使用ＰＨＰ编制搜索引擎的一些思路。整篇文章深入浅出，相信无论是高手还是菜鸟，都能从中得到不少的启发。<br>
<br>
　　谈到网页搜索引擎时，大多数人都会想到雅虎。的确，雅虎开创了一个互联网络的搜索时代。然而，雅虎目前用于搜索网页的技术却并非该公司原先自己开发的。2000年8月，雅虎采用了Google（www.google.com）这家由斯坦福大学学生创建的风险公司的技术。理由非常简单，Google的搜索引擎比雅虎先前使用的技术能更快、更准确搜索到所需要的信息。<br>
<br>
　　让我们自己来设计、开发一个强劲、高效的搜索引擎和数据库恐怕短时间内在技术、资金等方面是不可能的，不过，既然雅虎都在使用别人的技术，那么我们是不是也可以使用别人现成的搜索引擎网站呢？<br>
<br>
剖析编程思路<br>
<br>
　　我们可以这样设想：模拟一个查询，向某个搜索引擎网站发出相应格式的搜索命令，然后传回搜索结果，对结果的HTML代码进行分析，剥离多余的字符和代码，最后按所需要的格式显示在我们自己的网站页面里。<br>
<br>
　　这样，问题的关键就在于，我们要选定一个搜索信息准确（这样我们的搜索才会更有意义啊）、速度快（因为我们分析搜索结果并显示需要额外的时间），搜索结果简洁（便于进行HTML源代码分析和剥离）的搜索网站，由于新一代搜索引擎Google的各种优良特性，这里我们选择它为例，来看看用PHP怎样实现后台对Google(www.google.com)搜索、前台个性化显示这一过程。<br>
<br>
　　我们先来看看Google的查询命令的构成。进入www.google.com网站，在查询栏中输入“abcd”，点击查询按钮，我们可以发现浏览器的地址栏变成："http://www.google.com/search?q=abcd&amp;btnG=Google%CB%D1%CB%F7&amp;hl=zh-CN&amp;lr="，可见，Google是通过表单的get方式来传递查询参数并递交查询命令的。我们可以使用PHP中的file()函数来模拟这个查询过程。&nbsp;<br>
<br>
了解File（）函数<br>
<br>
　　语法: array file(string filename);<br>
<br>
　　返回值为数组，将文件全部读入数组变量中。这里的文件可以是本地的，也可以是远程的，远程文件必须指明所使用的协议。例如：
result=file(“http://www.google.com/search?q=abcd&amp;btnG=Google%CB%D1%CB%F7&amp;hl=zh-CN&amp;lr=”)，该语句将模拟我们在Google上查询单词“abcd”的过程，并将搜索结果以每行为元素，传回到数组变量&nbsp;
result中。因为这里读取的文件是远程的，所以协议名“http://”不能缺少。&nbsp;<br>
<br>
　　如果要让用户输入搜索字符进行任意搜索，我们可以做一个输入文本框和提交按钮，并将上文中的被搜索字符“abcd”用变量替换：<br>
echo<br>
; //没有参数的form，默认提交方式为get，提交到本身<br>
echo ; //构造一个文本输入框<br>
echo ; //构造一个提交查询按钮<br>
echo<br>
;<br>
<br>
if (isset( keywords)) //提交后PHP会生成变量 kwywords,即要求下面的程序在提交后运行<br>
{<br>
urlencode( keywords); //对用户输入内容进行URL编码<br>
result=file("http://www.google.com/search?q=".&nbsp;
keywords."&amp;btnG=Google%CB%D1%CB%F7&amp;hl=zh-CN&amp;lr=";<br>
//对查询语句进行变量替换,将查询结果保存在数组变量 result中<br>
result_string=join(" ", result);
//将数组＄result合并成字符串，各数组元素之间用空格粘和<br>
... //进一步处理<br>
}<br>
?&gt;<br>
<br>
　　上面的这段程序已经能按用户输入内容进行查询，并将返回的结果合成一个字符串变量＄result_string。请注意要使用urlencode()函数将用户输入内容进行URL编码，才可以正常地对输入的汉字、空格以及其他特殊字符进行查询，这样做也是尽可能逼真地模拟Google的查询命令，保证搜索结果的正确性。<br>
<br>
对Google的分析<br>
<br>
　　为了便于理解，现在假设我们所真正需要的东西是：搜索结果的标题。网址和简介等，这是一个简洁而典型的需求。这样，我们所要做的便是：去除Google搜索结果的台头和脚注，包括一个Google的标志、再次搜索的输入框和搜索结果说明等，并且在剩余的搜索结果各项条目中剥离原来的HTML格式标记，替换成我们想要的格式。<br>
<br>
　　要做到这一点，我们必须仔细地分析Google搜索结果的HTML源码，找到其中的规律。不难发现，在Google的搜索结果的正文总是包含在源码的第一个<br>
标记和倒数第二个<br>
<br>
标记之间，并且倒数第二个<br>
<br>
标记后紧跟table字符，而且这个组合“<br>
<br>
<br>
　　以下所有程序均依次接续在上文程序的“进一步处理”处。<br>
<br>
　　result_string = strstr( result_string, "<br>
<br>
"; //取 result_string从第一个<br>
<br>
开始后的字符串，以去除Google台头<br>
position= strpos( result_string,"<br>
<br>
table符号的位置<br>
result_string= substr( result_string,0, position);//截取第一个<br>
<br>
table符号之前的字符串,以去除脚注<br>
<br>
应用与实现<br>
<br>
　　OK，现在我们已经得到有用的HTML源码主干了，剩下的问题是如何自主地显示这些内容。我们再分析一下这些搜索结果条目，发现每个条目之间也是很有规律的用<br>
分隔，也就是各成一个段落，按这个特点我们用explode()函数把每个条目切开：<br>
<br>
　　语法：explode(string separator, string string);<br>
<br>
　　返回一个数组，按separator切开后的各个小字串被保存在数组中。<br>
<br>
　　于是：<br>
result_array=explode("<br>
<br>
", result_string); //用字串"<br>
<br>
"把结果切开<br>
<br>
　　我们就得到一个数组
result_array，其中每个元素都是一个搜索结果条目。我们所要做的仅仅是研究每个条目及其HTML显示格式代码，然后按要求替换就行了。下面用循环来处理
result_array中的每个条目。<br>
for( i=0; i {<br>
... //处理每个条目<br>
}<br>
<br>
　　对于每个条目，我们也很容易找到一些特点：每个条目都由标题、摘要、简介、类别、网址等组成，每个部分都换行，即包含<br>
标记，于是再次分割：（以下处理程序放在上文的循环中）<br>
every_item=explode("<br>
", result_array[ i]);<br>
<br>
　　这样我们得到一个数组 every_item，其中 every_item[0]就是标题， every_item[1]和
every_item[2]两行为摘要， every_item[3]和
every_item[4]等等的头部如果包含“简介:”、“&lt; font size=-1
color=#6f6f6f&gt;类别:&lt;
/font&gt;”字符，则是简介或类别（因为有的结果条目没有该项），如果头部包含“&lt; font
color=green&gt;”则肯定就是网址啦，这种对比判断我们常使用正则表达式（略），如果要替换也很方便，比如包含标题的＄every_item[0]，其本身是有链接的，我们希望修改这个链接属性，让它在新窗口打开链接：<br>
echo eregi_replace( {<br>
... //处理每个条目中除去第一项（第一项为标题，已经显示）的每一项<br>
... //更多格式修改<br>
}<br>
<br>
　　这样就修改了链接属性，其余很多显示格式的修改、剥离、替换都能用正则替换eregi_replace()来完成。<br>
<br>
　　至此我们已经得到了每个搜索条目的每一项，并能任意修改每项的格式，甚至可以给他套上漂亮的表格。然而一个好的程序应该能适应各种运行环境的，这里也不例外，我们其实还只是讨论了搜索结果的HTML剥离的一种框架方法，真正要做得完美，还要考虑很多内容，比如要显示一共搜索出多少结果，分成多少页等等，甚至还可以刨除与Google相关的那些“类别”、“简介”等代码，让客户根本看不到原始网站。不过这些内容和要求我们都能通过分析HTML进行剥离得到。现在大家完全能自己动手，做个极富个性化的搜索引擎啦
]]></description><guid>http://www.i170.com/Article/54481</guid><trackback:ping>http://www.i170.com/Article/54481/trackback</trackback:ping><comments>http://www.i170.com/Article/54481#comment</comments><wfw:commentRss>http://www.i170.com/Article/54481/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/52500</link><title><![CDATA[在windows2003的IIS6上安装PHP5和Perl5(转)]]></title><author>makowolf</author><category></category><pubDate>Sat, 23 Dec 2006 17:47:32  +0800</pubDate><description><![CDATA[<p><strong><font color=
"#FF0000">在IIS6上安装PHP5（以PHP5.2.0为例）</font></strong><br>
1、首先在<a href=
"http://www.php.net/">php.net</a>上下载windows用的zip包。然后解压，如解压在“C:\php5”</p>
<p>2、把根目录下的<font face=
"Arial">php5ts.dll复制到系统windows目录下；把<font face="Arial">php.ini-dist文件改名为php.ini后复制到系统windows目录下。</font></font></p>
<p>3、用文本编辑器打开php.ini文件，查找“<font face=
"Arial">register_globals</font>”，把后面的Off改为On。该项设置是关于自定义全局变量。</p>
<p>4、查找“<font face=
"Arial">extension_dir</font>”，把后面的值改为php解压文件夹的ext子目录下，如“C:\php5\ext”</p>
<p>5、查找“<font face=
"Arial">extension</font>”，把需要用到的扩展模块前的；号去掉。如需要用mysql的就是php_mysql.dll，如需要用mysqli的话，就需要自己加一句<font face="Arial">extension=php_mysqli.dll。有些扩展库可能需要额外的
DLL 才能工作，具体请查看<a href=
"http://www.php.net/manual/zh/install.windows.extensions.php">这里</a>，如果列表里的注解中有说明，则需要在解压根目录或者ext子目录找到该文件，然后复制到系统windows目录中。<br>
如php_mysql.dll和php_mysqli.dll就需要把根目录下的<font face=
"Arial">libmysql.dll复制到系统windows目录中</font></font></p>
<p>
6、打开IIS，找到需要使用php的站点，点右键-属性，找到“主目录”选项卡，点击“配置”按钮，在“映射”选项卡中，点“添加”按钮，通过“浏览”，找到php解压目录下的<font face="Arial">php5isapi.dll文件，确定，“扩展名”填“.php”，其他选项默认即可。</font></p>
<p>7、找到IIS的web服务扩展，点击“添加一个新的web服务扩展”，扩展名可以为“php”，添加文件同样为<font face=
"Arial">php5isapi.dll，并把“设置扩展状态为允许”勾选。</font></p>
<p>8、在开始-运行里输入iisreset，确定，重启IIS。至此，在IIS6上安装PHP5已经完成。</p>
<p>常见问题：<br>
1、如出现一些“failed to open
stream”等提示，一般是因为权限问题，我的解决方法是给everyone对php的解压目录的读取和运行权限，给iis两个用户对网站的web目录读取和运行权限。相关参考文章：<a href="http://www.im286.com/viewthread.php?tid=940712">[小勤]WIN主机配置PHP的若干问题解决方案总结</a></p>
<p>PS：关于php.ini里的选项设置，可以查看<a href=
"http://www.php.net/manual/zh/ini.core.php#ini.extension">这里</a>。<br></p>
<p><font color=
"#FF0000"><strong>在Windows上安装MySQL5(以5.0.24a为例)<br></strong></font><font color="#000000">在<a href="http://www.mysql.com/">mysql.com</a>上下载windows的安装文件，然后运行，根据提示一步步next，基本上不需要做任何调整。安装完成后会自动打开配置程序，根据需要做一些调整。至最后一步，配置程序可能会提示无法连接数据服务器，这时候，需要点击重试按钮，否则可能会发生程序无法连接服务器的情况。</font></p>
<p>
如果出现如上所述情况，需通过mysql自身的卸载程序卸载mysql，并把安装目录和数据目录清空，重启，然后再安装。否则将会重复之前的问题。我第一次就是在这里卡了好久一段时间。<br></p>
<p><strong><font color=
"#FF0000">在IIS6上安装Perl5(以5.8.8.819为例)</font></strong><br>
1、在<a href=
"http://www.activestate.com/">ActiveState</a>上下载<font face=
"Arial">ActivePerl，运行，根据提示完成安装。</font></p>
<p>
2、打开IIS，找到需要使用perl的站点，点右键-属性，找到“主目录”选项卡，点击“配置”按钮，在“映射”选项卡中，点“添加”按钮，通过“浏览”，找到perl安装目录的bin子目录，把查找文件类型设为CGI（*.exe文件），选择<font face="Arial">perl.exe</font><font face="Arial">文件，确定，“扩展名”填“.pl”，其他选项默认即可。</font></p>
<p>3、找到IIS的web服务扩展，把“Perl CGI Extension”设为允许状态。</p>
<p>4、对perl的安装目录，给予iis的两个帐户以读取和运行、修改、写入的权限。</p>
<p><strong><font color=
"#FF0000">在IIS6上安装DevMS的IIS-Tools(以1.1.0.0为例)</font></strong><br>
1、在<a href=
"http://forum.devms.com/Thread.20275.html">DevMS.Com</a>上下载压缩包，解压。</p>
<p>
2、打开IIS，找到需要使用IIS-Tools的站点，点右键-属性，找到“ISAPI筛选器”选项卡，点击“添加”按钮，筛选器名称可以为“devms”，浏览文件，找到解压包里的<font face="Arial">Devms.Com.IISTools.dll文件。确定添加。</font></p>
<p>
3、找到IIS的web服务扩展，点击“添加一个新的web服务扩展”，扩展名可以为“devms”，添加文件同样为<font face=
"Arial"><font face=
"Arial">Devms.Com.IISTools.dll</font>，并把“设置扩展状态为允许”勾选。</font></p>
<p>4、对网站的web目录，给予SERVICE帐户的完全权限。</p>
<p>5、重启IIS即可。</p>

]]></description><guid>http://www.i170.com/Article/52500</guid><trackback:ping>http://www.i170.com/Article/52500/trackback</trackback:ping><comments>http://www.i170.com/Article/52500#comment</comments><wfw:commentRss>http://www.i170.com/Article/52500/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/50783</link><title><![CDATA[Google的面试]]></title><author>makowolf</author><category></category><pubDate>Sat, 09 Dec 2006 15:37:18  +0800</pubDate><description><![CDATA[<div id="connent">（作者简介: 王忻，Google
工程师。北京出生，五岁时跟随父母移居美国。中学期间跳了三级，十五岁进入了加州理工大学，加入 Google
前曾在微软等公司工作。）<br>
<br>
六月份的时候，我曾经在黑板报上介绍过“如何写一份好的工程师简历”， 今天想跟大家来谈谈如何准备软件工程师的面试？假设，现在您的杀手简历
(killer resume)已经吸引了某大公司的注意并约你面试。那么接下来该如何准备呢？<br>
<br>
我 在 Google（以前是微软）工作期间面试了不下
300人，其中某些应聘者确实表现非凡，但有些却显得准备不足。当然许多面试准备不足的人最后依然获得了录用通知，因为他们本身确实才华出众。但如果应聘
者能提前准备妥当，那么面试过程将更为保险和轻松。以下所列出的就是我根据多年经验总结得出的建议：<br>
<br>
<br>
1．使用相同的工具（如铅笔和纸张）和时间限制（例如半个小时）模拟面试训练<br>
<br>
<br>
Google
和微软都会让应聘者在白板上手工解答编程问题，但通常大部分的应聘者都是习惯于在电脑上利用编程工具系统编写程序。因此面试的时候，某些应聘者离开了熟悉
的电脑光标，站在白板前感觉手足无措不知该如何起行。又或者他们不习惯在编程之时旁边有人观看，这会让他们感到紧张而无法正常思考。<br>
<br>
在现实生活中，如果你想要横渡英吉利海峡，自然不能总是在室内游泳池练习。你必须投身于大海在波涛之中训练，在准备面试的时候也是如此。:)<br>
<br>
在
面试开始之前你最好向招聘单位询问面试形式和面试问题。如果招聘单位让你在某个房间考试且仅提供没有汇编程序的编辑器，那么就应该在家中按照这种情景进行
练习。如果招聘公司单位让你在白板上回答问题并会安排考官在旁监督，那么你就要找一位软件工程师来扮演考官配合你练习。即使找来的考官经验不如你也没有关
系，他们依然能帮助你消除在他人面前出错所带来的紧张感，这样可以让你适应有人在旁边盯着看的面试氛围。<br>
<br>
如果你恰巧认识我并希望由我来帮你联系，那我的条件就是必须请我吃饭：如果你已经工作了就吃日本寿司大餐；如果你还是学生，那么吃比萨饼也可以。:)<br>
<br>
<br>
2．在面试过程中不要对细小错误耿耿于怀<br>
<br>
<br>
我
曾不止一次的在面试过程中碰到这种情况：当应聘者知道编程问题后，他马上就想到了最佳的方案、确定了边界条件，然后开始编写程序。但在编写过程中，应聘者
犯了诸如首先检查是不是操作顺序错误或忘记设定某变量等无关大局的小错误，当我指出其错误之后，应聘者立刻变得十分紧张，这种焦虑情绪影响了他在后面环节
的正常发挥。<br>
<br>
其实这种恐惧心理完全不必要。一名优秀的程序员在编程过程中出现错误也是很正常的，就像是小提琴手在演奏高难度的巴赫交响乐时也会偶尔失误。音乐会的听众可能会觉察到这些错误，但是听众绝对不会因为这种细小失误就把出色的小提琴手看作是门外汉。<br>
<br>
即便应聘者彻底搞砸了某个编程问题，面试考官也可能会提出不同的问题并会容忍应聘者在某个问题上的失误。再退一步说，就算某次面试彻底失败，你也有机会在其它面试上补救。<br>
<br>
我
的一位同事（一个项目的技术负责人）最近面试了一个人，在开始面试时他觉得面试者的交流方式存在问题，因此开始表现的相当不友好。但经过了整个面试过程
后，面试者证明了自身的能力，而我的那位同事也成了那位面试者最坚定的支持者。在过去的一年中，我从未见过这位同事如此强烈的支持哪位面试者。<br>
<br>
所以，因此就算面试进展不顺，也务必坚持到底不要放弃。<br>
<br>
<br>
3．在面试过程中不要失礼<br>
<br>
<br>
这似乎是不用说的问题，但在面试过程中我确实碰到过影响很不好的失礼行为。曾有一位前来应聘软件工程师的人看到我就说：“哇，我真不敢相信你这么年轻！你看上去好小！！我觉得你才
18 岁！”<br>
<br>
面试者的这种言行实在要不得。<br>
<br>
面试者也要注意不要说出诸如此类的话：“哇，你真的就是考官吗？你看上去好老！”“哇，你真的是来面试我的，你看上去好胖！”（相信应该不会有人说这样的话）。<br>
<br>
在 我的另外一次面试中，应聘者的手机在面试开始 15 分钟之后就响了，她没有理会，手机连续响了 20 秒，这样不免会对面试造成影响。5
分钟之后，她的手机又响了，她依然没有理会；5分钟之后，手机第三次响起。最后她终于抓过手提包在里面翻出了手机。我想：“是时候关掉手机了，她在进来之
前就应该把手机关掉。”但是她在手提包中拿出手机之后却旁若无人的打起电话来，而且就在面试过程中间！<br>
<br>
这种情况唯一可接受的理由就是他有什么非常紧急的事，但是即便情况如此，那么他也应该在面试开始之时就讲清楚，让面试官有所准备。<br>
<br>
<br>
4．不要在面试中喧宾夺主<br>
<br>
<br>
我曾经面试过几个应聘者，他们好像铁了心肠一定要告诉我他们最近的“超级项目”。当我开始发话他们就立刻打断：“我想让你了解我们近期处理的超级项目，10年之前当这个项目开始之时还默默无闻……”，然后接下来的5分钟时间都在那里滔滔不绝唾沫横飞。<br>
<br>
有时应聘者好像打定主意要给每个考官详细描述其引以为豪的项目，然后一整天都在那里翻来覆去的说这个项目。<br>
<br>
记住：面试官在面试过程中有具体的问题需要询问。但是如果应聘者喧宾夺主，那么考官就可能无法获得充分的信息来做出判断，同时这种行为也会让考官觉得应聘者很难共事。<br>
<br>
如果你确实想谈论自己的项目，那么就应询问面试官：“我觉得最近的某某项目能充分体现我的能力，我能不能用
10分钟的时间来描述一下具体情况？”这样就会给面试官空间来调整面试过程，由此也避免毫无征兆就让面试离题万里。<br>
<br>
<br>
5．在回答需要具体答案的问题之时，记得首先要有总括性的发言<br>
<br>
<br>
有
时我会问一个答案可以很简练的问题，例如：“在你的那个成功项目中总共有多少人参与？”但应聘者往往会就此打开话匣：“恩，张三参与了这个项目，他负责
UI部分，当然我也会给他一些指导。李四也在项目中，她在宾州远程工作，负责后端服务器。两年之后我们又有新人王五加入……”<br>
<br>
在应聘者滔滔不绝的讲了三分钟之后，我还是不知道这个项目到底有多少人参与。<br>
<br>
因此首先要简练的回答问题，然后再展开描述：“在我接手项目时有三个人，但当我离开项目时人数已经增加到12人。”<br>
<br>
当然如果能简练的回答问题，然后征询意见之后再展开论述那就更好了：“在我接手项目时有三个人，但当我离开项目时人数已经增加到 12
人。我可以讲一下各人在项目中的具体分工吗？”<br>
<br>
<br>
6．（不是特别重要）在面试中要衣着得体，舒适的商务便装是最佳的选择<br>
<br>
<br>
人们有时候会为衣着犯愁。但是最重要的是要让自己感觉舒适。如果需要具体的建议，那么我建议穿衬衫甚至T恤衫。对于某些公司（例如
Google），西装革履显然是太隆重了。<br>
<br>
这
条建议不必太看中，因为面试官不会管应聘者穿什么。最好应该询问人事招聘部门穿什么合适，因为不同国家有不同习俗，就算美国东海岸和西海岸的公司着装文化
也会有差别。像 Google 这样的公司在着装方面更加随意，因此如果你穿着“三件套”的经典西服去 Google
面试，考官可能会有异样的感觉。因此如果你真的具备软件工程的本领，穿什么其实并不重要。某个应聘者曾经穿着皱巴巴脏兮兮的T恤就跑来面试，他的T恤衫上
还有着许多破洞。但最后他还是拿到了录取通知（当然我绝不建议如此穿着）。<br>
<br>
<br>
最后的一个小故事<br>
<br>
<br>
最后我想讲一场极为尴尬的面试。在看完之后，我希望你能这样想：无论你的面试如何糟糕，你至少要比这位应聘者幸运。<br>
<br>
以前我还在微软的时候，我们通常会为应聘者准备一些饮料，某位暂称其为 Jeff
的应聘者要了一听百事可乐。我们走进面试房间后，他就在桌前坐下了。接下来我们简要的谈了谈他的工作经历，然后他开始在白板上解答编程问题，此时他还没有打开他的可乐。<br>
<br>
我们俩站在白板前，然后杰夫开始在上面写程序。在写程序之时他沉浸在对整体构架的思考中，下意识的退了一步来查看整个白板。在后退时他不小心碰到了桌子，放在桌上的百事可乐掉到了地上。<br>
<br>
因为可乐还没有打开，因此当可乐罐落地的时候，可乐罐炸开了。<br>
<br>
可乐罐在地上打转，泡沫喷的到处都是。你可以想象当时的场景，可乐喷到了墙上、书架还有我电脑的键盘上。我俩楞在那里，手都半伸着（根本来不及抓到可乐罐），眼睁睁的看着可乐弄得到处都是。<br>
<br>
我们花了 5 分钟的时间用纸巾来清理现场（虽然我的书本自那天之后都粘页了，而墙壁也不再是干净的了）。<br>
<br>
随后我们重新开始白板测试。杰夫此时已非常紧张（换了谁都会紧张吧？）。他写了几行程序，然后擦掉，然后再写。他是用自己的手擦拭白板而不是用板刷。他急得额头冒汗，然后他又用刚刚擦过白板的手擦汗。在面试过程结束之时，他的脸上布满了红色、绿色和蓝色的颜料。<br>
<br>
我说：“你的手上粘了很多颜料，我带你去卫生间洗洗吧，”然后我把他领到洗手间让他从镜中看到了自己的尊容。</div>
<div>(转)</div>

]]></description><guid>http://www.i170.com/Article/50783</guid><trackback:ping>http://www.i170.com/Article/50783/trackback</trackback:ping><comments>http://www.i170.com/Article/50783#comment</comments><wfw:commentRss>http://www.i170.com/Article/50783/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/50782</link><title><![CDATA[将此文献给已工作2-5年的你(经典的特写，多少踩住了人心)]]></title><author>makowolf</author><category></category><pubDate>Sat, 09 Dec 2006 15:33:37  +0800</pubDate><description><![CDATA[<div>
我的朋友们，也许你们现在还在校园，无法真正体会到从学校毕业2~5年的人的心情，但是我想，终将有一天你们会理解的，到时候再回过头来看这篇文章，也不迟。<br>
<br>
　　我们终于进入了这个社会。从此结束了被学校老师看管的生涯，结束了做父母乖宝贝的日子，也结束从父母兄长那里拿钱的幸福时光。<br>
<br>
　　我们从家里搬了出来，提着自己半新不旧的行囊找了间不能再廉价的破房子租了下来，开始了闯荡的生活。我们的眼光充满了好奇，我们的血液里流淌着激情，我们的钱夹却空前的瘦小。在面对第一个老板第一批同事第一份工作的时候，我们是那样的慷慨激昂，我们认为自己无所不能，我们幻想很快就可以打造一片属于自己的天地，我们对未来充满了信心。并且希望从别人艳羡的目光中找到一点点骄傲的资本。可是渐渐的我们才知道，其实现实和自己的理想有着天壤之别。我们发现了老板是多么的阴险狠毒同事是多么的势利小气工作是多么的枯燥无趣，我们也发现了房租水电气费把人愁死了。发薪的日子总好像遥不可及，商店里的东西仿佛只是为别人摆设，我们还发现了只有周末跑到母校瞎逛才感觉释然，只有和老同学一起聊天玩耍才真正开心只有在步行街上看美女才不无聊。<br>
<br>
　　渐渐的我们也学会了泡吧，酒吧、迪吧、水吧、网吧、玩具吧，都是我们打发无聊时间的场所。可是我们还是泡不到妞，以前自以为是的那些爱情理论泡马子技巧在金钱时代都是狗屁，都出奇的苍白无力。于是我们感叹世界变得太快，快得让我们这些穷小子根本就无所适从。渐渐的我们也变得深沉起来，不再为一个很幼稚的笑话就哈哈大笑，不再动不动就乱发牢骚，也不再把内心深处的秘密轻易地跟别人诉说。我们也说不清楚这到底是成熟还是消沉，对着镜子看，却发现里面那张脸陌生得可怕。<br>
<br>
　　渐渐的我们似乎大彻大悟了，什么都看透了，一切都虚无缥缈了，然后我们什么都很漠然，坐公交车也不让座了，看到小偷偷东西也懒得理了，吃点小亏想想也就算了，但是我们却在每天下班之前发愁晚餐该吃什么了，在大家一起喝茶的时候盘算着自己要不要买单，在临睡之前把这个月的开支算了又算。<br>
<br>
　　渐渐的我们感觉自己其实什么都不是，没有钱没有名没有地位，身高也太矮了皮肤也太黑了长相也太难看了，什么都要看人家的脸色，走在哪里都似乎低人一等，有时真恨不得割脉上吊服毒跳楼自行了断。<br>
<br>
　　渐渐的我们也不想看书了，也不想谈理想了，也不想谈前途了，也不想花太多精力胡思乱想。我们也不想听音乐了，也不想看电影了，不过倒时常看些成人的碟子，交流些黄色的笑话。我们开始沉迷于酒液里，沉迷于方城中，沉迷于低级场所内。家的概念越来越模糊了，亲情的感觉越来越遥远了，除了在梦中偶尔回到家乡之外，我们挺多可以借助一条冰冷的电话线和家人说说一些开始偏离生活的话，却看不到老爹老妈又长出了多少根白头发又多了几道皱纹。看到有人在球场上酣战，我们似乎也想上去来两脚，其实很久没有运动的身体已经无法支撑我们再跑多远了，而且几乎荒废的球技让我们怀疑自己那些踢球的年岁是不是上辈子的事。望着满街穿着前卫的少男少女，我们开始表现出厌恶的表情，却忘了自己前些年其实有过之而无不及。遇到在大庭广众之下举止亲热的学生情侣，我们的目光也变成了不屑，并恶狠狠地骂他们伤风败俗。<br>
<br>
　　经过彩票销售点的时候，我们忍不住也掏出一点本该买书的钱来买几注，然后天天做梦中了五百万之后多少万买房子多少万买车多少万胡乱挥霍，可是每一次开奖虽然屡屡有人中头奖却始终与自己无缘，于是在短暂的失望之后，我们依然锲而不舍地做着美梦。渐渐的我们的人生观、价值观、爱情观也有所改变。我们已经不认为为了往上爬而不择手段有什么不妥，我们对努力就有回报的说法嗤之以鼻，我们嘲笑所谓的贞节观，所谓的责任感，希望甚至去找寻一夜情。我们开始关注街上跑的车是宝马还是奥拓，关注哪个酒廊的吧台小姐酒量如何，关注哪款手机用起来更加叉人眼，关注哪个牌子的西服穿起来更有派头。但也就只是关注而已，因为我们清楚无论是宝马还是奥拓，我们都买不起，吧台小姐酒量再不行，我们也不能把人家怎么样，至于手机和西服，还是用自己买了很久的老款式。不知从什么时候开始，我们为自己的遭遇感到愤愤不平了，我们越来越看不惯老板狰狞的面目，越来越无法忍受同事的卑鄙龌龊，越来越不堪就这样生活下去。于是我们在感叹运气不好的同时迫切地想改变自己的命运，我们左顾右盼，寻找机会，却始终看不到出路。<br>
<br>
　　终于有一天，我们像火山爆发一样，一冲动之下把老板炒了。收拾东西昂然地走出办公室的那一刻我们有英雄离去那种豪迈与无悔，只从同事愕然与嘲讽夹杂的眼神中隐隐看到一丝无奈，却不知道等待自己的，将是无尽的痛苦与折磨。我们很快发现了虽然自己拥有并不低的学历和一定的工作经验，并像跑场子一样从这家公司跑到那家公司，一次接一次地应聘，可是根本就无法找到适合的工作。时间一天一天过去，工作依然遥远得不知子丑寅卯，钱包越来越瘪了，交房租的日子也越来越近了，我们心如火焚，有着世界末日即将来临的惶恐。我们也开始有点后悔自己太轻率就辞职了，也开始萌生铤而走险的念头，但又不敢真的去抢银行绑架什么的，心情低沉到了极点，我们的脾气也大了，唉叹声也响了。<br>
<br>
　　所幸这样的日子终于结束了。我们又到了新的工作单位。这时候我们虽然或多或少有点激动，但更多的是谨慎与惨淡。我们不会再对老板抱什么幻想，不会认为他会给我们多好的待遇，我们也不会和同事谈什么知心话，因为我们已经知道，不可能与有利益冲突的人成为朋友，当然我们也不再愚蠢地把这个工作当事业一样拼命，只把这里当成自己的一个跳板，一旦有机会就立马走人。接下来的生活无趣又无味，但我们渐渐的也就无所谓了。我们也不想泡吧了，不想什么活着的意义了，老同学在一起也开始有点话不投机了，以前很少联系的朋友，现在更不想去联系了，就算有时候接到他们打来的电话，也只是随便吭吭唷唷的应付几句。虽然酒还是经常喝，但很多时候都一个人独饮独醉了。这时候我们的寂寞更是深入骨髓，我们的苦痛更加真切而细腻。我们空前地怀念在学校的那些岁月，我们会捧着毕业合照发半天呆，我们却不想再到母校去闲逛了，如果是偶然经过，看到曾经熟悉无比的景物，心里还真的翻涌起一股酸楚，但是我们不会流眼泪。毕业时曾经很贱的男儿泪如今又变得珍贵起来。<br>
<br>
　　当然我们也还是经常上网，不过很多时候都是为了打发时间。我们很可能迷上了传奇之类的游戏，却很少再光顾同学录网页，更不想在上面留言了。我们无师自通的学会了自欺欺人，虽然我们在夜深梦回时也会憎恨自己的虚伪与无为，更讨厌这种猪狗不如的生活方式，但是我们就象被囚禁的鸟，根本就无能为力。有时候我们会自嘲似的给找很多借口来解释自己的某种行为，尽管我们也知道这样做其实毫无意思，也毫无必要。<br>
<br>
　　我们开始不断地听到老同学们结婚的消息、升职的消息。然后我们不经意地就想到某某在学校时的样子，然后我们不由得感叹时间流逝之无情，然后我们就想在尘封已久的日记本上写点什么，然后我们不知不觉地眼角竟然也有点湿润了。<br>
<br>
　　我们夜里躺在床上睁大眼睛，却无法在漆黑中排遣郁闷时，就会格外的想有个人陪在身边。很多往事会像潮水一样向我们扑来。我们曾经暗恋过的人、曾经追求过但失败了的人、曾经相爱过的人，都一一地闪过脑海，于是，心里会有种伤感，很纯粹的伤感。因为我们知道。爱情其实真的已经与我们离得很远。我们试着通过各种途径来结交朋友，但是每每交往了几次，我们就不想再与他们来往。说不清楚是因为他们太过于现实还是我们太封闭。我们于是感慨万千，在这个很多人都戴面具生活的社会，原来交一个真正的朋友竟然那么难。我们也试着去约会，可是爱情并非喝水吃饭那么简单，到最后都还是以失败告终。高不成低不就的我们继续高举单身的旗帜游走于大街小巷。我们非常怀念学生时代那种单纯的恋情，非常羡慕那些还能坐在教室中的年轻人，非常希望自己可以再读一次大学，但是我们也知道，泼出去的水怎么能够收回，远逝的时光如何可能重来？<br>
<br>
　　我们的酒量越来越大，一打啤酒喝下去一只手指在眼前竖着也无法看成两只手指。我们的腰越来越粗背越来越宽肚皮越来越大，日渐增多的脂肪很是晃眼。我们爬上楼梯的动作越来越笨拙，也越来越吃力，才到三楼就已经气喘吁吁。我们向往着能到外面去走一走，看一看，却又害怕沦落天涯，苦不堪言。我们越来越觉得钱钟书老人的围城理论精辟有理。我们越来越体会到人在江湖身不由己的无奈。我们越来越感到心力交瘁，压抑茫然。<br>
<br>
　　可是，以后的路还很长，无论如何，我们得活下去。不管是痛苦还是快乐，我们都要面对。毕竟想逃避也逃避不了的。所以，我们还是希望，明天是一个阳光灿烂的大好日子。而且，我们骨子里仍然相信自己会走出阴霾，出人头地。再回首，灯火阑珊处没有伊人，只有自己的梦想在风中轻轻地摇曳。</div>
<div>(转)<br></div>

]]></description><guid>http://www.i170.com/Article/50782</guid><trackback:ping>http://www.i170.com/Article/50782/trackback</trackback:ping><comments>http://www.i170.com/Article/50782#comment</comments><wfw:commentRss>http://www.i170.com/Article/50782/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/39296</link><title><![CDATA[武警与交警的区别]]></title><author>makowolf</author><category></category><pubDate>Sat, 16 Sep 2006 10:54:49  +0800</pubDate><description><![CDATA[<p>一开始我看了觉得好笑，可想想觉得失望啊~！</p>
<p>想想警察和城管之类的也就都跟这交警一个样，治安由这种人来管理还有什么指望啊！</p>
<p><img height="400" alt="" src=
"http://www.i170.com/attach/713E7871-7224-4290-88E6-691A83E0C269"
width="300"></p>

]]></description><guid>http://www.i170.com/Article/39296</guid><trackback:ping>http://www.i170.com/Article/39296/trackback</trackback:ping><comments>http://www.i170.com/Article/39296#comment</comments><wfw:commentRss>http://www.i170.com/Article/39296/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/38463</link><title><![CDATA[GMAIL邀请！]]></title><author>makowolf</author><category></category><pubDate>Mon, 11 Sep 2006 01:50:10  +0800</pubDate><description><![CDATA[<p>昨天搜索到的，并且成功申请到了GMAIL！</p>
<p>现跟大家分享下！</p>
<p><a href=
"http://share.daviesliu.net/">http://share.daviesliu.net/</a></p>

]]></description><guid>http://www.i170.com/Article/38463</guid><trackback:ping>http://www.i170.com/Article/38463/trackback</trackback:ping><comments>http://www.i170.com/Article/38463#comment</comments><wfw:commentRss>http://www.i170.com/Article/38463/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/38098</link><title><![CDATA[史上破坏最大的10种病毒排名]]></title><author>makowolf</author><category></category><pubDate>Sat, 09 Sep 2006 02:24:14  +0800</pubDate><description><![CDATA[<p style="TEXT-INDENT: 2em"><span style=
"FONT-SIZE: 14px">随着网络在现代生活中的重要性越来越突出，曾经被人们一手掌控的计算机病毒也逐渐从温驯的小猫成长为噬人的猛虎。从1986年，“Brain”病毒通过5.25英寸软盘首次大规模感染计算机起，人们与计算机病毒的斗争就从未停止过。如今，整整20年过去了，这场持久的拉锯战却似乎只是开了个头。</span></p>
<p style="TEXT-INDENT: 2em">
美国《Techweb》网站日前评出了20年来，破坏力最大的10种计算机病毒：</p>
<p style="TEXT-INDENT: 2em"><strong>1. CIH (1998年)</strong></p>
<p style="TEXT-INDENT: 2em">该计算机病毒属于W32家族，感染Windows
95/98中以EXE为后缀的可行性文件。它具有极大的破坏性，可以重写BIOS使之无用(只要计算机的微处理器是Pentium Intel
430TX)，其后果是使用户的计算机无法启动，唯一的解决方法是替换系统原有的芯片（chip），该计算机病毒于4月26日发作，它还会破坏计算机硬盘中的所以信息。该计算机病毒不会影响MS/DOS、Windows
3.x和Windows NT操作系统。</p>
<p style="TEXT-INDENT: 2em">
CIH可利用所有可能的途径进行传播：软盘、CD-ROM、Internet、FTP下载、电子邮件等。被公认为是有史以来最危险、破坏力最强的计算机病毒之一。1998年6月爆发于中国台湾，在全球范围内造成了2000万-8000万美元的损失。</p>
<p style="TEXT-INDENT: 2em">
<strong>2.梅利莎（Melissa,1999年）</strong></p>
<p style="TEXT-INDENT: 2em">
这个病毒专门针对微软的电子邮件服务器和电子邮件收发软件，它隐藏在一个Word97格式的文件里，以附件的方式通过电子邮件传播，善于侵袭装有Word97或Word2000的计算机。它可以攻击Word97的注册器并修改其预防宏病毒的安全设置，使它感染的文件所具有的宏病毒预警功能丧失作用。</p>
<p style="TEXT-INDENT: 2em">
在发现Melissa病毒后短短的数小时内，该病毒即通过因特网在全球传染数百万台计算机和数万台服务器，
因特网在许多地方瘫痪。1999年3月26日爆发，感染了15%-20%的商业PC，给全球带来了3亿-6亿美元的损失。</p>
<p style="TEXT-INDENT: 2em"><strong>3. I love you
(2000年)</strong></p>
<p style="TEXT-INDENT: 2em">
2000年5月3日爆发于中国香港，是一个用VBScript编写，可通过E-Mail散布的病毒，而受感染的电脑平台以Win95/98/2000为主。给全球带来100亿-150亿美元的损失。</p>
<p style="TEXT-INDENT: 2em"><strong>4. 红色代码 (Code
Red，2001年)</strong></p>
<p style="TEXT-INDENT: 2em">
该病毒能够迅速传播，并造成大范围的访问速度下降甚至阻断。这种病毒一般首先攻击计算机网络的服务器，遭到攻击的服务器会按照病毒的指令向政府网站发送大量数据，最终导致网站瘫痪。其造成的破坏主要是涂改网页，有迹象表明，这种蠕虫有修改文件的能力。2001年7月13日爆发，给全球带来26亿美元损失。</p>
<p style="TEXT-INDENT: 2em"><strong>5. SQL Slammer
(2003年)</strong></p>
<p style="TEXT-INDENT: 2em">该病毒利用SQL SERVER
2000的解析端口1434的缓冲区溢出漏洞对其服务进行攻击。2003年1月25日爆发，全球共有50万台服务器被攻击，但造成但经济损失较小。</p>
<p style="TEXT-INDENT: 2em"><strong>6.
冲击波（Blaster，2003年)</strong></p>
<p style="TEXT-INDENT: 2em">
该病毒运行时会不停地利用IP扫描技术寻找网络上系统为Win2K或XP的计算机，找到后就利用DCOM
RPC缓冲区漏洞攻击该系统，一旦攻击成功，病毒体将会被传送到对方计算机中进行感染，使系统操作异常、不停重启、甚至导致系统崩溃。另外，该病毒还会对微软的一个升级网站进行拒绝服务攻击，导致该网站堵塞，使用户无法通过该网站升级系统。2003年夏爆发，数十万台计算机被感染，给全球造成20亿-100亿美元损失。</p>
<p style="TEXT-INDENT: 2em"><strong>7.
大无极.F（Sobig.F，2003年)</strong></p>
<p style="TEXT-INDENT: 2em">
Sobig.f是一个利用互联网进行传播的病毒，当其程序被执行时，它会将自己以电子邮件的形式发给它从被感染电脑中找到的所有邮件地址。在被执行后，Sobig.f病毒将自己以附件的方式通过电子邮件发给它从被感染电脑中找到的所有邮件地址，它使用自身的SMTP引擎来设置所发出的信息。此蠕虫病毒在被感染系统中的目录为C：\WINNT\WINPPR32.EXE。2003年8月19日爆发，为此前Sobig变种，给全球带来50亿-100亿美元损失。</p>
<p style="TEXT-INDENT: 2em"><strong>8.
贝革热（Bagle，2004年)</strong></p>
<p style="TEXT-INDENT: 2em">
该病毒通过电子邮件进行传播，运行后，在系统目录下生成自身的拷贝，修改注册表键值。病毒同时具有后门能力。2004年1月18日爆发，给全球带来数千万美元损失。</p>
<p style="TEXT-INDENT: 2em"><strong>9. MyDoom (2004年)</strong></p>
<p style="TEXT-INDENT: 2em">
MyDoom是一种通过电子邮件附件和P2P网络Kazaa传播的病毒,当用户打开并运行附件内的病毒程序后，病毒就会以用户信箱内的电子邮件地址为目标，伪造邮件的源地址，向外发送大量带有病毒附件的电子邮件，同时在用户主机上留下可以上载并执行任意代码的后门（TCP
3127到3198范围内）。2004年1月26日爆发，在高峰时期，导致网络加载时间慢50%以上。</p>
<p style="TEXT-INDENT: 2em"><strong>10. Sasser (2004年)</strong></p>
<p style="TEXT-INDENT: 2em">该病毒是一个利用微软操作系统的Lsass缓冲区溢出漏洞（
MS04-011漏洞信息）进行传播的蠕虫。由于该蠕虫在传播过程中会发起大量的扫描，因此对个人用户使用和网络运行都会造成很大的冲击。2004年4月30日爆发，给全球带来数千万美元损失。</p>
<p style="TEXT-INDENT: 2em">&nbsp;</p>
<p style="TEXT-INDENT: 2em">(转)</p>

]]></description><guid>http://www.i170.com/Article/38098</guid><trackback:ping>http://www.i170.com/Article/38098/trackback</trackback:ping><comments>http://www.i170.com/Article/38098#comment</comments><wfw:commentRss>http://www.i170.com/Article/38098/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/37694</link><title><![CDATA[微软称朝九晚五工作概念已经不再适用]]></title><author>makowolf</author><category></category><pubDate>Wed, 06 Sep 2006 00:10:37  +0800</pubDate><description><![CDATA[<p>
　　北京时间8月28日消息，据APC杂志报道，微软近日表示，互联网时代的到来就像是一场文化革命，彻底颠覆了“朝九晚五”的工作概念。但是，有些IT部门并没有认识到这一点，它们试图阻止甚至逆转这一趋势，以将生产力留在工作场所。毫无疑问，这样的举措没有太大意义。<br>
<br>
　　安妮基亚(Anne
Kirah)是微软的资深人类学家，一直致力于研究精通互联网的员工如何在办公室同时处理工作和个人事务。基亚表示，一些IT行业的主管认为，他们可以通过限制私人使用互联网来提升工作场所的生产力，但他们的做法往往适得其反。早些时候，基亚在悉尼举行的一次技术会议上表示，那些过滤互联网访问或阻断即时信息通信的公司将会发现，它们很难留住员工。<br>
<br>
　　会议结束后，基亚接受了APC杂志的采访。在这次采访中，基亚主要谈到了新一代员工如何改变人们对传统生产力的理解。新一代员工通常使用互联网和自己的社会圈子保持联系，在上班时间会做一些私事，但下班后也会登录到公司网络，并在家中工作数个小时。对他们来说，朝九晚五的工作方式已经不再适合，
IT经理必须了解并适应因互联网日益普及而引发的这场革命。<br>
<br>
　　下面是APC杂志编辑托尼萨尔诺(Tony Sarno)对基亚专访的主要内容：<br>
<br>
　　萨尔诺：工作场所为什么会出现代沟？<br>
<br>
　　基亚：当公司老板们衡量生产力的传统标准已经不复存在时，冲突也随之出现。在此之前，我们总用员工在工作场所从早上9点坐到下午5点的表现来衡量生产力。我们早上9点上班，下午5点下班，其间除了工作没有什么其它事情。我自己现在仍然是这种思维模式，因为我毕竟属于较老的那一代。当我被即时信息“轰炸”时，我发现自己很难处理，简直就要崩溃了，但这就是我。凭借着多年的工作经验，我们经常这样认为，“我没有这么做，所以其他人也不能这么做。如果他们这么做了，则说明他们没有专心工作。”<br>
<br>
　　事实上，新一代的成长经历和我们有很大区别。他们已经习惯于高科技、互联网等新鲜事物，并学会了如何在工作的同时搞好社交。早在参加工作之前，还在学校做作业的时候，他们就已经学会了这一点。我们通过测试发现，如果不让随身携带手机，或者不允许使用即时信息服务，他们就无法集中注意力。没有手机竟导致这些孩子无法专心做事情，这一点我现在还觉得很荒谬，但这种现象却屡见不鲜。<br>
<br>
　　萨尔诺：那这样说来，工作场所革命的根源好像在家中？<br>
<br>
　　基亚：上次在悉尼的演讲中我并没有提到这一点，也就是在家中都发生了些什么。事实情况是，现代社会给孩子设定了诸多限制。他们无法自由玩乐，我们童年时的那种乐趣他们再也享受不到，取而代之的就是互联网娱乐。在互联网上，他们学会成长，学会社交；在互联网上，他们不需要面对父母和其他成年人，打交道的都是同龄人。</p>
<p><br>
　　现在的孩子放学回家后，他们的一切活动都由成年人在安排。不论干什么，都有成年人在旁边监督。事实上，孩子们从同龄人那里学会了更多的东西，那是他们成长的一部分，是青少年时期的一部分。他们急于和同龄人交流，并通过互联网得到满足。这听起来并不新鲜，但新鲜的是交流场所的变化。对于需要和同龄人交流这种愿望，只有互联网可以满足。不允许出去玩的时候，谁愿意整天和父母呆在一起呢？有了互联网，他们就可以一周7天，一天24小时地和同龄朋友在一起，这实在太棒了。<br>
<br>
　　萨尔诺：所以工作之后，他们就对那些试图阻止他们接触互联网的公司管理人员有抵触情绪？<br>
<br>
　　基亚：那些阻止他们接触互联网的人有两种可能：一种是接受上级的命令，虽然同情员工的处境，但仍然不得不阻止员工接触互联网；另一种则属于较老的一代，还用他们自己的评估标准来思考生产力。<br>
<br>
　　我觉得关键在于正在发生的文化变革。其实这并不是彻底的变化，当我们朝九晚五地上班的时候，同样会在工作场所给医生打电话，因为下班后医院就关门了；有时我们也会给杂货店打电话询问有没有我们需要的东西，或者偶尔给朋友打电话闲聊几句。问题是，这种现象现在越来越普遍。<br>
<br>
　　我来举一个发生在欧洲的例子。我记得好像是在英国，一名员工因为在网上浏览报纸而被开除，因为这被认为是错误行为。法官当时支持了这名员工，他说，“在网上看报纸和原来我们在休息间隙看5分钟报纸有什么区别？和我们抽空打了个电话又有什么区别？”由此看出，他也不知道区别在哪里。生产力的衡量标准应当是你生产了什么，而不是你如何利用时间。<br>
<br>
　　事实上，我们已经过了朝九晚五的时期，现在的工作方式是，“给我一个期限，我好决定什么时候做它。”这一切都因为世界变化太快，现代社会瞬息万变，对每件事人们都有自己不同的选择。<br>
<br>
　　萨尔诺：那IT部门该如何应对这些网络用户呢？<br>
<br>
　　基亚：IT部门应当提倡那种使用互联网工作的方式。如果阻止他们接触互联网，它们肯定会找到其它办法，这一点在IT领域尤其明显。事实上，每个人都有自己的备选方案。例如，如果公司不让使用即时信息服务，他们就用电子邮件来交流。我在德国的一家公司曾见到这样的场景：整个公司都在“叮叮叮叮”的响，因为公司不让使用即时信息服务，员工都用电子邮件来交流。如果公司不允许上班时间上网，员工下班回家后会上网查找需要的东西，并上传到办公PC上，他们的工作方式与在办公室上网并没有什么不同。员工们有太多应对措施，所以一味地阻止没有太大意义。<br>
<br>
　　萨尔诺：你的研究和想法是否已经体现到微软产品上？<br>
<br>
　　基亚：Windows Live就是一个最好的例子，我们希望为用户提供无缝的网络体验。在下一代操作系统Windows
Vista中，我们也加入了很多新功能，例如父母控制(parental
controls)，我们希望通过控制机制来建立家庭安全区域。(奥托)</p>

]]></description><guid>http://www.i170.com/Article/37694</guid><trackback:ping>http://www.i170.com/Article/37694/trackback</trackback:ping><comments>http://www.i170.com/Article/37694#comment</comments><wfw:commentRss>http://www.i170.com/Article/37694/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/37690</link><title><![CDATA[修练8年C++面向对象程序设计之体会----林锐]]></title><author>makowolf</author><category></category><pubDate>Tue, 05 Sep 2006 23:43:48  +0800</pubDate><description><![CDATA[<p><font color="#0000FF">以下内容并不全，如果想看全的就下载</font><a href=
"http://www.i170.com/user/gooogle" target="_blank"><font color=
"#0000FF">gooogle</font></a><font color=
"#0000FF">在评论里发的地址，那是个PDF的文件。</font></p>
<p>
　　六年前，我刚热恋“面向对象”（Object-Oriented）时，一口气记住了近十个定义。六年后，我从几十万行程序中滚爬出来准备写点心得体会时，却无法解释什么是“面向对象”，就象说不清楚什么是数学那样。软件工程中的时髦术语“面向对象分析”和“面向对象设计”，通常是针对“需求分析”和“系统设计”环节的。“面向对象”有几大学派，就象如来佛、上帝和真主用各自的方式定义了这个世界，并留下一堆经书来解释这个世界。</p>
<p>　　有些学者建议这样找“对象”：分析一个句子的语法，找出名词和动词，名词就是对象，动词则是对象的方法（即函数）。</p>
<p>
　　当年国民党的文人为了对抗毛泽东的《沁园春雪》，特意请清朝遗老们写了一些对仗工整的诗，请蒋介石过目。老蒋看了气得大骂：“娘希匹，全都有一股棺材里腐尸的气味。”我看了几千页的软件工程资料，终于发现自己有些“弱智”，无法理解“面向对象”的理论，同时醒悟到“编程是硬道理。”</p>
<p>　　面向对象程序设计语言很多，如Smalltalk、Ada、Eiffel、Object Pascal、Visual
Basic、C++等等。C++语言最讨人喜欢，因为它兼容C 语言，并且具备C 语言的性能。近几年，一种叫Java
的纯面向对象语言红极一时，不少人叫喊着要用Java 革C++的命。我认为Java
好比是C++的外甥，虽然不是直接遗传的，但也几分象样。外甥在舅舅身上玩耍时洒了一泡尿，俩人不该为此而争吵。</p>
<p>
　　关于C++程序设计的书藉非常多，本章不讲C++的语法，只讲一些小小的编程道理。如果我能早几年明白这些小道理，就可以大大改善数十万行程序的质量了。</p>
<p><strong>1. C++面向对象程序设计的重要概念</strong></p>
<p>　　早期革命影片里有这样一个角色，他说：“我是党代表，我代表党，我就是党。”后来他给同志们带来了灾难。</p>
<p>　　会用C++的程序员一定懂得面向对象程序设计吗？</p>
<p>　　不会用C++的程序员一定不懂得面向对象程序设计吗？</p>
<p>　　两者都未必。就象坏蛋入党后未必能成为好人，好人不入党未必变成坏蛋那样。</p>
<p>　　我不怕触犯众怒地说句大话：“C++没有高手，C 语言才有高手。”在用C 和C++编程8年之后，我深深地遗憾自己不是C
语言的高手，更遗憾没有人点拨我如何进行面向对象程序设计。我和很多C++程序员一样，在享用到C++语法的好处时便以为自己已经明白了面向对象程序设计。就象挤掉牙膏卖牙膏皮那样，真是暴殄天物呀。</p>
<p>
　　人们不懂拼音也会讲普通话，如果懂得拼音则会把普通话讲得更好。不懂面向对象程序设计也可以用C++编程，如果懂得面向对象程序设计则会把C++程序编得更好。本节讲述三个非常基础的概念：“类与对象”、“继承与组合”、“虚函数与多态”。理解这些概念，有助于提高程序的质量，特别是提高“可复用性”与“可扩充性”。</p>
<p>1.1 类与对象</p>
<p>
　　对象（Object）是类（Class）的一个实例（Instance）。如果将对象比作房子，那么类就是房子的设计图纸。所以面向对象程序设计的重点是类的设计，而不是对象的设计。类可以将数据和函数封装在一起，其中函数表示了类的行为（或称服务）。类提供关键字public、protected
和private 用于声明哪些数据和函数是公有的、受保护的或者是私有的。</p>
<p>
　　这样可以达到信息隐藏的目的，即让类仅仅公开必须要让外界知道的内容，而隐藏其它一切内容。我们不可以滥用类的封装功能，不要把它当成火锅，什么东西都往里扔。</p>
<p>　　类的设计是以数据为中心，还是以行为为中心？</p>
<p>　　主张“以数据为中心”的那一派人关注类的内部数据结构，他们习惯上将private 类型的数据写在前面，而将public
类型的函数写在后面，如表8.1(a)所示。</p>
<p>　　主张“以行为为中心”的那一派人关注类应该提供什么样的服务和接口，他们习惯上将public
类型的函数写在前面，而将private 类型的数据写在后面，如表8.1(b)所示。</p>
<p align="center"><img alt="" src=
"http://www.pconline.com.cn/pcedu/empolder/gj/c/0504/pic/29coop81.gif"
border="0"></p>
<p>
　　很多C++教课书主张在设计类时“以数据为中心”。我坚持并且建议读者在设计类时“以行为为中心”，即首先考虑类应该提供什么样的函数。Microsoft
公司的COM 规范的核心是接口设计，COM 的接口就相当于类的公有函数[Rogerson
1999]。在程序设计方面，咱们不要怀疑Microsoft 公司的风格。</p>
<p>
　　设计孤立的类是比较容易的，难的是正确设计基类及其派生类。因为有些程序员搞不清楚“继承”（Inheritance）、“组合”（Composition）、“多态”（
Polymorphism）这些概念。</p>
<p>&nbsp;</p>
<p>1.2 继承与组合</p>
<p>　　如果A 是基类，B 是A 的派生类，那么B 将继承A 的数据和函数。示例程序如下：</p>
<p class="code">class A<br>
{<br>
public:<br>
void Func1(void);<br>
void Func2(void);<br>
};<br>
class B : public A<br>
{<br>
public:<br>
void Func3(void);<br>
void Func4(void);<br>
};<br>
// Example<br>
main()<br>
{<br>
B b; // B的一个对象<br>
b.Func1(); // B 从A 继承了函数Func1<br>
b.Func2(); // B 从A 继承了函数Func2<br>
b.Func3();<br>
b.Func4();<br>
}</p>
<p>
　　这个简单的示例程序说明了一个事实：C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用，才要防止乱用“继承”。我们要给“继承”立一些使用规则：</p>
<p>　　一、如果类A 和类B 毫不相关，不可以为了使B 的功能更多些而让B 继承A 的功能。</p>
<p>　　不要觉得“不吃白不吃”，让一个好端端的健壮青年无缘无故地吃人参补身体。</p>
<p>　　二、如果类B 有必要使用A 的功能，则要分两种情况考虑：</p>
<p>　　（1）若在逻辑上B 是A 的“一种”（a kind of ），则允许B 继承A
的功能。如男人（Man）是人（Human）的一种，男孩（Boy）是男人的一种。那么类Man 可以从类Human 派生，类Boy
可以从类Man 派生。示例程序如下：</p>
<p class="code">class Human<br>
{<br>
…<br>
};<br>
class Man : public Human<br>
{<br>
…<br>
};<br>
class Boy : public Man<br>
{<br>
…<br>
};</p>
<p>　　（2）若在逻辑上A 是B 的“一部分”（a part of），则不允许B 继承A
的功能，而是要用A和其它东西组合出B。例如眼（Eye）、鼻（Nose）、口（Mouth）、耳（Ear）是头（Head）的一部分，所以类Head
应该由类Eye、Nose、Mouth、Ear 组合而成，不是派生而成。示例程序如下：</p>
<p class="code">class Eye<br>
{<br>
public:<br>
void Look(void);<br>
};<br>
class Nose<br>
{<br>
public:<br>
void Smell(void);<br>
};<br>
class Mouth<br>
{<br>
public:<br>
void Eat(void);<br>
};<br>
class Ear<br>
{<br>
public:<br>
void Listen(void);<br>
};<br>
// 正确的设计，冗长的程序<br>
class Head<br>
{<br>
public:<br>
void Look(void) { m_eye.Look(); }<br>
void Smell(void) { m_nose.Smell(); }<br>
void Eat(void) { m_mouth.Eat(); }<br>
void Listen(void) { m_ear.Listen(); }<br>
private:<br>
Eye m_eye;<br>
Nose m_nose;<br>
Mouth m_mouth;<br>
Ear m_ear;<br>
};</p>
<p>　　如果允许Head 从Eye、Nose、Mouth、Ear 派生而成，那么Head
将自动具有Look、Smell、Eat、Listen 这些功能：</p>
<p class="code">// 错误的设计<br>
class Head : public Eye, public Nose, public Mouth, public Ear<br>
{<br>
};</p>
<p>　　上述程序十分简短并且运行正确，但是这种设计却是错误的。很多程序员经不起“继承”的诱惑而犯下设计错误。</p>
<p>　　一只公鸡使劲地追打一只刚下了蛋的母鸡，你知道为什么吗？</p>
<p>　　因为母鸡下了鸭蛋。</p>
<p>　　本书3.3 节讲过“运行正确”的程序不见得就是高质量的程序，此处就是一个例证。</p>
<p>&nbsp;</p>
<p>1.3 虚函数与多态</p>
<p>　　除了继承外，C++的另一个优良特性是支持多态，即允许将派生类的对象当作基类的对象使用。如果A 是基类，B 和C 是A
的派生类，多态函数Test 的参数是A 的 指针。那么Test 函数可以引用A、B、C 的对象。示例程序如下：</p>
<p class="code">class A<br>
{<br>
public:<br>
void Func1(void);<br>
};<br>
void Test(A *a)<br>
{<br>
a-&gt;Func1();<br>
}<br>
class B : public A<br>
{<br>
…<br>
};<br>
class C : public A<br>
{<br>
…<br>
};<br>
// Example<br>
main()<br>
{<br>
A a;<br>
B b;<br>
C c;<br>
Test(&amp;a);<br>
Test(&amp;b);<br>
Test(&amp;c);<br>
};</p>
<p>　　以上程序看不出“多态”有什么价值，加上虚函数和抽象基类后，“多态”的威力就显示出来了。</p>
<p>　　C++用关键字virtual
来声明一个函数为虚函数，派生类的虚函数将（override）基类对应的虚函数的功能。示例程序如下：</p>
<p class="code">class A<br>
{<br>
public:<br>
virtual void Func1(void){ cout&lt;&lt; “This is A::Func1 \n”}<br>
};<br>
void Test(A *a)<br>
{<br>
a-&gt;Func1();<br>
}<br>
class B : public A<br>
{<br>
public:<br>
virtual void Func1(void){ cout&lt;&lt; “This is B::Func1 \n”}<br>
};<br>
class C : public A<br>
{<br>
public:<br>
virtual void Func1(void){ cout&lt;&lt; “This is C::Func1 \n”}<br>
};<br>
// Example<br>
main()<br>
{<br>
A a;<br>
B b;<br>
C c;<br>
Test(&amp;a); // 输出This is A::Func1<br>
Test(&amp;b); // 输出This is B::Func1<br>
Test(&amp;c); // 输出This is C::Func1<br>
};</p>
<p>　　如果基类A 定义如下：</p>
<p class="code">class A<br>
{<br>
public:<br>
virtual void Func1(void)=0;<br>
};</p>
<p>　　那么函数Func1
叫作纯虚函数，含有纯虚函数的类叫作抽象基类。抽象基类只管定义纯虚函数的形式，具体的功能由派生类实现。</p>
<p>　　结合“抽象基类”和“多态”有如下突出优点：</p>
<p>　　（1）应用程序不必为每一个派生类编写功能调用，只需要对抽象基类进行处理即可。这一<br>
招叫“以不变应万变”，可以大大提高程序的可复用性（这是接口设计的复用，而不是代码实现的复用）。</p>
<p>
　　（2）派生类的功能可以被基类指针引用，这叫向后兼容，可以提高程序的可扩充性和可维护性。以前写的程序可以被将来写的程序调用不足为奇，但是将来写的程序可以被以前写的程序调用那可了不起。</p>
<p>&nbsp;</p>
<p><strong>2 良好的编程风格</strong></p>
<p>　　内功深厚的武林高手出招往往平淡无奇。同理，编程高手也不会用奇门怪招写程序。良好的编程风格是产生高质量程序的前提。</p>
<p>2.1 命名约定</p>
<p>
　　有不少人编程时用拼音给函数或变量命名，这样做并不能说明你很爱国，却会让用此程序的人迷糊（很多南方人不懂拼音，我就不懂）。程序中的英文一般不会太复杂，用词要力求准确。匈牙利命名法是Microsoft
公司倡导的[Maguire
1993]，虽然很烦琐，但用习惯了也就成了自然。没有人强迫你采用何种命名法，但有一点应该做到：自己的程序命名必须一致。</p>
<p>　　以下是我编程时采用的命名约定：</p>
<p>　　（1）宏定义用大写字母加下划线表示，如MAX_LENGTH；</p>
<p>　　（2）函数用大写字母开头的单词组合而成，如SetName, GetName ；</p>
<p>　　（3）指针变量加前缀p，如*pNode ；</p>
<p>　　（4）BOOL 变量加前缀b，如bFlag ；</p>
<p>　　（5）int 变量加前缀i，如iWidth ；</p>
<p>　　（6）float 变量加前缀f，如fWidth ；</p>
<p>　　（7）double 变量加前缀d，如dWidth ；</p>
<p>　　（8）字符串变量加前缀str，如strName ；</p>
<p>　　（9）枚举变量加前缀e，如eDrawMode ；</p>
<p>　　（10）类的成员变量加前缀m_，如m_strName, m_iWidth ；</p>
<p>　　对于int, float, double 型的变量，如果变量名的含义十分明显，则不加前缀，避免烦琐。如用于循环的int
型变量i,j,k ；float 型的三维坐标（x,y,z）等。</p>
<p>2.2 使用断言</p>
<p>　　程序一般分为Debug 版本和Release 版本，Debug 版本用于内部调试，Release
版本发行给用户使用。断言assert 是仅在Debug
版本起作用的宏，它用于检查“不应该”发生的情况。以下是一个内存复制程序，在运行过程中，如果assert
的参数为假，那么程序就会中止（一般地还会出现提示对话，说明在什么地方引发了assert）。</p>
<p class="code">//复制不重叠的内存块<br>
void memcpy(void *pvTo, void *pvFrom, size_t size)<br>
{<br>
void *pbTo = (byte *) pvTo;<br>
void *pbFrom = (byte *) pvFrom;<br>
assert( pvTo != NULL &amp;&amp; pvFrom != NULL );<br>
while(size - - &gt; 0 )<br>
*pbTo + + = *pbFrom + + ;<br>
return (pvTo);<br>
}</p>
<p>　　assert 不是一个仓促拼凑起来的宏，为了不在程序的Debug 版本和Release 版本引起差别，assert
不应该产生任何副作用。所以assert 不是函数，而是宏。程序员可以把assert
看成一个在任何系统状态下都可以安全使用的无害测试手段。</p>
<p>
　　很少有比跟踪到程序的断言，却不知道该断言的作用更让人沮丧的事了。你化了很多时间，不是为了排除错误，而只是为了弄清楚这个错误到底是什么。有的时候，程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么，就很难判断错误是出现在程序中，还是出现在断言中。幸运的是这个问题很好解决，只要加上清晰的注释即可。这本是显而易见的事情，可是很少有程序员这样做。这好比一个人在森林里，看到树上钉着一块“危险”的大牌子。但危险到底是什么？树要倒？有废井？有野兽？除非告诉人们“危险”是什么，否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略，甚至被删除。[Maguire
1993]</p>
<p>　　以下是使用断言的几个原则：</p>
<p>
　　（1）使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别，后者是必然存在的并且是一定要作出处理的。</p>
<p>　　（2）使用断言对函数的参数进行确认。</p>
<p>　　（3）在编写函数时，要进行反复的考查，并且自问：“我打算做哪些假定？”一旦确定了的<br>
假定，就要使用断言对假定进行检查。</p>
<p>
　　（4）一般教科书都鼓励程序员们进行防错性的程序设计，但要记住这种编程风格会隐瞒错误。当进行防错性编程时，如果“不可能发生”的事情的确发生了，则要使用断言进行报警。</p>
<p>&nbsp;</p>
<p>2.3 new、delete 与指针</p>
<p>　　在C++中，操作符new 用于申请内存，操作符delete 用于释放内存。在C 语言中，函数malloc
用于申请内存，函数free 用于释放内 存。由于C++兼容C 语言，所以new、delete、malloc、free
都有可能一起使用。new 能比malloc 干更多的事，它可以申请对象的内存，而malloc 不能。C++和C
语言中的指针威猛无比，用错了会带来灾难。对于一个指针p，如果是用new申请的内存，则必须用delete 而不能用free
来释放。如果是用malloc 申请的内存，则必须用free 而不能用delete 来释放。在用delete 或用free 释放p
所指的内存后，应该马上显式地将p 置为NULL，以防下次使用p 时发生错误。示例程序如下：</p>
<p class="code">void Test(void)<br>
{<br>
float *p;<br>
p = new float[100];<br>
if(p==NULL) return;<br>
…// do something<br>
delete p;<br>
p=NULL; // 良好的编程风格<br>
// 可以继续使用p<br>
p = new float[500];<br>
if(p==NULL) return;<br>
…// do something else<br>
delete p;<br>
p=NULL;<br>
}</p>
<p>　　我们还要预防“野指针”，“野指针”是指向“垃圾”内存的指针，主要成因有两种：</p>
<p>　　（1）指针没有初始化。<br>
　　（2）指针指向已经释放的内存，这种情况最让人防不胜防，示例程序如下：</p>
<p class="code">class A<br>
{<br>
public:<br>
void Func(void){…}<br>
};<br>
void Test(void)<br>
{<br>
A *p;<br>
{<br>
A a;<br>
p = &amp;a; // 注意a 的生命期<br>
}<br>
p-&gt;Func(); // p 是“野指针”，程序出错<br>
}</p>
<p>2.4 使用const</p>
<p>　　在定义一个常量时，const 比#define 更加灵活。用const
定义的常量含有数据类型，该常量可以参与逻辑运算。例如：</p>
<p class="code">const int LENGTH = 100; // LENGTH 是int 类型<br>
const float MAX=100; // MAX 是float 类型<br>
#define LENGTH 100 // LENGTH 无类型<br>
#define MAX 100 // MAX 无类型</p>
<p>　　除了能定义常量外，const 还有两个“保护”功能：</p>
<p>　　一、强制保护函数的参数值不发生变化</p>
<p>　　以下程序中，函数f 不会改变输入参数name 的值，但是函数g 和h 都有可能改变name的值。</p>
<p class="code">void f(String s); // pass by value<br>
void g(String &amp;s); // pass by referance<br>
void h(String *s); // pass by pointer<br>
main()<br>
{<br>
String name=“Dog”;<br>
f(name); // name 的值不会改变<br>
g(name); // name 的值可能改变<br>
h(name); // name 的值可能改变<br>
}</p>
<p>
　　对于一个函数而言，如果其‘&amp;’或‘*’类型的参数只作输入用，不作输出用，那么应当在该参数前加上const，以确保函数的代码不会改变该参数的值（如果改变了该参数的值，编译器会出现错误警告）。因此上述程序中的函数g
和h 应该定义成：</p>
<p class="code">void g(const String &amp;s);<br>
void h(const String *s);</p>
<p>　　二、强制保护类的成员函数不改变任何数据成员的值</p>
<p>　　以下程序中，类stack 的成员函数Count 仅用于计数，为了确保Count
不改变类中的任何数据成员的值，应将函数Count 定义成const 类型。</p>
<p class="code">class Stack<br>
{<br>
public:<br>
void push(int elem);<br>
void pop(void);<br>
int Count(void) const; // const 类型的函数<br>
private:<br>
int num;<br>
int data[100];<br>
};<br>
int Stack::Count(void) const<br>
{<br>
++ num; // 编译错误，num 值发生变化<br>
pop(); // 编译错误，pop 将改变成员变量的值<br>
return num;<br>
}</p>
<p class="code">&nbsp;</p>
<p>2.5 其它建议</p>
<p>　　（1）不要编写一条过分复杂的语句，紧凑的C++/C
代码并不见到能得到高效率的机器代码，却会降低程序的可理解性，程序出错误的几率也会提高。<br>
　　（2）不要编写集多种功能于一身的函数，在函数的返回值中，不要将正常值和错误标志混在一起。<br>
　　（3）不要将BOOL 值TRUE 和FALSE 对应于1 和0 进行编程。大多数编程语言将FALSE定义为0，任何非0
值都是TRUE。Visual C++将TRUE 定义为1，而Visual Basic 则将TRUE定义为-1。示例程序如下：</p>
<p class="code">BOOL flag;<br>
…<br>
if(flag) { // do something } // 正确的用法<br>
if(flag==TRUE) { // do something } // 危险的用法<br>
if(flag==1) { // do something } // 危险的用法<br>
if(!flag) { // do something } // 正确的用法<br>
if(flag==FALSE) { // do something } // 不合理的用法<br>
if(flag==0) { // do something } // 不合理的用法</p>
<p>　　（4）小心不要将“= =”写成“=”，编译器不会自动发现这种错误。</p>
<p>　　（5）不要将123 写成0123，后者是八进制的数值。</p>
<p>　　（6）将自己经常犯的编程错误记录下来，制成表格贴在计算机旁边。</p>
<p><br>
<strong>3 小结</strong></p>
<p>　　C++/C 程序设计如同少林寺的武功一样博大精深，我练了8
年，大概只学到二三成。所以无论什么时候，都不要觉得自己的编程水平天下第一，看到别人好的技术和风格，要虚心学习。本章的内容少得可怜，就象口渴时只给你一颗杨梅吃，你一定不过瘾。我借花献佛，推荐一本好书：Marshall
P. Cline 著的《C++ FAQs》[Cline 1995]。你看了后一定会赞不绝口。会编写C++/C
程序，不要因此得意洋洋，这只是程序员基本的技能要求而已。如果把系统分析和系统设计比作“战略决策”，那么编程充其量只是“战术”。如果指挥官是个大笨蛋，士兵再勇敢也会吃败仗。所以我们程序员不要只把眼光盯在程序上，要让自己博学多才。我们应该向北京胡同里的小孩们学习，他们小小年纪就能指点江山，评论世界大事。</p>

]]></description><guid>http://www.i170.com/Article/37690</guid><trackback:ping>http://www.i170.com/Article/37690/trackback</trackback:ping><comments>http://www.i170.com/Article/37690#comment</comments><wfw:commentRss>http://www.i170.com/Article/37690/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/36967</link><title><![CDATA[VC启动窗口画面制作方法研究]]></title><author>makowolf</author><category></category><pubDate>Thu, 31 Aug 2006 17:48:48  +0800</pubDate><description><![CDATA[<p align="center"><strong>VC启动窗口画面制作方法研究</strong></p>
<p><strong>1. 概述<br>
<br></strong>前几天在设计软件时，选择VC作为开发工具，想做个启动画面，由于以前没有制作过，所以到网上搜了一通。网上有几篇相关文章，有两篇我觉得很有价值：一篇是关于
为方便显示图像制作的CPicture类的文章，原文是由Paul
DiLascia写的解答，很有影响力；还有一篇是关于制作真彩启动画面的文章，不过其限制对位图操作，而不支持jpg,
gif，而且使用繁琐，基本上是对Splash Screen组件导入后的代码进行简单修改。琢磨了好大一会儿才学会使用。<br>
<br>
有感于现有材料使用起来不方便，随进行了整合和再封装处理,设计了CSplashWnd类，使用起来非常简便。下面就把我设计的类介绍给大家。有什么不当或错误之处，敬请指正。我的Email:
zhengxiliu@sohu.com<br>
<br>
<strong>2．CSplashWnd功能</strong><br>
<br>
能够显示真彩启动画面，能在画面上显示初始化文字信息，支持jpg,gif,bmp图像文件。<br>
<br>
<strong>3. CSplashWnd的设计</strong><br>
<br>
3.1 用户关心的接口<br>
<br>
用户使用的公开接口：<br>
<br>
public:<br>
CSplashWnd(LPCTSTR lpszFileName);// 指定作为启动画面的图像文件,并装载<br>
BOOL ShowSplash();//显示画面<br>
void CloseSplash();//关闭画面<br>
void ShowText(LPCTSTR pCh);在显示的图像上中间位置处显示初始化信息文字<br>
<br>
3.2 其他接口<br>
系统使用的公开接口：(用户不关心)<br>
~CSplashWnd()<br>
void PostNcDestroy();<br>
<br>
私有接口：(用户不关心)<br>
BOOL Create(CWnd* pParentWnd = NULL);<br>
int OnCreate(LPCREATESTRUCT lpCreateStruct);<br>
void OnPaint();<br>
<br>
3.3 数据设计(用户不关心)<br>
BOOL fileIsValid//指示<br>
CPicture pic;//用于对图像文件进行操作的类<br>
int width,height;<br>
<br>
3.4 限制<br>
<br>
√ 不允许继承。<br>
√ 为简化接口，只提供从文件装载图像<br>
3.5 需要的头文件<br>
<br>
StdAfx.h, VC++6.0自动生成的对MFC的支持，不同的工程选项会产生不同的StdAfx.h。<br>
<br>
afxwin.h 支持CRect类<br>
<br>
atlbase.h 提供对IPicture （COM类）的支持。<br>
<br>
afxpriv2.h提供对CArchiveStream类的支持。<br>
<br>
<strong>4.类的健壮性和可调试性设计</strong><br>
<br>
图像文件是否有效?<br>
<br>
需要检查文件是否有效，当装载图像文件失败时，fileIsValid为false，否则为true。这样在调用ShowSplash时将什么都不做，返回false。这时，用户应检查图像文件是否存在，文件名称拼写是否正确。<br>
<br>
<strong>5. 用法</strong><br>
<br>
√ 将CSplashWnd类加入项目中<br>
<br>
√ 在使用CSplashWnd类的文件中#include “Splash.h”<br>
<br>
√ 在合适的位置定义一个CSplashWnd对象<br>
<br>
√ 在想显示启动画面的地方调用ShowSplash显示于屏幕上<br>
<br>
√ 如果想在启动画面上显示一些初始化或其他提示信息，调用ShowText。<br>
<br>
√ 在你想关闭启动画面的地方<br>
<br>
在你的App类InitInstance函数中,显示主窗口之前使用，进行上述步骤，这是最典型的用法，如下面代码所示。<br>
<br>
BOOL CTsApp::InitInstance()<br>
{<br>
 AfxEnableControlContainer();<br>
<br>
#ifdef _AFXDLL<br>
 Enable3dControls();// Call this when using MFC in a
shared DLL<br>
#else<br>
 Enable3dControlsStatic(); // Call this when linking to MFC
statically<br>
#endif<br>
<br>
 SetRegistryKey(_T("Local AppWizard-Generated
Applications"));<br>
 LoadStdProfileSettings();// Load standard INI file options
(including MRU)<br>
<br>
 CSingleDocTemplate* pDocTemplate;<br>
 pDocTemplate = new CSingleDocTemplate(<br>
IDR_MAINFRAME,<br>
RUNTIME_CLASS(CTsDoc),<br>
RUNTIME_CLASS(CMainFrame), // main SDI frame window<br>
RUNTIME_CLASS(CTsView));<br>
 AddDocTemplate(pDocTemplate);<br>
<br>
 CCommandLineInfo cmdInfo;<br>
 ParseCommandLine(cmdInfo);<br>
<br>
 if (!ProcessShellCommand(cmdInfo))<br>
return FALSE;<br>
<br>
/////////////////////////////////////////////////////////////////////////////////////<br>
 CSplashWnd* pCsw = new CSplashWnd("fx.jpg");//located in the
local directory,or else full-path file name is needed<br>
 pCsw-&gt;ShowSplash();<br>
 Sleep(750);//delay some time to observe the image
displayed.<br>
 pCsw-&gt;CloseSplash();<br>
 delete pCsw;<br>
 pCsw = NULL;<br>
/////////////////////////////////////////////////////////////////////////////////////<br>
<br>
 // The one and only window has been initialized, so show and
update it.<br>
 m_pMainWnd-&gt;ShowWindow(SW_SHOW);<br>
 m_pMainWnd-&gt;UpdateWindow();<br>
<br>
 return TRUE;<br>
}<br>
<strong>6. 类代码</strong><br>
<br>
6.1 Splash.h<br>
/////////////////////////////////////////////////////////////////////////////<br>
//Written by Liu Zhengxi<br>
//May 5,2003<br>
//Compiles with Visual C++ 6.0 for Windows 98 and probably Windows
2000<br>
// too.<br>
/////////////////////////////////////////////////////////////////////////////<br>
<br>
#ifndef _SPLASH<br>
#define _SPLASH<br>
#include<br>
#include<br>
<br>
// Splash.h : header file<br>
//<br>
<br>
/////////////////////////////////////////////////////////////////////////////<br>
// Splash Screen class<br>
<br>
#pragma once<br>
<br>
///////////////////////////////////////////////////////////////////////////<br>
// Picture object—encapsulates IPicture<br>
//Written by Paul DiLascia.<br>
//used to display picture<br>
//<br>
<br>
// declare CPicture class<br>
//<br>
<br>
class CPicture {<br>
public:<br>
BOOL Render(CDC* pDC,CRect rc,LPCRECT prcMFBounds=NULL)
const;<br>
 CPicture();<br>
 ~CPicture();<br>
<br>
 // Load from various resources<br>
 BOOL Load(UINT nIDRes);<br>
 BOOL Load(LPCTSTR pszPathName);<br>
 BOOL Load(CFile&amp; file);<br>
 BOOL Load(CArchive&amp; ar);<br>
 BOOL Load(IStream* pstm);<br>
<br>
 // render to device context<br>
<br>
 CSize GetImageSize(CDC* pDC=NULL) const;<br>
 operator IPicture*() {<br>
return m_spIPicture;<br>
 }<br>
<br>
 void GetHIMETRICSize(OLE_XSIZE_HIMETRIC&amp; cx,
OLE_YSIZE_HIMETRIC&amp; cy)<br>
const {<br>
cx = cy = 0;<br>
const_cast&lt;CPicture*&gt;(this)-&gt;m_hr =
m_spIPicture-&gt;get_Width(&amp;cx);<br>
ASSERT(SUCCEEDED(m_hr));<br>
const_cast&lt;CPicture*&gt;(this)-&gt;m_hr =
m_spIPicture-&gt;get_Height(&amp;cy);<br>
ASSERT(SUCCEEDED(m_hr));<br>
 }<br>
<br>
 void Free() {<br>
if (m_spIPicture) {<br>
 m_spIPicture.Release();<br>
}<br>
 }<br>
<br>
protected:<br>
 CComQIPtr&lt;IPicture&gt;m_spIPicture; // ATL smart pointer to
IPicture<br>
 HRESULT m_hr;// last error code<br>
};<br>
<br>
<br>
///////////////////////////////////////////////////////////////////<br>
//<br>
//declare CSplashWnd<br>
//<br>
<br>
class CSplashWnd : public CWnd<br>
{<br>
// Construction<br>
public:<br>
CSplashWnd(LPCTSTR lpszFileName);<br>
// Operations<br>
public:<br>
BOOL ShowSplash();<br>
BOOL PreTranslateAppMessage(MSG* pMsg);<br>
void ShowText(LPCTSTR lpStr);<br>
void CloseSplash();<br>
// Overrides<br>
// ClassWizard generated virtual function overrides<br>
//{{AFX_VIRTUAL(CSplashWnd)<br>
//}}AFX_VIRTUAL<br>
// Implementation<br>
public:<br>
~CSplashWnd();<br>
virtual void PostNcDestroy();<br>
private:<br>
BOOL Create(CWnd* pParentWnd = NULL);<br>
// Generated message map functions<br>
private:<br>
//{{AFX_MSG(CSplashWnd)<br>
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<br>
afx_msg void OnPaint();<br>
//}}AFX_MSG<br>
DECLARE_MESSAGE_MAP()<br>
private:<br>
int height;//the height of the displayed picture<br>
int width;//the width of the displayed picture<br>
CPicture pic;//used to operate the picture<br>
 BOOL fileIsValid;<br>
};<br>
<br>
#endif<br>
6.2 Splash.cpp<br>
///////////////////////////////////////////////////////////////////////////////<br>
//Written by Liu Zhengxi<br>
//May 5,2003<br>
//Compiles with Visual C++ 6.0 for Windows 98 and probably Windows
2000<br>
// too.<br>
/////////////////////////////////////////////////////////////////////////////<br>
<br>
//<br>
// Splash.cpp : implementation file<br>
//<br>
<br>
<br>
#include &lt;atlbase.h&gt;<br>
#include &lt;afxwin.h&gt;<br>
#include &lt;afxpriv2.h&gt;<br>
#include "stdafx.h"// e. g. stdafx.h<br>
#include "Splash.h"// e.g. splash.h<br>
<br>
#ifdef _DEBUG<br>
#define new DEBUG_NEW<br>
#undef THIS_FILE<br>
static char BASED_CODE THIS_FILE[] = __FILE__;<br>
#endif<br>
<br>
/////////////////////////////////////////////////////////////////////////////<br>
// CSplashWnd class<br>
<br>
////////////////////////////////////////////////////////////////////////////<br>
//constructor<br>
//Load image from the given file<br>
//<br>
<br>
CSplashWnd::CSplashWnd(LPCTSTR lpszFileName)<br>
{<br>
 fileIsValid = pic.Load(lpszFileName);<br>
 if(fileIsValid)<br>
 {<br>
CSize cz = pic.GetImageSize(NULL);<br>
width = cz.cx;<br>
height = cz.cy;<br>
 }<br>
}<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//nothing to do<br>
//deconstructor<br>
//<br>
CSplashWnd::~CSplashWnd()<br>
{<br>
}<br>
<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//message map<br>
//<br>
<br>
BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)<br>
 //{{AFX_MSG_MAP(CSplashWnd)<br>
 ON_WM_CREATE()<br>
 ON_WM_PAINT()<br>
 ON_WM_TIMER()<br>
 //}}AFX_MSG_MAP<br>
END_MESSAGE_MAP()<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
<br>
//ShowSplash<br>
//to display the given image on screen<br>
//<br>
BOOL CSplashWnd::ShowSplash()<br>
{<br>
 if(fileIsValid)<br>
 {<br>
if (!Create(AfxGetMainWnd()))<br>
 return false;<br>
else<br>
{<br>
 UpdateWindow();<br>
 return true;<br>
}<br>
 }<br>
 else<br>
 {<br>
return false;<br>
 }<br>
}<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//PreTranslateAppMessage<br>
//<br>
<br>
BOOL CSplashWnd::PreTranslateAppMessage(MSG* pMsg)<br>
{<br>
 // If we get a keyboard or mouse message, hide the splash
screen.<br>
 if (pMsg-&gt;message == WM_KEYDOWN ||<br>
 pMsg-&gt;message == WM_SYSKEYDOWN ||<br>
 pMsg-&gt;message == WM_LBUTTONDOWN ||<br>
 pMsg-&gt;message == WM_RBUTTONDOWN ||<br>
 pMsg-&gt;message == WM_MBUTTONDOWN ||<br>
 pMsg-&gt;message == WM_NCLBUTTONDOWN ||<br>
 pMsg-&gt;message == WM_NCRBUTTONDOWN ||<br>
 pMsg-&gt;message == WM_NCMBUTTONDOWN)<br>
 {<br>
CloseSplash();<br>
return TRUE; // message handled here<br>
 }<br>
 return FALSE;// message not handled<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//Create<br>
//make a popup splash window<br>
//<br>
<br>
BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)<br>
{<br>
 return CreateEx(0,<br>
AfxRegisterWndClass(0,
AfxGetApp()-&gt;LoadStandardCursor(IDC_ARROW)),<br>
NULL, WS_POPUP | WS_VISIBLE, 0, 0, width, height,
pParentWnd-&gt;GetSafeHwnd(), NULL);<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//CloseSplash<br>
//Quit the splash window<br>
//<br>
<br>
void CSplashWnd::CloseSplash()<br>
{<br>
 // Destroy the window, and update the mainframe.<br>
 DestroyWindow();<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//do nothing<br>
//<br>
<br>
void CSplashWnd::PostNcDestroy()<br>
{<br>
}<br>
<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//OnCreate<br>
//put the splash window on center<br>
//<br>
<br>
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)<br>
{<br>
 if (CWnd::OnCreate(lpCreateStruct) == -1)<br>
return -1;<br>
<br>
 // Center the window.<br>
 CenterWindow();<br>
 return 0;<br>
}<br>
<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//OnPaint<br>
//Display the given image<br>
<br>
//<br>
<br>
void CSplashWnd::OnPaint()<br>
{<br>
CPaintDC dc(this);<br>
CRect rc(0,0,0,0);;<br>
pic.Render(&amp;dc, rc);<br>
}<br>
<br>
<br>
////////////////////////////////////////////////////////////////////////////////<br>
//ShowText<br>
//sometimes if we show what we are doing (I display the information
on the center of //the picture ), the customer will be more
//patient<br>
//<br>
//<br>
<br>
void CSplashWnd::ShowText(LPCTSTR lpStr)<br>
{<br>
 Invalidate();<br>
 CPaintDC dc(this);<br>
 dc.SetBkMode(TRANSPARENT);<br>
 SIZE sz;<br>
 sz = (SIZE)dc.GetTextExtent(lpStr,strlen(lpStr));<br>
 dc.TextOut((width-sz.cx)/2,height/2,lpStr);<br>
}<br>
<br>
////////////////////////////////////////////////////////////////<br>
// MSDN Magazine — October 2001<br>
// If this code works, it was written by Paul DiLascia.<br>
// If not, I don''t know who wrote it.<br>
// Compiles with Visual C++ 6.0 for Windows 98 and probably Windows
2000<br>
// too.<br>
// Set tabsize = 3 in your editor.<br>
//<br>
<br>
////////////////////////////////////////////////////////////////<br>
// CPicture implementation<br>
//<br>
<br>
CPicture::CPicture()<br>
{<br>
}<br>
<br>
CPicture::~CPicture()<br>
{<br>
}<br>
<br>
//////////////////<br>
// Load from resource. Looks for "IMAGE" type.<br>
//<br>
<br>
BOOL CPicture::Load(UINT nIDRes)<br>
{<br>
 // find resource in resource file<br>
 HINSTANCE hInst = AfxGetResourceHandle();<br>
 HRSRC hRsrc = ::FindResource(hInst,<br>
MAKEINTRESOURCE(nIDRes),<br>
"IMAGE"); // type<br>
 if (!hRsrc)<br>
return FALSE;<br>
<br>
 // load resource into memory<br>
 DWORD len = SizeofResource(hInst, hRsrc);<br>
 BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);<br>
 if (!lpRsrc)<br>
return FALSE;<br>
<br>
 // create memory file and load it<br>
 CMemFile file(lpRsrc, len);<br>
 BOOL bRet = Load(file);<br>
 FreeResource(hRsrc);<br>
 return bRet;<br>
}<br>
<br>
<br>
<br>
//////////////////<br>
// Load from path name.<br>
//<br>
<br>
BOOL CPicture::Load(LPCTSTR pszPathName)<br>
{<br>
 CFile file;<br>
 if (!file.Open(pszPathName,
Cfile&amp;::modeRead|Cfile&amp;::shareDenyWrite))<br>
return FALSE;<br>
 BOOL bRet = Load(file);<br>
 file.Close();<br>
 return bRet;<br>
}<br>
<br>
<br>
//////////////////<br>
// Load from CFile<br>
//<br>
<br>
BOOL CPicture::Load(CFile&amp; file)<br>
{<br>
 CArchive ar(&amp;file, CArchive::load |
CArchive::bNoFlushOnDelete);<br>
 return Load(ar);<br>
}<br>
<br>
<br>
<br>
//////////////////<br>
// Load from archive—create stream and load from stream.<br>
//<br>
<br>
BOOL CPicture::Load(CArchive&amp; ar)<br>
{<br>
 CArchiveStream arcstream(&amp;ar);<br>
 return Load((IStream*)&amp;arcstream);<br>
}<br>
<br>
<br>
//////////////////<br>
// Load from stream (IStream). This is the one that really does it:
call<br>
// OleLoadPicture to do the work.<br>
//<br>
<br>
BOOL CPicture::Load(IStream* pstm)<br>
{<br>
 Free();<br>
 HRESULT hr = OleLoadPicture(pstm, 0, FALSE,<br>
IID_IPicture, (void**)&amp;m_spIPicture);<br>
 ASSERT(SUCCEEDED(hr) &amp;&amp; m_spIPicture);<br>
 return TRUE;<br>
}<br>
<br>
<br>
//////////////////<br>
// Get image size in pixels. Converts from HIMETRIC to device
coords.<br>
//<br>
<br>
CSize CPicture::GetImageSize(CDC* pDC) const<br>
{<br>
 if (!m_spIPicture)<br>
return CSize(0,0);<br>
<br>
 LONG hmWidth, hmHeight; // HIMETRIC units<br>
 m_spIPicture-&gt;get_Width(&amp;hmWidth);<br>
 m_spIPicture-&gt;get_Height(&amp;hmHeight);<br>
 CSize sz(hmWidth,hmHeight);<br>
 if (pDC==NULL) {<br>
CWindowDC dc(NULL);<br>
dc.HIMETRICtoDP(&amp;sz); // convert to pixels<br>
 } else {<br>
pDC-&gt;HIMETRICtoDP(&amp;sz);<br>
 }<br>
 return sz;<br>
}<br>
<br>
//////////////////<br>
// Render to device context. Covert to HIMETRIC for IPicture.<br>
//<br>
<br>
BOOL CPicture::Render(CDC* pDC, CRect rc, LPCRECT prcMFBounds)
const<br>
{<br>
 ASSERT(pDC);<br>
 if (rc.IsRectNull()) {<br>
CSize sz = GetImageSize(pDC);<br>
rc.right = sz.cx;<br>
rc.bottom = sz.cy;<br>
 }<br>
 long hmWidth,hmHeight; // HIMETRIC units<br>
 GetHIMETRICSize(hmWidth, hmHeight);<br>
 m_spIPicture-&gt;Render(*pDC, rc.left, rc.top, rc.Width(),
rc.Height(),<br>
0, hmHeight, hmWidth, -hmHeight, prcMFBounds);<br>
 return TRUE;<br>
}<br></p>
<p>（转）</p>

]]></description><guid>http://www.i170.com/Article/36967</guid><trackback:ping>http://www.i170.com/Article/36967/trackback</trackback:ping><comments>http://www.i170.com/Article/36967#comment</comments><wfw:commentRss>http://www.i170.com/Article/36967/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/36784</link><title><![CDATA[MM和GG令人吐血的聊天]]></title><author>makowolf</author><category></category><pubDate>Wed, 30 Aug 2006 18:05:40  +0800</pubDate><description><![CDATA[<div class="content">牧：你嚎吗？<br>
天狼：你才嚎呢。<br>
野牧：打错字了，我是说你好吗？<br>
天狼：不坏。<br>
野牧：哪人呀？<br>
天狼：西北。<br>
野牧：你那 里也很冷吧？<br>
天狼：漫天飞雪，冷风如刀<br>
野牧：你叫什么名字？<br>
天狼：天狼<br>
野牧：我是问真名。<br>
天狼：QQ上有。<br>
野牧：说出来好吗？<br>
天狼：为什么要说？<br>
野牧：说出来才好吗。<br>
天狼：怎么好呢？<br>
野牧：因为是我问的吗。<br>
天狼：你问的就不能不说吗？<br>
野牧：我不是坏人呀。<br>
天狼：坏人贴标签了么？<br>
野牧：没有啊。但我是好人呀。<br>
天狼：请把好人证书传来。<br>
野牧：没有啊。但你说才表示有诚意交朋友啊。<br>
天狼：tianlang^_^<br>
野牧：打汗字好吗？<br>
天狼：我打字不出汗。<br>
野牧：我是说打你的名字。<br>
天狼：我的名字惹你了吗？<br>
野牧：没有啊。<br>
天狼：那干嘛打我的名字？<br>
野牧：我是说打字。<br>
天狼：哪个字惹你了？<br>
野牧：唉，告诉我你的电话吧。<br>
天狼：塑料的，红色。<br>
野牧：不是，我是要你给我你的电话。<br>
天狼：我的电话我家还要用呢，你想要自己买去。<br>
野牧：不是，我是要你把电话说出来。<br>
天狼：电话是说出来的吗？我还以为是工厂做出来的呢。<br>
野牧：不是，我是要你的电话号。<br>
天狼：在电话上嵌着呢，拿不下来啊。<br>
野牧：我是问你的电话号是多少。<br>
天狼：十二个，十个数字键，一个米字键，一个井字键。<br>
野牧：我是问电话号是几。<br>
天狼：从1到9，0在后边。<br>
野牧：我崩溃了！<br>
天狼：？你哪不舒服？<br>
野牧：不是啊。<br>
天狼：那怎么崩溃了？绝症吗？<br>
野牧：问不到你的电话了啊。<br>
天狼：那很重要吗？<br>
野牧：电话是干什么的，不就是用来说话的吗？你要告诉别人,电话才有用啊。<br>
天狼：电话是用来上网的。<br>
野牧：电话还是用来聊天的啊。<br>
天狼：是啊，我们不是一直在聊电话吗？<br>
野牧：哪聊了？你这半天什么都没说啊。<br>
天狼：我说了几十句话了。<br>
野牧：唉，你都把我说晕了，下次再聊吧，88<br>
天狼：Bye Bye</div>
<div class="content"></div>
<div class="content">（转）</div>

]]></description><guid>http://www.i170.com/Article/36784</guid><trackback:ping>http://www.i170.com/Article/36784/trackback</trackback:ping><comments>http://www.i170.com/Article/36784#comment</comments><wfw:commentRss>http://www.i170.com/Article/36784/commentRss</wfw:commentRss></item> <item><link>http://www.i170.com/Article/36746</link><title><![CDATA[汽车幽默笑话e网打尽]]></title><author>makowolf</author><category></category><pubDate>Wed, 30 Aug 2006 15:34:11  +0800</pubDate><description><![CDATA[<p><font color="#0000FF" size="4">违章停车</font></p>
<p>
　　路边停着一辆宝马，属违章停车。警察过来，贴条儿，抄单子。哥们儿从商场出来：“你丫不就是警察么，牛什么啊？不就会贴条儿、抄单子么！”警察看他一眼，没说话，继续抄单子。你要真牛b，甭贴条儿，你直接叫拖车拖走！”警察看他一眼，还没说话。“牛什么啊！除了贴条儿吓唬我们你们还会什么！牛b你拖走！”警察抄完单子，打电话，叫拖车。拖车来了。警察看着那哥们儿。“嘿，你还真牛啊！你真牛，你拖走啊！借你俩胆儿！”警察一摆手，拖走了。警察看他两眼，想劝劝他，往后别这么叫板。哥们儿一翻白眼儿：“你牛b，待会儿你等车主来了你告诉他,你把他的车拖走了！”</p>
<p>&nbsp;</p>
<p><font color="#0000FF" size="4">飚车的拖拉机</font></p>
<p>
　　一个老板酒后，心情非常高兴，吹着口哨，开着心爱的奔驰600在公路上行使，这时，他发现路边停着一辆农用拖拉机，并且有一个人在摆手。于是，他停下车，原来，这个拖拉机坏在路上，想找人帮助拖走。老板今天心情非常高兴，便答应了。两个人同时约定好，如果拖拉机打右转向灯，请继续开。如果拖拉机打左转向，请停车。然后，老板开着奔驰600与拖拉机一起上路了。(当然开的很慢了)突然，一辆宝马轿车从后面以极快的速度超过他们，老板一看，非常生气，怒骂到：“还没有人敢超我奔驰600的呢！”于是，他马上挂高档，急踩油门，奔着宝马就追了上去。(因为喝了酒，他已忘了后面还拖了一辆拖拉机)老板很快的追上了宝马，正当他们以280迈的速度飚车的时候，被路边的一个交通警察发现了，想拦已经来不及了，连忙拿出对讲机，跟下一路段警察联系：“喂，喂，喂，发现两辆车在飚车，速度非常快，一个是宝马，一个是奔驰600，请你拦阻他们，不对，是三辆车在飚车，后面还紧紧的跟着一辆拖拉机，并且拖拉机还打着左转向灯，想超车……</p>
<p>&nbsp;</p>
<p><font color="#0000FF" size="4">开过大奔吗</font><font color="#0000FF"
size="4"><font color="#000000" size=
"3">&nbsp;</font></font>&nbsp;</p>
<p><font color="#000000"><font size=
"2">