<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[极点博客 - 青色咖啡的博客]]></title> 
<link>http://www.t522.com/index.php</link> 
<description><![CDATA[游戏编程,黑客编程学习及探讨,delphi,VC++,C#交流,软件逆向工程,软件加密及破解]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[极点博客 - 青色咖啡的博客]]></copyright>
<item>
<link>http://www.t522.com/post/141/</link>
<title><![CDATA[今天终于把域名从代理商那里转到新网互联了。]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Wed, 09 May 2012 09:54:13 +0000</pubDate> 
<guid>http://www.t522.com/post/141/</guid> 
<description>
<![CDATA[ 
	<p>&nbsp;每年都到这个月找代理商的人，每次代理商都是人毛都没，去年还好，电话还有，QQ不上长线，偶尔也上线，今年电话没有了，QQ没看他上线了，打了不下10个电话，终于转到新网互联会员系统了，每年130，原来只有75块的，明年再转到国外去，国外便宜多了&hellip;&hellip;</p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/140/</link>
<title><![CDATA[祝大家新年快乐，万事如事]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Sun, 22 Jan 2012 17:26:13 +0000</pubDate> 
<guid>http://www.t522.com/post/140/</guid> 
<description>
<![CDATA[ 
	<p>&nbsp; 2012年的春晚不知大家看了没有，我喝多了酒，睡到凌晨才起来，没有来得及看，但从评论上面来看反响不佳，反正这么多年来春晚我都没有看了，基本上都是洗洗睡了，然来再起来上网一夜，大家是怎么过的？</p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/139/</link>
<title><![CDATA[湖南电信星空极速(3.2,3.3)密码破解]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Wed, 28 Dec 2011 06:53:06 +0000</pubDate> 
<guid>http://www.t522.com/post/139/</guid> 
<description>
<![CDATA[ 
	<p>前些天因装了路由器,所以想到了破解星空极速的密码,一分析,发现密码并不复杂,只不过把数字转了 16进制,然后再计算,网上下载的一般都带病毒木马,所以就有了这个小东西的诞生.适合电脑装机人员,自行装路由器的家庭用户。湖南区域可用，外省因无账户，暂无测试，请下载的朋友反馈一下。</p><p>注：必须在破解密码之前在路由器的界面里面把能够通过星空极速上网的电脑的MAC地址复制到路由器里面，不然是不成功的，因为电信记住了原先上网拨号的MAC地址，而路由器另外又带一个MAC地址，所以先要复制一下才可用。</p><p><img border="0" width="292" height="303" alt="" src="attachment/image/1.JPG" /></p><h3 style="color: red; ">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 下载前请注意，暂时只对数字密码进行了解密，字母+符号没有解密,如有需要，请先打10000号改数字密码后再用本软件破解</h3><p><img border="0" width="0" height="0" alt="" src="attachment/image/1.JPG" /><a href="attachment.php?fid=47">点击这里下载文件</a></p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/138/</link>
<title><![CDATA[拦截的API，留下记号]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[转载文章]]></category>
<pubDate>Tue, 12 Apr 2011 11:21:41 +0000</pubDate> 
<guid>http://www.t522.com/post/138/</guid> 
<description>
<![CDATA[ 
	<p>要拦截的API如下：<br /><br />&nbsp;&nbsp; MessageBoxA、MessageBoxW、MessageBeep 和 OpenProcess 。<br /><br />&nbsp;&nbsp; 首先，大家都知道要在整个系统范围中拦截，需要使用Dll来完成。现在我们打开Delphi 2009，新建一个Dll工程：hookDll。需要说明的是，Delphi是完全面向对象的编程语言，所以我们不要浪费，这个Dll打算用类的方式完成。于是，在新建的DLL工程中在添加一个Unit Pas，命名为unitHook， 用来写拦截类的处理。unitHook.pas中的代码如下：</p><pre><a><font color="#0000d0">unit</font></a> unitHook;<a><font color="#0000d0">interface</font></a><a><font color="#0000d0">uses</font></a>&nbsp;&nbsp;Windows, Messages, Classes, SysUtils;<a><font color="#0000d0">type</font></a>&nbsp;&nbsp;<a><font color="#008000">//NtHook类相关类型</font></a>&nbsp;&nbsp;TNtJmpCode=packed record&nbsp;&nbsp;<a><font color="#008000">//8字节</font></a>&nbsp;&nbsp;&nbsp;&nbsp;MovEax:<a><font color="#0000d0">Byte</font></a>;&nbsp;&nbsp;&nbsp;&nbsp;Addr:<a><font color="#0000d0">DWORD</font></a>;&nbsp;&nbsp;&nbsp;&nbsp;JmpCode:<a><font color="#0000d0">Word</font></a>;&nbsp;&nbsp;&nbsp;&nbsp;dwReserved:<a><font color="#0000d0">Byte</font></a>;&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;&nbsp;&nbsp;TNtHookClass=<a><font color="#0000d0">class</font></a>(TObject)&nbsp;&nbsp;<a><font color="#0000d0">private</font></a>&nbsp;&nbsp;&nbsp;&nbsp;hProcess:THandle;&nbsp;&nbsp;&nbsp;&nbsp;NewAddr:TNtJmpCode;&nbsp;&nbsp;&nbsp;&nbsp;OldAddr:<a><font color="#0000d0">array</font></a>[0..7] <a><font color="#0000d0">of</font></a> <a><font color="#0000d0">Byte</font></a>;&nbsp;&nbsp;&nbsp;&nbsp;ReadOK:<a><font color="#0000d0">Boolean</font></a>;&nbsp;&nbsp;<a><font color="#0000d0">public</font></a>&nbsp;&nbsp;&nbsp;&nbsp;BaseAddr:Pointer;&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">constructor</font></a> <a><font color="#b000b0">Create</font></a>(DllName,FuncName:<a><font color="#0000d0">string</font></a>;NewFunc:Pointer);&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">destructor</font></a> Destroy; <a><font color="#0000d0">override</font></a>;&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> Hook;&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> UnHook;&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">implementation</font></a><a><font color="#008000">//==================================================</font></a><a><font color="#008000">//NtHOOK 类开始</font></a><a><font color="#008000">//==================================================</font></a><a><font color="#0000d0">constructor</font></a> TNtHookClass.<a><font color="#b000b0">Create</font></a>(DllName: <a><font color="#0000d0">string</font></a>; FuncName: <a><font color="#0000d0">string</font></a>;NewFunc:Pointer);<a><font color="#0000d0">var</font></a>&nbsp;&nbsp;DllModule:<a><font color="#0000d0">HMODULE</font></a>;&nbsp;&nbsp;dwReserved:<a><font color="#0000d0">DWORD</font></a>;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#008000">//获取模块句柄</font></a>&nbsp;&nbsp;DllModule:=<a><strong><font color="#000080">GetModuleHandle</font></strong></a>(<a><font color="#0000d0">PChar</font></a>(DllName));&nbsp;&nbsp;<a><font color="#008000">//如果得不到说明未被加载</font></a>&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> DllModule=0 <a><font color="#0000d0">then</font></a> DllModule:=<a><strong><font color="#000080">LoadLibrary</font></strong></a>(<a><font color="#0000d0">PChar</font></a>(DllName));&nbsp;&nbsp;<a><font color="#008000">//得到模块入口地址（基址）</font></a>&nbsp;&nbsp;BaseAddr:=Pointer(<a><strong><font color="#000080">GetProcAddress</font></strong></a>(DllModule,<a><font color="#0000d0">PChar</font></a>(FuncName)));&nbsp;&nbsp;<a><font color="#008000">//获取当前进程句柄</font></a>&nbsp;&nbsp;hProcess:=<a><strong><font color="#000080">GetCurrentProcess</font></strong></a>;&nbsp;&nbsp;<a><font color="#008000">//指向新地址的指针</font></a>&nbsp;&nbsp;NewAddr.MovEax:=$B8;&nbsp;&nbsp;NewAddr.Addr:=<a><font color="#0000d0">DWORD</font></a>(NewFunc);&nbsp;&nbsp;NewAddr.JmpCode:=$E0FF;&nbsp;&nbsp;<a><font color="#008000">//保存原始地址</font></a>&nbsp;&nbsp;ReadOK:=<a><strong><font color="#000080">ReadProcessMemory</font></strong></a>(hProcess,BaseAddr,@OldAddr,8,dwReserved);&nbsp;&nbsp;<a><font color="#008000">//开始拦截</font></a>&nbsp;&nbsp;Hook;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//释放对象</font></a><a><font color="#0000d0">destructor</font></a> TNtHookClass.Destroy;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;UnHook;&nbsp;&nbsp;<a><strong><font color="#000080">CloseHandle</font></strong></a>(hProcess);&nbsp;&nbsp;<a><font color="#0000d0">inherited</font></a>;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//开始拦截</font></a><a><font color="#0000d0">procedure</font></a> TNtHookClass.Hook;<a><font color="#0000d0">var</font></a>&nbsp;&nbsp;dwReserved:<a><font color="#0000d0">DWORD</font></a>;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> (ReadOK=<a><font color="#0000d0">False</font></a>) <a><font color="#0000d0">then</font></a> Exit;&nbsp;&nbsp;<a><font color="#008000">//写入新的地址</font></a>&nbsp;&nbsp;<a><strong><font color="#000080">WriteProcessMemory</font></strong></a>(hProcess,BaseAddr,@NewAddr,8,dwReserved);<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//恢复拦截</font></a><a><font color="#0000d0">procedure</font></a> TNtHookClass.UnHook;<a><font color="#0000d0">var</font></a>&nbsp;&nbsp;dwReserved:<a><font color="#0000d0">DWORD</font></a>;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> (ReadOK=<a><font color="#0000d0">False</font></a>) <a><font color="#0000d0">then</font></a> Exit;&nbsp;&nbsp;<a><font color="#008000">//恢复地址</font></a>&nbsp;&nbsp;<a><strong><font color="#000080">WriteProcessMemory</font></strong></a>(hProcess,BaseAddr,@OldAddr,8,dwReserved);<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">end</font></a>.</pre><pre><br />至此，unitHook.pas的代码OK了，其中加了详细的注释，在此就不再多做解释。现在切换到Dll的代码页，写入以下代码：</pre><pre> </pre><pre><pre>library hookdll;<a><font color="#0000d0">uses</font></a>&nbsp;&nbsp;SysUtils, Windows,&nbsp;&nbsp;Classes,&nbsp;&nbsp;unitHook <a><font color="#0000d0">in</font></a> <a><font color="#808080">'unitHook.pas'</font></a>;<a><font color="#ff0000">&#123;$R *.res&#125;</font></a><a><font color="#0000d0">const</font></a>&nbsp;&nbsp;HOOK_MEM_FILENAME&nbsp;&nbsp;=&nbsp;&nbsp;<a><font color="#808080">'tmp.hkt'</font></a>;<a><font color="#0000d0">var</font></a>&nbsp;&nbsp;hhk: HHOOK;&nbsp;&nbsp;Hook: <a><font color="#0000d0">array</font></a>[0..3] <a><font color="#0000d0">of</font></a> TNtHookClass;&nbsp;&nbsp;<a><font color="#008000">//内存映射</font></a>&nbsp;&nbsp;MemFile: THandle;&nbsp;&nbsp;startPid: PDWORD;&nbsp;&nbsp; <a><font color="#008000">//保存PID</font></a><a><font color="#008000">&#123;--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--&#125;</font></a><a><font color="#008000">//拦截 MessageBoxA</font></a><a><font color="#0000d0">function</font></a> NewMessageBoxA(_hWnd: <a><font color="#0000d0">HWND</font></a>; lpText, lpCaption: PAnsiChar; uType: UINT): <a><font color="#0000d0">Integer</font></a>; stdcall;<a><font color="#0000d0">type</font></a>&nbsp;&nbsp;TNewMessageBoxA = <a><font color="#0000d0">function</font></a> (_hWnd: <a><font color="#0000d0">HWND</font></a>; lpText, lpCaption: PAnsiChar; uType: UINT): <a><font color="#0000d0">Integer</font></a>; stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;lpText := PAnsiChar(<a><font color="#808080">'已经被拦截 MessageBoxA'</font></a>);&nbsp;&nbsp;Hook[0].UnHook;&nbsp;&nbsp;<a><font color="#0000d0">Result</font></a> := TNewMessageBoxA(Hook[0].BaseAddr)(_hWnd, lpText, lpCaption, uType);&nbsp;&nbsp;Hook[0].Hook;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//拦截 MessageBoxW</font></a><a><font color="#0000d0">function</font></a> NewMessageBoxW(_hWnd: <a><font color="#0000d0">HWND</font></a>; lpText, lpCaption: PWideChar; uType: UINT): <a><font color="#0000d0">Integer</font></a>; stdcall;<a><font color="#0000d0">type</font></a>&nbsp;&nbsp;TNewMessageBoxW = <a><font color="#0000d0">function</font></a> (_hWnd: <a><font color="#0000d0">HWND</font></a>; lpText, lpCaption: PWideChar; uType: UINT): <a><font color="#0000d0">Integer</font></a>; stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;lpText := <a><font color="#808080">'已经被拦截 MessageBoxW'</font></a>;&nbsp;&nbsp;Hook[2].UnHook;&nbsp;&nbsp;<a><font color="#0000d0">Result</font></a> := TNewMessageBoxW(Hook[2].BaseAddr)(_hWnd, lpText, lpCaption, uType);&nbsp;&nbsp;Hook[2].Hook;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//拦截 MessageBeep</font></a><a><font color="#0000d0">function</font></a> NewMessageBeep(uType: UINT): BOOL; stdcall;<a><font color="#0000d0">type</font></a>&nbsp;&nbsp;TNewMessageBeep = <a><font color="#0000d0">function</font></a> (uType: UINT): BOOL; stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">Result</font></a> := <a><font color="#0000d0">True</font></a>;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//拦截 OpenProcess , 防止关闭</font></a><a><font color="#0000d0">function</font></a> NewOpenProcess(dwDesiredAccess: <a><font color="#0000d0">DWORD</font></a>; bInheritHandle: BOOL; dwProcessId: <a><font color="#0000d0">DWORD</font></a>): THandle; stdcall;<a><font color="#0000d0">type</font></a>&nbsp;&nbsp;TNewOpenProcess = <a><font color="#0000d0">function</font></a> (dwDesiredAccess: <a><font color="#0000d0">DWORD</font></a>; bInheritHandle: BOOL; dwProcessId: <a><font color="#0000d0">DWORD</font></a>): THandle; stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> startPid^ = dwProcessId <a><font color="#0000d0">then</font></a> <a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">result</font></a> := 0;&nbsp;&nbsp;&nbsp;&nbsp;Exit;&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;&nbsp;&nbsp;Hook[3].UnHook;&nbsp;&nbsp;<a><font color="#0000d0">Result</font></a> := TNewOpenProcess(Hook[3].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId);&nbsp;&nbsp;Hook[3].Hook;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">&#123;--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--&#125;</font></a><a><font color="#008000">//安装API Hook</font></a><a><font color="#0000d0">procedure</font></a> InitHook;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;Hook[0] := TNtHookClass.<a><font color="#b000b0">Create</font></a>(<a><font color="#808080">'user32.dll'</font></a>, <a><font color="#808080">'MessageBoxA'</font></a>, @NewMessageBoxA);&nbsp;&nbsp;Hook[1] := TNtHookClass.<a><font color="#b000b0">Create</font></a>(<a><font color="#808080">'user32.dll'</font></a>, <a><font color="#808080">'MessageBeep'</font></a>, @NewMessageBeep);&nbsp;&nbsp;Hook[2] := TNtHookClass.<a><font color="#b000b0">Create</font></a>(<a><font color="#808080">'user32.dll'</font></a>, <a><font color="#808080">'MessageBoxW'</font></a>, @NewMessageBoxW);&nbsp;&nbsp;Hook[3] := TNtHookClass.<a><font color="#b000b0">Create</font></a>(<a><font color="#808080">'kernel32.dll'</font></a>, <a><font color="#808080">'OpenProcess'</font></a>, @NewOpenProcess);<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//删除API Hook</font></a><a><font color="#0000d0">procedure</font></a> UninitHook;<a><font color="#0000d0">var</font></a>&nbsp;&nbsp;I: <a><font color="#0000d0">Integer</font></a>;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">for</font></a> I := 0 <a><font color="#0000d0">to</font></a> High(Hook) <a><font color="#0000d0">do</font></a>&nbsp;&nbsp;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(Hook[I]);&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">end</font></a>;<a><font color="#008000">&#123;--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--&#125;</font></a><a><font color="#008000">//内存映射共想</font></a><a><font color="#0000d0">procedure</font></a> MemShared();<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;MemFile:=<a><strong><font color="#000080">OpenFileMapping</font></strong></a>(FILE_MAP_ALL_ACCESS,<a><font color="#0000d0">False</font></a>, HOOK_MEM_FILENAME);&nbsp;&nbsp; <a><font color="#008000">//打开内存映射文件</font></a>&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> MemFile = 0 <a><font color="#0000d0">then</font></a> <a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#008000">//打开失败则衉c2建内存映射文件</font></a>&nbsp;&nbsp;&nbsp;&nbsp;MemFile := <a><strong><font color="#000080">CreateFileMapping</font></strong></a>($FFFFFFFF, <a><font color="#0000d0">nil</font></a>, PAGE_READWRITE, 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4, HOOK_MEM_FILENAME);&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> MemFile &lt;&gt; 0 <a><font color="#0000d0">then</font></a>&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#008000">//映射文件到变量</font></a>&nbsp;&nbsp;&nbsp;&nbsp;startPid := <a><strong><font color="#000080">MapViewOfFile</font></strong></a>(MemFile,FILE_MAP_ALL_ACCESS,0,0,0);<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//传递消息</font></a><a><font color="#0000d0">function</font></a> HookProc(nCode, wParam, lParam: <a><font color="#0000d0">Integer</font></a>): <a><font color="#0000d0">Integer</font></a>; stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">Result</font></a> := <a><strong><font color="#000080">CallNextHookEx</font></strong></a>(hhk, nCode, wParam, lParam);<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//开始HOOK</font></a><a><font color="#0000d0">procedure</font></a> StartHook(pid: <a><font color="#0000d0">DWORD</font></a>); stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;startPid^ := pid;&nbsp;&nbsp;hhk := <a><strong><font color="#000080">SetWindowsHookEx</font></strong></a>(WH_CALLWNDPROC, HookProc, <a><font color="#0000d0">hInstance</font></a>, 0);<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//结束HOOK</font></a><a><font color="#0000d0">procedure</font></a> EndHook; stdcall;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">if</font></a> hhk &lt;&gt; 0 <a><font color="#0000d0">then</font></a>&nbsp;&nbsp;&nbsp;&nbsp;<a><strong><font color="#000080">UnhookWindowsHookEx</font></strong></a>(hhk);<a><font color="#0000d0">end</font></a>;<a><font color="#008000">//环境处理</font></a><a><font color="#0000d0">procedure</font></a> DllEntry(dwResaon: <a><font color="#0000d0">DWORD</font></a>);<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">case</font></a> dwResaon <a><font color="#0000d0">of</font></a>&nbsp;&nbsp;&nbsp;&nbsp;DLL_PROCESS_ATTACH: InitHook;&nbsp;&nbsp; <a><font color="#008000">//DLL载入</font></a>&nbsp;&nbsp;&nbsp;&nbsp;DLL_PROCESS_DETACH: UninitHook; <a><font color="#008000">//DLL删除</font></a>&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">end</font></a>;exports&nbsp;&nbsp;StartHook, EndHook;<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;MemShared;&nbsp;&nbsp;<a><font color="#008000">&#123; 分配DLL程序到 DllProc 变量 &#125;</font></a>&nbsp;&nbsp;DllProc := @DllEntry;&nbsp;&nbsp;<a><font color="#008000">&#123; 调用DLL加载处理 &#125;</font></a>&nbsp;&nbsp;DllEntry(DLL_PROCESS_ATTACH);<a><font color="#0000d0">end</font></a>.</pre><br />&nbsp;&nbsp;&nbsp;&nbsp; 这样，我们用来hook API 的 Dll 就完工了。 在Dll中，我们还使用到了内存映射，用来实现在拦截全局时的内存共享，如这个例子中需要保存调用此hook的进程句柄，以防止通过任务管理器关闭示例程序。<br /><br />&nbsp;&nbsp; 编译生成 hookdll.dll 文件，就可以使用了。现在我们再来建立一个测试用的程序。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 如附图所示，画3个按钮，分别为&quot;Hook&quot;、&quot;UnHook&quot;、&quot;MessageBox&quot;，前两个用来安装和删除钩子，第三个用来显示一个消息框，你将会看到被Hook后的情况。测试工程的代码如下：</pre><pre><img class="blogimg" border="0" src="http://hiphotos.baidu.com/yangyxd/pic/item/8ced97c89c88e3367f3e6f32.jpg" small="0" alt="" /></pre><pre><pre><a><font color="#0000d0">unit</font></a> FMain;<a><font color="#0000d0">interface</font></a><a><font color="#0000d0">uses</font></a>&nbsp;&nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&nbsp;&nbsp;Dialogs, StdCtrls;<a><font color="#0000d0">type</font></a>&nbsp;&nbsp;TfrmMain = <a><font color="#0000d0">class</font></a>(TForm)&nbsp;&nbsp;&nbsp;&nbsp;btnHook: TButton;&nbsp;&nbsp;&nbsp;&nbsp;btnUnhook: TButton;&nbsp;&nbsp;&nbsp;&nbsp;Button1: TButton;&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> btnHookClick(<a><font color="#0000d0">Sender</font></a>: TObject);&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> btnUnhookClick(<a><font color="#0000d0">Sender</font></a>: TObject);&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> Button1Click(<a><font color="#0000d0">Sender</font></a>: TObject);&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> FormCreate(<a><font color="#0000d0">Sender</font></a>: TObject);&nbsp;&nbsp;<a><font color="#0000d0">private</font></a>&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#008000">&#123; Private declarations &#125;</font></a>&nbsp;&nbsp;<a><font color="#0000d0">public</font></a>&nbsp;&nbsp;&nbsp;&nbsp;<a><font color="#008000">&#123; Public declarations &#125;</font></a>&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">var</font></a>&nbsp;&nbsp;frmMain: TfrmMain;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> StartHook(pid: <a><font color="#0000d0">DWORD</font></a>); stdcall; external <a><font color="#808080">'hookdll.dll'</font></a>;&nbsp;&nbsp;<a><font color="#0000d0">procedure</font></a> EndHook; stdcall; external <a><font color="#808080">'hookdll.dll'</font></a>;<a><font color="#0000d0">implementation</font></a><a><font color="#ff0000">&#123;$R *.dfm&#125;</font></a><a><font color="#0000d0">procedure</font></a> TfrmMain.btnHookClick(<a><font color="#0000d0">Sender</font></a>: TObject);<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;StartHook(<a><strong><font color="#000080">GetCurrentProcessId</font></strong></a>);<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">procedure</font></a> TfrmMain.btnUnhookClick(<a><font color="#0000d0">Sender</font></a>: TObject);<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;EndHook;<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">procedure</font></a> TfrmMain.Button1Click(<a><font color="#0000d0">Sender</font></a>: TObject);<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><strong><font color="#000080">MessageBox</font></strong></a>(0, <a><font color="#808080">'abdfadfasdf'</font></a>, <a><font color="#0000d0">nil</font></a>, 0);<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">procedure</font></a> TfrmMain.FormCreate(<a><font color="#0000d0">Sender</font></a>: TObject);<a><font color="#0000d0">begin</font></a><a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">end</font></a>.</pre><pre> </pre><pre>&nbsp;&nbsp;&nbsp;&nbsp;完成后运行，先不点击&quot;hook&quot;按钮，直接点击MessageBox，你会发现现在已经被拦截了。为什么我们还没有安装钩子就被拦截了呢？程序出错了吗？呵呵。当然没有出错。反过来看看DLL中的一处代码：</pre><pre><pre>.............<a><font color="#008000">//环境处理</font></a><a><font color="#0000d0">procedure</font></a> DllEntry(dwResaon: <a><font color="#0000d0">DWORD</font></a>);<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;<a><font color="#0000d0">case</font></a> dwResaon <a><font color="#0000d0">of</font></a>&nbsp;&nbsp;&nbsp;&nbsp;DLL_PROCESS_ATTACH: InitHook;&nbsp;&nbsp; <a><font color="#008000">//DLL载入</font></a>&nbsp;&nbsp;&nbsp;&nbsp;DLL_PROCESS_DETACH: UninitHook; <a><font color="#008000">//DLL删除</font></a>&nbsp;&nbsp;<a><font color="#0000d0">end</font></a>;<a><font color="#0000d0">end</font></a>;............<a><font color="#0000d0">begin</font></a>&nbsp;&nbsp;MemShared;&nbsp;&nbsp;<a><font color="#008000">&#123; 分配DLL程序到 DllProc 变量 &#125;</font></a>&nbsp;&nbsp;DllProc := @DllEntry;&nbsp;&nbsp;<a><font color="#008000">&#123; 调用DLL加载处理 &#125;</font></a>&nbsp;&nbsp;DllEntry(DLL_PROCESS_ATTACH);<a><font color="#0000d0">end</font></a>.</pre><pre> </pre><pre>&nbsp;&nbsp; 可以看到，在DLL装入内存的时候其实就已经调用了InitHook，将要拦截的API拦截了。这时候看看任务管理器能不能关闭我们的程序，试一下就知道还可以，因为我们还没有调用StartHook来传入我们程序的PID，所以还可以被关闭。<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; 到此这篇文章就结束了， 本人从小语文没及过格（^_^），文章写的不太好，不过源代码都贴上了，有详细的注释，相信大家也能看明白。如果你发现有什么错误的地方，要记得告诉我哦！<br /><br />&nbsp;&nbsp; 最后感谢 cxwr（菜新）大大的支持，能完成这篇文章少不了他的功劳。</pre></pre></pre>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/137/</link>
<title><![CDATA[极点一键备份还原]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Sat, 26 Mar 2011 04:26:12 +0000</pubDate> 
<guid>http://www.t522.com/post/137/</guid> 
<description>
<![CDATA[ 
	<p>功能介绍</p><div class="con"><div class="func-li"><h4>傻瓜式操作 一键轻松备份还原</h4>程序为向导式安装，一键即可实现自动备份或还原系统。操作过程全程自动完成，即使是电脑新手，都能快速掌握使用。当您的系统操作变慢、中木马病毒、或是灾难性崩溃等任何情况，极点一键还原都可以使您的系统轻松快速的还原到健康状态。安全高效 稳定可靠 全面兼容WINDOWS系统</div></div><div class="con"><div class="func-li"><p>本程序基于Ghost(v11.02)内核，具有良好的安全和稳定性，真正达到快速备份还原；全面支持和兼容32位和64位的Windows等主流操作系统平台，支持最新的Windows7操作系统，Vista、XP、2000、2003等更不在话下；备份文件在隐藏目录，大大降低被误删除或被破坏的可能性，使您无后顾之忧，且支持.ISO文件的还原。</p><h3>软件纯绿色 不读写注册表 不流氓</h3><p>本程序不写注册表，不会产生任何垃圾，不会修改主页，不会无法卸载，经过37款杀软件的检测让您用得放心。</p><p>&nbsp;</p><h3>软件流程</h3><p>还原操作：运行软件后软件首先会检测当前目录下的所有GHO文件,如果有的话会存入还原路径，如有没有GHO文件，会查找所有硬盘下JDGHOST~...文件夹下的 JDGHOST.JD文件（本程序产生的备份文件，改名为.JD是防患病毒破坏)。</p><p>备份操作：枚举大于3G的硬盘空间，如果存在，产生一个JDGHOST~...的隐藏目录以便备份系统。</p><p>特殊：把文件重命名如：test(XX专版),程序运行后会在标题栏显示括号内文字，如极点一键还原 - XX专版，或带参数运行，建立一个批处理(.bat),</p><p>编辑：(start 本程序文件名 参数) 标题栏也会显示该参数。</p><p><img alt="" src="/attachment/image/jdkeyghost.bmp" /></p></div></div><p><a href="attachment/file/jdghost.rar">下载地址</a> 请使用迅雷下载</p><p>115网盘下载:<a target="_blank" href="http://u.115.com/file/f28c0e41e0">http://u.115.com/file/f28c0e41e0</a></p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/136/</link>
<title><![CDATA[Delphi实现HTML界面]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Mon, 21 Mar 2011 08:18:36 +0000</pubDate> 
<guid>http://www.t522.com/post/136/</guid> 
<description>
<![CDATA[ 
	<p>Delphi实现HTMLWebBrowser实现HTML界面 <br />HTML的界面有以下特点：图文混排，格式灵活，可以包含Flash、声音和视频等，实现图文声像的多媒体界面，而且易于建立和维护。另外，HTML的显示环境一般机器上都具备，通常不需要安装额外的软件。当然，HTML界面也有它欠缺的方面，即：界面控制能力有限，代码调试不便----虽然DHTML提供了比较强的编程特性，但是比起Delphi的传统的开发语言和工具来，对界面的控制能力，尤其是和数据交互时的控制能力还是稍逊一筹。 <br />了解了这些特点，我们就可以在实际应用开发中，适时地选择HTML技术。下面举个例子： <br />一种仪器的管理程序，需要显示该仪器的操作方法文档，包含文字和图片，并要求可以隐藏或显示文档，并能安要求打印。 <br />这个应用中，图文显示、隐藏/显示部分文档、图文打印等需求，都是HTML界面所擅长的，用传统的表单控件实现几乎无法想像。 <br />　 <br />用什么实现HTML的界面 <br />用Delphi实现HTML界面的应用主要有两种选择：WebBrowser Control或MSHTML。为了弄清两者如何选择，我们先来看看Internet Exporer 4.0及其后续版本的体系结构： <br /><a href="http://msdn.microsoft.com/workshop/graphics/IE4Arch.gif" target="_blank" link="http://msdn.microsoft.com/workshop/graphics/IE4Arch.gif">http://msdn.microsoft.com/workshop/graphics/IE4Arch.gif</a><wbr></wbr>&quot; width=305 border=0&gt; <br />IE浏览器是建立在SHDOCVW.DLL组件之上的，而SHDOCVW.DLL则建立在MSHTML.DLL组件之上，底层则包括脚本引擎等。SHDOCVW.DLL提供了对活动文档(Active Document)的支持----例如Word等文档可以在IE中显示，并提供导航、in-place*连接、收藏夹、浏览历史和分级内容选择(PICS: Platform for Internet Content Selection)等功能。SHDOCVW.DLL组件虽然也提供了很多接口可以单独使用，但是通常所指的SHDOCVW.DLL就是WebBrowser Control。MSHTML.DLL是实行HTML解析和表现的组件。它通过DHTML对象模型提供对HTML文档的访问。它实现了活动文档服务器接口，可以通过COM接口调用。 <br />不难看出，WebBrowser在比较高的层次上，提供了更为丰富的功能，因此一般通常编程都采用WebBrower控件。MSHTML只有在需要解析HTML这样的特殊应用中，才推荐使用。微软的MSDN网站上提供了一个使用MSHTML的例子：WalkAll'&gt;http://msdn.microsoft.com/downloads/samples/internet/browser/walkall/default.asp&quot;&gt;WalkAll Sample Source Page。 <br />（*注：In-place链接，是指点击HTML连接时，在相同的WebBrowser实例中显示连接的HTML文档。如果仅使用MSHTML.DLL，点击链接将导致在新的浏览器实例中打开链接的文档。） <br />　 <br />如何访问HTML页面的内容 <br />首先，在Delphi 7.0组件面板的Internet页上，把TWebBrowser组件放到表单上。 <br />通过执行以下语句装载HTML文档到WebBrowser中进行显示： <br />WebBrowser1.Navigate(GetCurrentDir + '&#92;index.htm'); <br />隐藏/显示HTML元件代码示例： <br />var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc : IHTMLDocument2; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element: IHTMLElement; <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc := IHTMLDocument2(WebBrowser1.Document); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if nil &lt;&gt; Doc then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element := Doc.all.item('T1', 0) as IHTMLElement; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if nil &lt;&gt; element then begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if '' = element.style.display then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.display := 'none' <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.display := ''; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />设置/取值代码示例： <br />var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc : IHTMLDocument2; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputText : IHTMLInputTextElement; <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc := IHTMLDocument2(WebBrowser1.Document); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if nil &lt;&gt; Doc then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果T1不是IHTMLInputTextElement类型将出错 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputText := Doc.all.item('T1', 0) as IHTMLInputTextElement; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputText.value := Edit1.Text; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Edit2.Text := inputText.value; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />提示：关于哪些HTML元件（标记）应该采用什么MSHTML接口进行访问，请参考MSDN Library中的Web Development &gt; Programming and Reusing the Browser &gt; MSHTML Reference &gt; Interfaces and Scripting Objects。 <br />　 <br />如何调用JavaScript函数（兼谈消息提示框） <br />知道了访问HTML内容的方法，就可以通过间接方式调用HTML页面上包含的JavaScript代码。具体实现方式是：在HTML中插入&lt;span&gt;&lt;/span&gt;等不可见元件，利用它的click事件调用响应的JavaScript函数，然后再Delphi中调用该元件的click过程。 <br />下面我们就用Delphi调用JavaScript的alert函数来实现消息提示框。首先在HTML中加入： <br />&lt;span id=&quot;ShowMessage&quot; style=&quot;display:none&quot; onclick=&quot;alert(this.innerText);&quot;&gt;&lt;/span&gt; <br />Delphi中的调用代码如下： <br />procedure TForm1.Alert(const Msg : string); <br />&nbsp;&nbsp;&nbsp;&nbsp; var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc : IHTMLDocument2; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element : IHTMLElement; <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc := IHTMLDocument2(WebBrowser1.Document); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Assert(nil &lt;&gt; Doc);//一定要先加载HTML <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element := Doc.all.item('ShowMessage', 0) as IHTMLElement; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if nil &lt;&gt; Element then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element.innerText := Msg; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element.click; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />我发现在Delphi中用Browser显示HTML，如果你的表单是作为EXE运行，然后嵌入到了别的表单的组件上显示的，例如，Form1.Parent := Form2.Panel1，即Form1显示在Form2中Panel1所占据的位置，当你用ShowMessage显示提示信息时，HTML的内容依然可以被操作，这显然不太好。使用JavaScript中的alert函数则可避免这种现象。 <br />　 <br />如何禁止右键菜单（如何禁止用户查看源代码） <br />默认情况下，在显示HTML的WebBrowser上点击鼠标右键，会显示一个弹出菜单，和IE中看到的一样。通过这个菜单用户可以查看HTML的源代码。因此有时候我们需要屏蔽该菜单。和该菜单相关的接口是IEDocHostUIHandler。已经用人对它进行了封装，详见ieConst.pas'&gt;http://members.shaw.ca/iedelphi/downloads/source/ieConst.pas&quot;&gt;ieConst.pas 和 IEDocHostUIHandler.pas'&gt;http://members.shaw.ca/iedelphi/downloads/source/IEDocHostUIHandler.pas&quot;&gt;IEDocHostUIHandler.pas。使用方法如下： <br />var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form1: TForm1; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FDocHostUIHandler: TDocHostUIHandler; <br />&nbsp;&nbsp;&nbsp;&nbsp; ... <br />&nbsp;&nbsp;&nbsp;&nbsp; implementation <br />&nbsp;&nbsp;&nbsp;&nbsp; ... <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.FormCreate(Sender: TObject); <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FDocHostUIHandler := TDocHostUIHandler.Create; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FDocHostUIHandler.Free; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDisp: IDispatch; var URL: OleVariant); <br />&nbsp;&nbsp;&nbsp;&nbsp; var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr: HResult; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustDoc: ICustomDoc; <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr := WebBrowser1.Document.QueryInterface(ICustomDoc, CustDoc); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if hr = S_OK then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustDoc.SetUIHandler(FDocHostUIHandler); <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />有时你可能还需要定制自己的右键菜单，这是还是要借助于IEDocHostUIHandler，具体实现方法可以看看MSDN Library。 <br />　 <br />如何响应HTML的事件（如何在HTML中调用Delphi的代码） <br />HTML事件的响应方式有两种：一种是JavaScript，一种是在Delphi中响应。一些简单的功能可以在JavaScript中实现，这样易于修改。但是从功能、安全性等方面考虑，通常还是要在Delphi中实现。例如当用户点击HTML上的一个按钮时，需要访问数据库，这是就得用Delphi了。 <br />在Delphi中响应HTML事件，实际上就是响应ActiveX事件的问题，这通过事件槽(Event Sink)来实现，有些繁琐。还好前人已经为我们作了很多工作。利用Experts Exchange网站的Cynna封装的TDHTMLEvent类（该源码请看本文的附件），实现就简单多了。实现代码如下： <br />var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Form1: TForm1; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EventSink: TDHTMLEvent; <br />&nbsp;&nbsp;&nbsp;&nbsp; ... <br />&nbsp;&nbsp;&nbsp;&nbsp; implementation <br />&nbsp;&nbsp;&nbsp;&nbsp; ... <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.FormCreate(Sender: TObject); <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EventSink:= TDHTMLEvent.Create; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EventSink.Free; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.DemoEventSink(Sender: TObject); <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage('成功从HTML中调用Delphi的过程。'); <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const pDisp: IDispatch; var URL: OleVariant); <br />&nbsp;&nbsp;&nbsp;&nbsp; var <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc : IHTMLDocument2; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element : IHTMLElement; <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc := IHTMLDocument2(WebBrowser1.Document); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if nil &lt;&gt; Doc then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //找到HTML元件 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element := Doc.all.item('B3', 0) as IHTMLElement; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使HTML元件的click事件和DemoEventSink过程关连 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element.onclick := EventSink.HookEventHandler(DemoEventSink); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />点击HTML页面中ID为'B3'的按钮，就会调用DemoEventSink过程。 <br />　 <br />如何能在HTML控件上输入回车 <br />含有多行文本输入框(textarea )或提交(submit)按钮的HTML表单在TWebBrowser中显示时，对回车键不响应。另外，Delphi表单上按钮的快捷字母键也无法在HTML表单上输入，因为一输入就触发相应按钮的单击事件。解决代码如下： <br /><br />unit Unit1; <br />interface <br />uses <br />&nbsp;&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, <br />&nbsp;&nbsp; Dialogs, OleCtrls, SHDocVw_TLB, ActiveX, StdCtrls; <br />type <br />&nbsp;&nbsp; TForm1 = class(TForm) <br />&nbsp;&nbsp;&nbsp;&nbsp; WebBrowser1: TWebBrowser; <br />&nbsp;&nbsp;&nbsp;&nbsp; Button1: TButton; <br />&nbsp;&nbsp;&nbsp;&nbsp; Button2: TButton; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure FormDestroy(Sender: TObject); <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure FormCreate(Sender: TObject); <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure Button1Click(Sender: TObject); <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure Button2Click(Sender: TObject); <br />&nbsp;&nbsp; private <br />&nbsp;&nbsp;&nbsp;&nbsp; &#123; Private declarations &#125; <br />&nbsp;&nbsp;&nbsp;&nbsp; FOleInPlaceActiveObject: IOleInPlaceActiveObject; <br />&nbsp;&nbsp;&nbsp;&nbsp; procedure MsgHandler(var Msg: TMsg; var Handled: Boolean); <br />&nbsp;&nbsp; public <br />&nbsp;&nbsp;&nbsp;&nbsp; &#123; Public declarations &#125; <br />&nbsp;&nbsp; end; <br />var <br />&nbsp;&nbsp; Form1: TForm1; <br /><br />implementation <br />&#123;$R *.dfm&#125; <br />procedure TForm1.FormDestroy(Sender: TObject); <br />begin <br />&nbsp;&nbsp; FOleInPlaceActiveObject := nil; <br />end; <br />procedure TForm1.FormCreate(Sender: TObject); <br />begin <br />&nbsp;&nbsp; Application.OnMessage := MsgHandler; <br />end; <br />procedure TForm1.MsgHandler(var Msg: TMsg; var Handled: Boolean); <br />const <br />&nbsp;&nbsp; DialogKeys: set of Byte = [VK_LEFT, VK_RIGHT, VK_BACK, VK_UP, VK_DOWN, <br />&nbsp;&nbsp;&nbsp;&nbsp; $30..$39, $41..42, $44..$55, $57, $59..$5A]; <br />var <br />&nbsp;&nbsp; iOIPAO: IOleInPlaceActiveObject; <br />&nbsp;&nbsp; Dispatch: IDispatch; <br />begin <br />&nbsp;&nbsp; &#123; exit if we don't get back a webbrowser object &#125; <br />&nbsp;&nbsp; if (WebBrowser1 = nil) then <br />&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp; Handled := System.False; <br />&nbsp;&nbsp;&nbsp;&nbsp; Exit; <br />&nbsp;&nbsp; end; <br />&nbsp;&nbsp; Handled := (IsDialogMessage(WebBrowser1.Handle, Msg) = System.True); <br />&nbsp;&nbsp; if (Handled) and (not WebBrowser1.Busy) then <br />&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp; if FOleInPlaceActiveObject = nil then <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispatch := WebBrowser1.Application; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Dispatch &lt;&gt; nil then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispatch.QueryInterface(IOleInPlaceActiveObject, iOIPAO); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if iOIPAO &lt;&gt; nil then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOleInPlaceActiveObject := iOIPAO; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; if FOleInPlaceActiveObject &lt;&gt; nil then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Msg.wParam in DialogKeys) then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nothing - do not pass on the DialogKeys <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOleInPlaceActiveObject.TranslateAccelerator(Msg); <br />&nbsp;&nbsp; end; <br />end; <br />initialization <br />&nbsp;&nbsp; OleInitialize(nil); <br />finalization <br />&nbsp;&nbsp; OleUninitialize; <br />　 <br />本段代码出自SwissDelphiCenter.ch，作者未知。主要要引用ActiveX。Delphi 7中SHDocVw_TLB改为SHDocVw。 <br />　 <br />如何实现HTML的打印和预览 <br />HTML的打印和预览向来是个难题，但自从IE5.5推出后，情况大有改观。你可以利用其&ldquo;打印模板&rdquo;功能，实现自己的预览窗口和控制打印。&ldquo;打印模板&rdquo;的使用方法请参考MSDN Library中的Web Development &gt; Programming and Reusing the Browser &gt; Print Templates目录下的文章。从微软的网站上还可以下载到一个不错的例子，示例如何一步步由浅入深地使用Print Template (下载：<a href="http://download.microsoft.com/download/6/8/3/683DB9FE-8D61-4A3C-B7B8-3169FF70AE9F/printtemplates.exe" target="_blank" link="http://download.microsoft.com/download/6/8/3/683DB9FE-8D61-4A3C-B7B8-3169FF70AE9F/printtemplates.exe">http://download.microsoft.com/download/6/8/3/683DB9FE-8D61-4A3C-B7B8-3169FF70AE9F/printtemplates.exe</a><wbr></wbr>&quot;&gt;打印模板示例)。 <br />你会发现，要自己实现一个功能完善的打印模板也并非易事。IE浏览器本身带的打印模板做得还不错，能否在它的基础上加上自己的定制功能呢？答案是肯定的，至少从技术上看是这样（不考虑版权问题）。下面就介绍这偷懒的招。 <br />用Visual Studio打开x:&#92;Program Files&#92;Internet Explorer&#92;MUI&#92;0804&#92;SHDOCLC.DLL，会看到其资源目录。其中HTML/PREVIEW.DLG就是IE所带的打印模板了。把它export(导出)出来，把文件扩展名改成HTM，打开看看，是不是特刺激？PREVIEW.DLG用到了几个图片文件，在2110目录下，别忘了导出。（注：我的环境是Windows XP Professional英文版+SP1a，IE是6.0sp1。） <br />IE默认的模版中，页眉页脚均只支持纯文字。下面以定制HTML页眉为例，看看如何定制自己的打印模板。思路是：用自己的页眉内容换掉原有的内容，并修改其页眉高度和页边距使之和新的页眉相对应。 <br />第一步，定义页眉。在要使用此模版预览打印的HTML文件中加入一个id为Header的div标记，括起HTML页眉内容，并制定以英寸为单位的页眉的高度和宽度，其中宽度应该和模版相符。例： <br />&lt;div id=&quot;Header&quot; style=&quot;DISPLAY:none; WIDTH:6.5in; HEIGHT:0.78in&quot;&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...（HTML页眉内容） <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/div&gt; <br />第二步，声明变量。在模版前面变量声明部分加上两个变量声明： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var g_htmlHeader = &quot;&quot;;//用于保存页眉内容 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var g_nHeaerHeight = 0;//页眉的高度 <br />第三步，取得页眉。在函数OnLoadBody()中的&ldquo;Printer.footer = dialogArguments.__IE_FooterString&rdquo;语句之后加入这段代码： <br /><br />oPageHeader = dialogArguments.__IE_BrowseDocument.all.item(&quot;Header&quot;, 0); <br />if (null != oPageHeader) <br />&#123; <br />&nbsp;&nbsp;&nbsp;&nbsp; g_htmlHeader = oPageHeader.innerHTML; <br />&nbsp;&nbsp;&nbsp;&nbsp; g_nHeaerHeight = oPageHeader.style.posHeight; <br />&#125; <br /><br />第四步，指定页边距和页眉高度。在上面的代码下面紧接着加入： <br /><br />//指定页边距。其中40可以自己改，单位是百分之一英寸。 <br />Printer.marginTop = 40 + (g_nHeaerHeight * 100); <br />Printer.marginBottom = 40; <br />Printer.marginLeft = 40; <br />Printer.marginRight = 40; <br />在函数EnsureDocuments()中， <br />/*注释掉以下代码 <br />if (header) <br />&#123; <br />tmp = upTop + (27 / 100); <br />if (tmp &gt; top) <br />top = tmp; <br />&#125; <br />if (footer) <br />&#123; <br />tmp = upBottom + (27 / 100); <br />if (tmp &gt; bottom) <br />bottom = tmp; <br />&#125; <br />*/ <br />//紧接着加上： <br />tmp = upTop + g_nHeaerHeight; <br />if (tmp &gt; top) <br />top = tmp; <br />//下面隔几行，注释掉：oRule.style.top = upTop + &quot;in&quot;; <br />第五步，指定页眉内容。在函数CPrintDoc_AddPage()中，在&ldquo;HeadFoot.page = HeadFoot.pageTotal;&rdquo;语句之后加入： <br />//这两行用于设置页码，你在页眉可以通过加入&ldquo;[P]&rdquo;和&ldquo;[p]&rdquo;分别代表总页数和当前页数。 <br />g_htmlHeader = g_htmlHeader.replace(&quot;[P]&quot;, &quot;&lt;span class='hfPageTotal'&gt;&lt;/span&gt;&quot;); <br />var pageHeader = g_htmlHeader.replace(&quot;[p]&quot;, HeadFoot.pageTotal); <br />//下面隔3行，注释掉： <br />//~oPage.children(&quot;header&quot;).innerHTML = HeadFoot.HtmlHead; <br />//~oPage.children(&quot;footer&quot;).innerHTML = HeadFoot.HtmlFoot; <br />//下面隔几行，把&ldquo;newHTM += HeadFoot.HtmlHead;&rdquo;改为： <br />newHTM += pageHeader ; <br />//然后注释掉（不要页脚）：newHTM += HeadFoot.HtmlFoot; <br />至此，一个支持自定义HTML页眉的新模版就定制完成了。是不是觉得特爽？如果觉得它给你省下了两周的时间，就赶紧到&ldquo;希望之光&rdquo;网站上，花你2天的工资，资助一个小孩上学吧。 <br />定制好的打印模板怎么用呢？请看以下代码： <br /><br />var <br />&nbsp;&nbsp;&nbsp;&nbsp; vaIn, vaOut: OleVariant; <br />&nbsp;&nbsp;&nbsp;&nbsp; CmdTarget : IOleCommandTarget; <br />&nbsp;&nbsp;&nbsp;&nbsp; MyHandle : THandle; <br />begin <br />&nbsp;&nbsp;&nbsp;&nbsp; vaIn := 'c:&#92;&#92;Preview.htm'; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp; //预览方法1：WebBrowser1.ControlInterface.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut); <br />//下面是方法2： <br />&nbsp;&nbsp;&nbsp;&nbsp; if WebBrowser1.Document &lt;&gt; nil then <br />&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WebBrowser1.Document.QueryInterface(IOleCommandTarget, CmdTarget); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if CmdTarget &lt;&gt; nil then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CmdTarget.Exec( PGuid(nil), OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_PROMPTUSER, vaIn, vaOut); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CmdTarget._Release; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowMessage('IE不支持该功能，请升级至IE5.5以上。'); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />&nbsp;&nbsp;&nbsp;&nbsp; end; <br />end; <br />方法1简洁，但是如果WebBroswer不支持打印预览的话就会出错。第二种方法可能更好一些。 <br />在打印预览时，预览窗口的尺寸大小总是和WebBrowser所在的Form的一样，而且没法最大化。更麻烦的是，如果你的表单是嵌入到了别的表单的组件上显示的，例如，Form1.Parent := Form2.Panel1，即Form1显示在Form2中Panel1所占据的位置，那么预览窗口就变得很小了，不拉大根本没法看。解决办法如下，在预览的代码后面加上以下代码，使预览窗口最大化： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Handle:=FindWindow('Internet Explorer_TridentDlgFrame', '打印预览'); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 0 &lt;&gt; MyHandle then <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShowWindow(MyHandle , SW_MAXIMIZE); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end; <br />如果不预览而是直接打印，则把OLECMDID_PRINTPREVIEW换成OLECMDID_PRINT就可以了。 <br />如果要在Web应用中使用打印模板，可以通过ActiveX来实现调用。 <br />注：打印模板需要安装Internet Explorer 5.5以上版本，本文其它功能需要安装Internet Explorer4.0以上版本。 <br />　 <br />如何打包HTML和相关文件 <br />应用做好了，总不能把HTML文件和相关的图片文件等直接发布吧。这样既不安全，前面禁止用户查看源代码的努力也白费了。因此至少应该将这些文件打个包。一般来说，作为资源编译到exe或dll里就行了。我觉得编译到DLL中最为方便。在Visual Studio中，新建一个Win32工程，应用类型选择DLL。然后把HTML文件和相关的图片文件等资源加到工程中，然后编译即可。 <br />再添加HTML等资源时，我强烈推荐用手工加入的方法。原因有二：一，GIF等图片文件加入到工程中时，Studio可能会把文件内容自动改了，使得该文件不能正确显示；二，加入资源后会自动生成资源ID，需要把它改成你需要的名称（通常改成和文件名相同），当文件很多时，这项工作就很浪费时间，也很烦人。手工加入，即用文本编辑器把资源脚本文件（工程名.rc)打开，手工加入内容。我就不赘述了，格式例子如下： <br />About.htm&nbsp;&nbsp;&nbsp;&nbsp; HTML&nbsp;&nbsp;&nbsp;&nbsp; &quot;HTML&#92;&#92;About.htm&quot; <br />image016.gif&nbsp;&nbsp;&nbsp;&nbsp; IMAGES&nbsp;&nbsp;&nbsp;&nbsp; &quot;HTML&#92;&#92;images&#92;&#92;image016.gif&quot; <br />当加入很多文件时，如何节省时间呢？没有实践经验的人，是不可能想到这些问题的。别着急，按我说的做。 <br />首先，进入命令行(DOS)界面（Windows NT/2000/XP/2003下运行cmd.exe进入），进入你的HTML等资源文件所在的目录，执行&ldquo;dir &gt; temp.txt&rdquo;,把文件列表输出到temp.txt。 <br />接着，用文本编辑器把该文件打开，去掉头尾内容，仅留文件列表部分，例如： <br />2004-03-17 11:20 20,397 About.htm <br />2004-03-17 11:20 27,397 index.htm <br />然后，用Excel把修改后的文件打开。打开时，&ldquo;原始数据类型&rdquo;请选择&ldquo;固定宽度 - 每列字段加空格对齐&rdquo;。这样，日期、时间、文件大小、文件名就被分别放在了不同的列中。删除前三列，仅留文件名一列，并把该列复制一份。在两个文件名列之间插入两个空列，分别填写&ldquo;HTML&rdquo;和&ldquo;&quot;HTML&#92;&#92;&rdquo;，然后就可以另存成以制表符分隔的文本文件了。 <br />最后，用文本编辑器把上一步处理好的文件打开，不用我多说，只要几个替换，就得到所需要的资源脚本了。对于不同目录下的文件，均需要这么弄以下。 <br />资源脚本弄好了，把资源文件也加入（不是作为资源加入）工程，编译，就得到打包好的DLL文件了。接下来的问题是，这个DLL怎么用啊？别急，WebBrowser支持一种叫res的协议，可以访问文件里的资源。例如，假设上面About.htm打包到了myresource.dll文件中，则可以通过res://myresource.dll/About.htm访问，image016.gif则可通过res://myresource.dll/images/image016.gif访问（注意到了吧，HTML在根目录下，而IMAGES等其它资源则在同名目录下）。如果About.htm中通过&ldquo;images/image016.gif&rdquo;引用了image016.gif文件，则该图片在WebBrowser中正常显示。换句话说，你在打包之前，程序可以通过file://...访问HTML，打包之后，只需要换成res://...就可以了----打包对程序和HTML几乎没什么影响。但是，切记，切记！千万不要仅以数字来做文件名（如：1.htm、2.gif等），因为数字是被用来标识某种资源或某个资源的，如果用仅用数字作文件名（可以用字母+数字），打包后会导致访问找不到文件。</p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/135/</link>
<title><![CDATA[GHOST 命令集，编程用得着]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Sat, 05 Mar 2011 12:58:56 +0000</pubDate> 
<guid>http://www.t522.com/post/135/</guid> 
<description>
<![CDATA[ 
	<p>Ghost命令参数分类:<br /><br />1.磁盘对磁盘拷贝 <br />图形界面: Disk To Disk<br />参数例子: ghost -clone，mode=copy，src=1，dst=2 -sure -fx<br />参数功能: 拷贝磁盘一的全部内容到磁盘二，不必询问，完成后退出Ghost。<br /><br />2.把磁盘上的所有内容备份成映像文件<br />图形界面: Disk To Image<br />参数例子: ghost -clone，mode=dump，src=1，dst=d:&#92;Win98sys.gho -z3 -sure -fx<br />参数功能: 备份机器第一块硬盘上的全部内容到另一台硬盘d:&#92;Win98sys.gho文件中，高压缩，不必询问，完成后退出Ghost。<br /><br />3.从备份的映像文件复原到磁盘<br />图形界面: Disk From Image<br />参数例子: ghost -clone，mode=load，src=d:&#92;Win98sys.gho，dst=1 -sure -fx<br />参数功能: 从备份在另一块硬盘d:&#92;Win98sys.gho的映像文件复原到第一块硬盘上，不必询问，完成后退出Ghost。<br /><br />4.分区对分区拷贝<br />图形界面: Partition To Partition<br />参数例子: ghost -clone，mode=pcopy，src=1:1，dst=2:1 -sure -fx<br />参数功能: 拷贝第一块硬盘第一个分区上的所有内容到第二块硬盘的第一个分区上，不必询问，完成后退出Ghost。<br /><br />5.把分区内容备份成映像文件<br />图形界面: Partition To Image<br />参数例子: ghost -clone，mode=pdump，src=1:1，dst=d:&#92;Win98sys.gho -z9 -sure -fx<br />参数功能: 备份第一块硬盘第一分区到d:&#92;Win98sys.gho，采用最高压缩率，不必询问，完成后退出Ghost。<br /><br />6.从备份的映像文件克隆到分区<br />图形界面: Partition From Image<br />参数例子: ghost -clone，mode=pload，src=d:&#92;Win98sys.gho:1，dst=1:1 -sure -fx<br />参数功能: 把d:&#92;Win98sys.gho中的第一个分区内存克隆到第一块硬盘第一分区上，不必询问，完成后退出Ghost。<br /><br />7.平行端口电缆线直接连接电脑客户机<br />图形界面: LPT/Slave<br />参数例子: ghost -lps<br />参数功能: 启动客户机 (两台电脑必须同时执行Ghost)。<br /><br />8.平行端口电缆线直接连接服务机<br />图形界面: LPT/Master<br />参数例子: ghost -lpm -clone，mode=dump，src=1，dst=c:&#92;Win98sys.gho -sure -fx<br />参数功能: 将服务机第一块硬盘上的内容备份到客户机c:&#92;Win98sys.gho文件中，不必询问，完成后退出Ghost。<br /><br />9.硬盘间直接克隆<br />参数例子:ghost -clone，mode=copy，src=1，dst=2 -sure<br />参数功能:在内部模式拷贝第一块硬盘到第二块硬盘，无需提示，直接克隆。<br /><br />10.网络备份<br />参数例子:ghost -nbm -clone，mode=dump，src=2，dst=c:&#92;xxxx.gho<br />参数功能:由NetBIOS模式连接到正在进行ghost&#92;slave的网络远程个人电脑并备份本机第二块硬盘到远程硬盘C:&#92;xxxx.gho成一映像压缩文件。<br />小提示<br />该远程客户机必须使用ghost -nbs命令来启动。<br /><br />11.将映像文件克隆到硬盘<br />参数例子:ghost -clone，mode=load，src=e:&#92;savdsk.gho,dst=1<br />参数功能:读入E:&#92;SAVEDSK.gho文件，并把它克隆到第一块硬盘上。<br /><br />12.将第二个分区备份为映像文件(还原)<br />参数例子:ghost -clone，mode=pdump，src=1:2，dst=g:&#92;imgs&#92;part2.gho<br />参数功能:备份第一块硬盘的第二分区到g:&#92;imgs&#92;part2.gho映像文件。<br />参数例子:ghost -clone，mode=pload，src=g:&#92;imgs&#92;part2.gho:2，dst=1:2<br />参数功能:载入(恢复)映像文件内的第二分区到内部硬盘第一块硬盘的第二分区。<br /><br />13.不同硬盘不同分区复制<br />参数例子:ghost -clone，mode=pcopy，src=1:2，dst=2:1<br />参数功能:拷贝第一块硬盘的第二分区到第二块硬盘的第一分区。<br /><br />14.还原到第二块硬盘并调整分区大小<br />参数例子:ghost -clone，mode=load，src=g:&#92;imgs&#92;2prtdisk.gho，dst=2，sze1=60P，sze2=40P<br />参数功能:克隆g:&#92;imgs&#92;2prtdisk.gho映像文件到第二块硬盘， 并重整按60%和40%大小分配分区大小。<br /><br />15.还原到第一块硬盘并调整分区大小<br />参数例子:ghost -clone，mode=load，src=e:&#92;imgs&#92;3prtdisk.gho，dst=1，sze1=450M，sze2=1599M，sze3=2047M<br />参数功能:克隆e:&#92;imgs&#92;3prtdisk.gho映像文件到第一块硬盘， 并重整分区大小为: 第一分区450MB，第二分区1599MB，第三分区2047MB。<br /><br />16.保留第一分区，其他不分配<br />参数例子:ghost -clone，mode=copy，src=1，dst=2，sze1=F，sze2=V，sze3=V<br />参数功能:拷贝有三个分区的第一块硬盘到第二块硬盘并保持第一分区与来源大小相同，但是其他分区所剩余空间保留不予分配。<br /><br />17.还原到最后的分区并调整分区大小<br />参数例子:ghost -clone，mode=load，src=g:&#92;imgs&#92;2prtdisk.gho，dst=1，szeL<br />参数功能:载入映像文件到磁盘最后的分区并按照容量重整其大小，第一分区则利用剩余的空间。<br /><br />18.从参数文件读取<br />参数例子:GHOST.EXE @(参数文件)<br />参数功能:GHOST命令行参数可从参数文件读取并执行(注意参数文件是文本格式的)。<br />小提示<br />参数文件中可以以文本格式编写包含任何Ghost命令行参数，除了-AFILE=和-DFILE= 参数外。<br /><br />19.备份并自动分割<br />参数例子:ghost -sure -clone,mode=pdump,src=1:1,dst=system.gho -span -split=630<br />参数功能:它的作用是把第一块硬盘第一分区信息备份到当前文件夹下的system.gho中，如果生成的system.gho大于630MB，则会分割生成的GHO文件，这个参数在备份大的分区，并把它们烧录到650MB的CD-R上时非常有用。<br /><br />20.备份并加密<br />参数例子:ghost -sure -pwd,666888 -clone,mode=pdump,src=1:1,dst=system.gho<br />参数功能:该语句的作用是把第一块硬盘第一分区信息备份到当前文件夹下的system.gho中，并且以666888作为生成后GHO文件的密码，以便加密。以后用Ghost恢复system.gho文件，或者用Ghost Explorer来释放其中的文件时，都必须输入密码，否则无法恢复或释放文件，从而起到了保密的作用。<br />如果输入ghost -sure -pwd -clone,mode=pdump,src=1:1,dst=system.gho，即-pwd后面不带密码，则Ghost在制作GHO文件前会询问用户加密GHO的密码，你必须记牢。给GHO文件加密后，别人就无法随意查看或恢复我们的</p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/134/</link>
<title><![CDATA[Delphi文件操作函数 ]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[delphi基础]]></category>
<pubDate>Sun, 27 Feb 2011 11:54:01 +0000</pubDate> 
<guid>http://www.t522.com/post/134/</guid> 
<description>
<![CDATA[ 
	<p>//<span style="font-family: 宋体">判断文件是否存在</span> FileExists<br />//<span style="font-family: 宋体">判断文件夹是否存在</span> DirectoryExists<br />//<span style="font-family: 宋体">删除文件</span> DeleteFile; Windows.DeleteFile<br />//<span style="font-family: 宋体">删除文件夹</span> RemoveDir; RemoveDirectory<br />//<span style="font-family: 宋体">获取当前文件夹</span> GetCurrentDir<br />//<span style="font-family: 宋体">设置当前文件夹</span> SetCurrentDir; ChDir; SetCurrentDirectory<br />//<span style="font-family: 宋体">获取指定驱动器的当前路径名</span> GetDir<br />//<span style="font-family: 宋体">文件改名</span> RenameFile<br />//<span style="font-family: 宋体">建立文件夹</span> CreateDir; CreateDirectory; ForceDirectories<br />//<span style="font-family: 宋体">删除空文件夹</span> RemoveDir; RemoveDirectory<br />//<span style="font-family: 宋体">建立新文件</span> FileCreate<br />//<span style="font-family: 宋体">获取当前文件的版本号</span> GetFileVersion<br />//<span style="font-family: 宋体">获取磁盘空间</span> DiskSize; DiskFree<br />//<span style="font-family: 宋体">搜索文件</span> FindFirst; FindNext; FindClose<br />//<span style="font-family: 宋体">读取与设置文件属性</span> FileGetAttr; FileSetAttr<br />//<span style="font-family: 宋体">获取文件的创建时间</span> FileAge; FileDateToDateTime</p><p>Delphi<span style="font-family: 宋体">代码</span></p><p>//<span style="font-family: 宋体">判断文件是否存在</span>&nbsp;FileExists &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;f:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;f&nbsp;:=&nbsp;'c:&quot;temp&quot;test.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;not&nbsp;FileExists(f)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">如果文件不存在</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;end; &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">判断文件夹是否存在</span>&nbsp;DirectoryExists &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;'c:&quot;temp'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;not&nbsp;DirectoryExists(dir)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">如果文件夹不存在</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;end; &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">删除文件</span>&nbsp;DeleteFile;&nbsp;Windows.DeleteFile &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;f:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;f&nbsp;:=&nbsp;'c:&quot;temp&quot;test.txt'; &nbsp;&nbsp;</p><p>//DeleteFile(f);&nbsp;&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">或者用系统</span>API: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Windows.DeleteFile(PChar(f));&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">删除文件夹</span>&nbsp;RemoveDir;&nbsp;RemoveDirectory &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;'c:&quot;temp'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;RemoveDir(dir);&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">或者用系统</span>&nbsp;API: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;RemoveDirectory(PChar(dir));&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">获取当前文件夹</span>&nbsp;GetCurrentDir &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;GetCurrentDir; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(dir);&nbsp;//C:&quot;Projects &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">设置当前文件夹</span>&nbsp;SetCurrentDir;&nbsp;ChDir;&nbsp;SetCurrentDirectory &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;'c:&quot;temp'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;SetCurrentDir(dir)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(GetCurrentDir);&nbsp;//c:&quot;temp &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">或者</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ChDir(dir);&nbsp;//<span style="font-family: 宋体">无返回值</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">也可以使用</span>API: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;SetCurrentDirectory(PChar(Dir));&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">获取指定驱动器的当前路径名</span>&nbsp;GetDir &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;b:&nbsp;Byte; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;b&nbsp;:=&nbsp;0; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;GetDir(b,dir); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(dir);&nbsp;// &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">第一个参数</span>:&nbsp;1<span style="font-family: 宋体">、</span>2<span style="font-family: 宋体">、</span>3<span style="font-family: 宋体">、</span>4...<span style="font-family: 宋体">分别对应</span>:&nbsp;A<span style="font-family: 宋体">、</span>B<span style="font-family: 宋体">、</span>C<span style="font-family: 宋体">、</span>D... &nbsp;&nbsp;</p><p>//0&nbsp;<span style="font-family: 宋体">是缺省驱动器</span> &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">文件改名</span>&nbsp;RenameFile &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;OldName,NewName:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;OldName&nbsp;:=&nbsp;'c:&quot;temp&quot;Old.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;NewName&nbsp;:=&nbsp;'c:&quot;temp&quot;New.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;RenameFile(OldName,NewName)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">改名成功</span>!'); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">也可以</span>: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;SetCurrentDir('c:&quot;temp'); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;OldName&nbsp;:=&nbsp;'Old.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;NewName&nbsp;:=&nbsp;'New.txt'; &nbsp;&nbsp;</p><p>&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;RenameFile(OldName,NewName)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">改名成功</span>!'); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">也可以</span>: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;SetCurrentDir('c:&quot;temp'); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;OldName&nbsp;:=&nbsp;'Old.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;NewName&nbsp;:=&nbsp;'New.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;RenameFile(OldName,NewName)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">改名成功</span>!'); &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">建立文件夹</span>&nbsp;CreateDir;&nbsp;CreateDirectory;&nbsp;ForceDirectories &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;'c:&quot;temp&quot;delphi'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;not&nbsp;DirectoryExists(dir)&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;CreateDir(dir);&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">也可以直接用</span>API: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;CreateDirectory(PChar(dir),nil);&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">如果缺少上层目录将自动补齐</span>: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;'c:&quot;temp&quot;CodeGear&quot;Delphi&quot;2007&quot;<span style="font-family: 宋体">万一</span>'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ForceDirectories(dir);&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">删除空文件夹</span>&nbsp;RemoveDir;&nbsp;RemoveDirectory &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dir&nbsp;:=&nbsp;'c:&quot;temp&quot;delphi'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;RemoveDir(dir);&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">也可以直接用</span>API: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;RemoveDirectory(PChar(dir));&nbsp;//<span style="font-family: 宋体">返回</span>&nbsp;Boolean &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">建立新文件</span>&nbsp;FileCreate &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName:&nbsp;string; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;i:&nbsp;Integer; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName&nbsp;:=&nbsp;'c:&quot;temp&quot;test.dat'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;i&nbsp;:=&nbsp;FileCreate(FileName); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;i&gt;0&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">新文件的句柄是</span>:&nbsp;'&nbsp;+&nbsp;IntToStr(i)) &nbsp;&nbsp;</p><p>&nbsp;&nbsp;else&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">创建失败</span>!'); &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">获取当前文件的版本号</span>&nbsp;GetFileVersion &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;s:&nbsp;string; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;i:&nbsp;Integer; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;s&nbsp;:=&nbsp;'C:&quot;WINDOWS&quot;notepad.exe'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;i&nbsp;:=&nbsp;GetFileVersion(s);&nbsp;//<span style="font-family: 宋体">如果没有版本号返回</span>&nbsp;-1 &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(IntToStr(i));&nbsp;//327681&nbsp;<span style="font-family: 宋体">这是当前记事本的版本号</span>(<span style="font-family: 宋体">还应该再转换一下</span>) &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">获取磁盘空间</span>&nbsp;DiskSize;&nbsp;DiskFree &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;r:&nbsp;Real; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;s:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;r&nbsp;:=&nbsp;DiskSize(3);&nbsp;//<span style="font-family: 宋体">获取</span>C:<span style="font-family: 宋体">总空间</span>,&nbsp;<span style="font-family: 宋体">单位是字节</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;r&nbsp;:=&nbsp;r/1024/1024/1024; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Str(r:0:2,s);&nbsp;//<span style="font-family: 宋体">格式为保留两位小数的字符串</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;s&nbsp;:=&nbsp;'C<span style="font-family: 宋体">盘总空间是</span>:&nbsp;'&nbsp;+&nbsp;s&nbsp;+&nbsp;'&nbsp;GB'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(s);&nbsp;//xx.xx&nbsp;GB &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;r&nbsp;:=&nbsp;DiskFree(3);&nbsp;//<span style="font-family: 宋体">获取</span>C:<span style="font-family: 宋体">可用空间</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;r&nbsp;:=&nbsp;r/1024/1024/1024; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Str(r:0:2,s); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;s&nbsp;:=&nbsp;'C<span style="font-family: 宋体">盘可用空间是</span>:&nbsp;'&nbsp;+&nbsp;s&nbsp;+&nbsp;'&nbsp;GB'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(s);&nbsp;//xx.xx&nbsp;GB &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">查找一个文件</span>&nbsp;FileSearch &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName,Dir,s:&nbsp;string; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName&nbsp;:=&nbsp;'notepad.exe'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Dir&nbsp;:=&nbsp;'c:&quot;windows'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;s&nbsp;:=&nbsp;FileSearch(FileName,Dir); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;s&lt;&gt;''&nbsp;then&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage(s)&nbsp;//c:&quot;windows&quot;notepad.exe &nbsp;&nbsp;</p><p>&nbsp;&nbsp;else&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">没找到</span>'); &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">搜索文件</span>&nbsp;FindFirst;&nbsp;FindNext;&nbsp;FindClose &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;sr:&nbsp;TSearchRec;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">定义</span>&nbsp;TSearchRec&nbsp;<span style="font-family: 宋体">结构变量</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Attr:&nbsp;Integer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">文件属性</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;s:&nbsp;string;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">要搜索的内容</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;List:&nbsp;TStringList;&nbsp;//<span style="font-family: 宋体">存放搜索结果</span> &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;s&nbsp;:=&nbsp;'c:&quot;windows&quot;*.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Attr&nbsp;:=&nbsp;faAnyFile;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">文件属性值</span>faAnyFile<span style="font-family: 宋体">表示是所有文件</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;List&nbsp;:=&nbsp;TStringList.Create;&nbsp;&nbsp;&nbsp;&nbsp;//List<span style="font-family: 宋体">建立</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;FindFirst(s,Attr,sr)=0&nbsp;then&nbsp;//<span style="font-family: 宋体">开始搜索</span>,<span style="font-family: 宋体">并给</span>&nbsp;sr&nbsp;<span style="font-family: 宋体">赋予信息</span>,&nbsp;<span style="font-family: 宋体">返回</span>0<span style="font-family: 宋体">表示找到第一个</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;repeat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">如果有第一个就继续找</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List.Add(sr.Name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">用</span>List<span style="font-family: 宋体">记下结果</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;until(FindNext(sr)&lt;&gt;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">因为</span>sr<span style="font-family: 宋体">已经有了搜索信息</span>,&nbsp;FindNext<span style="font-family: 宋体">只要这一个参数</span>,&nbsp;<span style="font-family: 宋体">返回</span>0<span style="font-family: 宋体">表示找到</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;FindClose(sr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">需要结束搜索</span>,&nbsp;<span style="font-family: 宋体">搜索是内含句柄的</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(List.Text);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">显示搜索结果</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;List.Free;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<span style="font-family: 宋体">释放</span>List &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">更多注释</span>: &nbsp;&nbsp;</p><p>//TSearchRec&nbsp;<span style="font-family: 宋体">结构是内涵文件大小、名称、属性与时间等信息</span> &nbsp;&nbsp;</p><p>//TSearchRec&nbsp;<span style="font-family: 宋体">中的属性是一个整数值</span>,&nbsp;<span style="font-family: 宋体">可能的值有</span>: &nbsp;&nbsp;</p><p>//faReadOnly&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">只读文件</span> &nbsp;&nbsp;</p><p>//faHidden&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">隐藏文件</span> &nbsp;&nbsp;</p><p>//faSysFile&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">系统文件</span> &nbsp;&nbsp;</p><p>//faVolumeID&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">卷标文件</span> &nbsp;&nbsp;</p><p>//faDirectory&nbsp;16&nbsp;&nbsp;<span style="font-family: 宋体">目录文件</span> &nbsp;&nbsp;</p><p>//faArchive&nbsp;&nbsp;&nbsp;32&nbsp;&nbsp;<span style="font-family: 宋体">归档文件</span> &nbsp;&nbsp;</p><p>//faSymLink&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;<span style="font-family: 宋体">链接文件</span> &nbsp;&nbsp;</p><p>//faAnyFile&nbsp;&nbsp;&nbsp;63&nbsp;&nbsp;<span style="font-family: 宋体">任意文件</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//s&nbsp;<span style="font-family: 宋体">的值也可以使用</span>?<span style="font-family: 宋体">通配符</span>,<span style="font-family: 宋体">好像只支持</span>7<span style="font-family: 宋体">个</span>?,&nbsp;<span style="font-family: 宋体">如果没有条件就是</span>*,&nbsp;<span style="font-family: 宋体">譬如</span>:&nbsp;C:&quot;* &nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">实际使用中还应该在</span>&nbsp;repeat&nbsp;<span style="font-family: 宋体">中提些条件</span>,&nbsp;<span style="font-family: 宋体">譬如判断如果是文件夹就递归搜索等等</span> &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">读取与设置文件属性</span>&nbsp;FileGetAttr;&nbsp;FileSetAttr &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName:&nbsp;string; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Attr:&nbsp;Integer;&nbsp;//<span style="font-family: 宋体">属性值是一个整数</span> &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName&nbsp;:=&nbsp;'c:&quot;temp&quot;Test.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Attr&nbsp;:=&nbsp;FileGetAttr(FileName); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(IntToStr(Attr));&nbsp;//32,&nbsp;<span style="font-family: 宋体">存档文件</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">设置为隐藏和只读文件</span>: &nbsp;&nbsp;</p><p>&nbsp;&nbsp;Attr&nbsp;:=&nbsp;FILE_ATTRIBUTE_READONLY&nbsp;or&nbsp;FILE_ATTRIBUTE_HIDDEN; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;if&nbsp;FileSetAttr(FileName,Attr)=0&nbsp;then&nbsp;//<span style="font-family: 宋体">返回</span>0<span style="font-family: 宋体">表示成功</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ShowMessage('<span style="font-family: 宋体">设置成功</span>!'); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">属性可选值</span>(<span style="font-family: 宋体">有些用不着</span>): &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_READONLY&nbsp;=&nbsp;1;&nbsp;<span style="font-family: 宋体">只读</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_HIDDEN&nbsp;=&nbsp;2;&nbsp;<span style="font-family: 宋体">隐藏</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_SYSTEM&nbsp;=&nbsp;4;&nbsp;<span style="font-family: 宋体">系统</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_DIRECTORY&nbsp;=&nbsp;16 &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_ARCHIVE&nbsp;=&nbsp;32;&nbsp;<span style="font-family: 宋体">存档</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_DEVICE&nbsp;=&nbsp;64 &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_NORMAL&nbsp;=&nbsp;128;&nbsp;<span style="font-family: 宋体">一般</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_TEMPORARY&nbsp;=&nbsp;256 &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_SPARSE_FILE&nbsp;=&nbsp;512 &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_REPARSE_POINT&nbsp;=&nbsp;1204 &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_COMPRESSED&nbsp;=&nbsp;2048;&nbsp;<span style="font-family: 宋体">压缩</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_OFFLINE&nbsp;=&nbsp;4096 &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_NOT_CONTENT_INDEXED&nbsp;=&nbsp;8192;&nbsp;<span style="font-family: 宋体">不被索引</span> &nbsp;&nbsp;</p><p>//FILE_ATTRIBUTE_ENCRYPTED&nbsp;=&nbsp;16384 &nbsp;&nbsp;</p><p>end; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>-------------------------------------------------------------------------------- &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>//<span style="font-family: 宋体">获取文件的创建时间</span>&nbsp;FileAge;&nbsp;FileDateToDateTime &nbsp;&nbsp;</p><p>var&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName:&nbsp;string; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ti:&nbsp;Integer; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;dt:&nbsp;TDateTime; &nbsp;&nbsp;</p><p>begin&nbsp;&nbsp;</p><p>&nbsp;&nbsp;FileName&nbsp;:=&nbsp;'c:&quot;temp&quot;Test.txt'; &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ti&nbsp;:=&nbsp;FileAge(FileName); &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(IntToStr(ti));&nbsp;//<span style="font-family: 宋体">返回</span>:&nbsp;931951472,&nbsp;<span style="font-family: 宋体">需要转换</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;</p><p>&nbsp;&nbsp;dt&nbsp;:=&nbsp;FileDateToDateTime(ti);&nbsp;//<span style="font-family: 宋体">转换</span> &nbsp;&nbsp;</p><p>&nbsp;&nbsp;ShowMessage(DateTimeToStr(dt));&nbsp;//2007-12-12&nbsp;14:27:32 &nbsp;&nbsp;</p><p>end;&nbsp;&nbsp;</p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/133/</link>
<title><![CDATA[通过查找内存获取当前登录的QQ号码(delphi)]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Wed, 12 Jan 2011 10:27:10 +0000</pubDate> 
<guid>http://www.t522.com/post/133/</guid> 
<description>
<![CDATA[ 
	<p>从QQ2008年开始,腾讯的QQ就不能通过查找标题的方式来查找QQ号码了,如图</p><p><img alt="" src="/attachment/image/qq2008(1).png" /></p><p>所以,通过FindWindowEx 等方式来查找窗口貌似是行不通了,但是,我们还有一大杀器,通过<a target="_blank" href="http://u.115.com/file/f261686673">Game Edit(CE5.6青色咖啡汉化版</a>)来查找,如图,打开<a target="_blank" href="http://u.115.com/file/f261686673">Game Edit</a>打开QQ的进程,然后找你的QQ号码,一般会出现67个以上地址,哪个是的呢?</p><p><img alt="" src="/attachment/image/gameedit.png" /></p><p>往下面拉,把那两个绿色的保存下来,退出QQ后再重新登录,再用gameedit打开QQ进程,那两个QQ号码一直没改变,说明这两个地址都可以,保存其中一个地址,然后打开我们的delphi,通过程序来获取.</p><p>首先,我们要查找QQ的窗口句柄</p><p>代码如下图</p><p><img alt="" src="/attachment/image/1.gif" /></p><p>如图,获取了所有的QQ号码及Email帐号,呢称也能获取,代码稍后奉上.</p><div class="HighLighter" contenteditable="false"><div class="dp-highlighter" contenteditable="false"><div class="bar">&nbsp;</div><ol class="dp-delphi">&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span><span class="keyword">function</span><span> EnumWndProc(AWnd: HWND; AlParam: LPARAM): Boolean; stdcall; </span></span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">var</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>szText: </span><span class="keyword">array</span><span>[</span><span class="number">0..254</span><span>] </span><span class="keyword">of</span><span> </span><span class="keyword">char</span><span>; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>Hwind:THandle; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>pid:DWORD; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>Num, Byteread:Cardinal; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>WName: </span><span class="keyword">array</span><span> [</span><span class="number">0..36</span><span>] </span><span class="keyword">of</span><span> WideChar; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>Item:TListItem; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>t:Integer; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">begin</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span class="keyword">if</span><span> GetWindowText(awnd, @szText, </span><span class="number">255</span><span>) &gt; </span><span class="number">0</span><span> </span><span class="keyword">then</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">if</span><span> (length(szText)&gt;</span><span class="number">0</span><span>) </span><span class="keyword">and</span><span> (szText =</span><span class="string">'QQ2010'</span><span>) </span><span class="keyword">then</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>getWindowThreadProcessId(AWnd, @PID); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>Hwind :=OpenProcess(PROCESS_ALL_ACCESS, </span><span class="keyword">false</span><span>, pid); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span class="keyword">if</span><span> Hwind&gt; </span><span class="number">0</span><span> </span><span class="keyword">then</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">begin</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>ReadProcessMemory(Hwind, Pointer(</span><span class="number">$31883598</span><span>), @Num, </span><span class="number">4</span><span>, ByteRead); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>ReadProcessMemory(Hwind,Pointer(</span><span class="number">$00167604</span><span>),@wname,</span><span class="number">36</span><span>,Byteread); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>t:=Form1</span><span class="number">.</span><span>ListView1</span><span class="number">.</span><span>Items</span><span class="number">.</span><span>Count; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>item:=Form1</span><span class="number">.</span><span>listview1</span><span class="number">.</span><span>Items</span><span class="number">.</span><span>Add; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>Item</span><span class="number">.</span><span>Caption:=IntToStr(t); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>Item</span><span class="number">.</span><span>SubItems</span><span class="number">.</span><span>Add(IntToStr(Num)); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span class="keyword">if</span><span> Pos(</span><span class="string">'@'</span><span>,wname)&gt;</span><span class="number">0</span><span> </span><span class="keyword">then</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>Item</span><span class="number">.</span><span>SubItems</span><span class="number">.</span><span>Add(wname) </span><span class="keyword">else</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>Item</span><span class="number">.</span><span>SubItems</span><span class="number">.</span><span>Add(</span><span class="string">'无'</span><span>); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">end</span><span>; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>closeHandle(Hwind); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>result:=True; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span class="keyword">end</span><span>; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li>&nbsp;</li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span class="keyword">procedure</span><span> TForm1</span><span class="number">.</span><span>Button1Click(Sender: TObject); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">begin</span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt"><span>Form1</span><span class="number">.</span><span>ListView1</span><span class="number">.</span><span>Items</span><span class="number">.</span><span>Clear; </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span>EnumWindows(@EnumWndProc, </span><span class="number">0</span><span>); </span></li>&nbsp;&nbsp;&nbsp;&nbsp;<li class="alt">&nbsp;</li>&nbsp;&nbsp;&nbsp;&nbsp;<li><span class="keyword">end</span><span>;</span></li></ol></div><div class="delphi" contenteditable="false" style="display: none"><pre>&nbsp;&nbsp;function EnumWndProc(AWnd: HWND; AlParam: LPARAM): Boolean; stdcall;var&nbsp;&nbsp;&nbsp;&nbsp;szText: array[0..254] of char;&nbsp;&nbsp;&nbsp;&nbsp;Hwind:THandle;&nbsp;&nbsp;&nbsp;&nbsp;pid:DWORD;&nbsp;&nbsp; Num, Byteread:Cardinal;&nbsp;&nbsp; WName: array [0..36] of WideChar;&nbsp;&nbsp; Item:TListItem;&nbsp;&nbsp; t:Integer;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;&nbsp;GetWindowText(awnd, @szText, 255) &gt; 0 then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;(length(szText)&gt;0) and (szText ='QQ2010') then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getWindowThreadProcessId(AWnd, @PID);&nbsp;&nbsp;&nbsp;&nbsp; Hwind :=OpenProcess(PROCESS_ALL_ACCESS, false, pid);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Hwind&gt; 0 then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;ReadProcessMemory(Hwind, Pointer($31883598), @Num, 4, ByteRead);&nbsp;&nbsp;ReadProcessMemory(Hwind,Pointer($00167604),@wname,36,Byteread);&nbsp;&nbsp; t:=Form1.ListView1.Items.Count; item:=Form1.listview1.Items.Add; Item.Caption:=IntToStr(t); Item.SubItems.Add(IntToStr(Num)); if Pos('@',wname)&gt;0 then Item.SubItems.Add(wname)&nbsp;&nbsp;else Item.SubItems.Add('无'); end;closeHandle(Hwind);result:=True; end;procedure TForm1.Button1Click(Sender: TObject);begin&nbsp;&nbsp;&nbsp;&nbsp;Form1.ListView1.Items.Clear;&nbsp;&nbsp;EnumWindows(@EnumWndProc, 0);end;</pre></div><div contenteditable="false"><link rel="stylesheet" type="text/css" href="http://www.t522.com/editor/fckeditor/editor/plugins/highlighter/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css" /></div></div><p>&nbsp;</p>
]]>
</description>
</item><item>
<link>http://www.t522.com/post/132/</link>
<title><![CDATA[极点ESET NOD32 升级ID获取更换器]]></title> 
<author>青色咖啡 &lt;admin@t522.com&gt;</author>
<category><![CDATA[个人作品]]></category>
<pubDate>Sat, 25 Dec 2010 17:19:55 +0000</pubDate> 
<guid>http://www.t522.com/post/132/</guid> 
<description>
<![CDATA[ 
	<p><span style="font-family: 宋体;">最近装了盗版的NOD32,但是ID懒得找(主要是ID分发网站弹窗太多了),就写了这个NOD32 自动ID获取器,装上这个软件基本上就不会有找ID的烦恼了,每次开机启动都会验证电脑中的ID是否过期,没过期的话就自动调用NOD32更新病毒库,若过期了的话就会自动获取ID,自动更换,然后自动更新病毒库(不会象有些软件影响键盘鼠标操作),软件会自动验证是否加入了NOD32的排除列表,如果没有加入的话自动加入NOD32排除列表(某人还把自动加入NOD32排除列表当做宝,不公布哈哈),支持4.0版以上的EAV和ESS,其它版本我没有试,建议大家用高版本的NOD32，因为安全啦。</span></p>
<p><img alt="" src="/attachment/image/JDNOD32.jpg" /></p>
<p><a href="attachment.php?fid=45">点击这里下载文件</a></p>
<p>&nbsp;</p>
]]>
</description>
</item>
</channel>
</rss>
