﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-学好delphi</title><link>http://www.cnitblog.com/shuyezi122/</link><description>我delphi笔记,你的参与就是对我最大的支持,还有汇编语言也在学
我的QQ群:79598397
</description><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 17:47:09 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 17:47:09 GMT</pubDate><ttl>60</ttl><item><title>内存映像函数</title><link>http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63908.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Thu, 21 Jan 2010 11:49:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63908.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/63908.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/63908.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/63908.html</trackback:ping><description><![CDATA[<p>映像函数：<br>1.createfilemapping();创建映像<br>HANDLE CreateFileMapping(<br>HANDLE hFile,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //物理文件句柄<br>LPSECURITY_ATTRIBUTES lpAttributes, //安全设置<br>DWORD flProtect,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //保护设置<br>DWORD dwMaximumSizeHigh,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //高位文件大小<br>DWORD dwMaximumSizeLow,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //低位文件大小<br>LPCTSTR lpName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //共享内存名称<br>);</p>
<p>2.openfilemapping();打开映像<br>HANDLE openfilemapping(访问类型，是否可继承，共享内存名称）</p>
<p>3.mapviewoffile();映射到本进程中<br>mapviewoffile(句柄，访问类型，0，0，映射字节)</p>
<p>4.unmapviewoffile()关闭映像<br>unmapviewoffile(mapviewoffile的句柄)</p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/63908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2010-01-21 19:49 <a href="http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows内存映像文件</title><link>http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63905.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Thu, 21 Jan 2010 11:44:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63905.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/63905.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/63905.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/63905.html</trackback:ping><description><![CDATA[一．内核对象和地址空间<br>为了更好地理解本文后面的内容，在介绍内存映像文件之前我们先简单回顾一下Window<br>s中内核对象和地址空间的有关概念。在Windows中有各种内核对象，如事件、文件、进<br>程、旗语、互斥体等。内核对象是由系统内核分配管理的一段内存块，只有系统内核能<br>够直接访问这一段内核对象数据，而应用程序只能通过Windows提供的一系列函数按规定<br>的方式去操作这些内核对象。我们通过调用有关Windows API函数创建内核对象（这些函<br>数通常带有Create前缀）。当我们调用一个函数创建内核对象的时候，该函数通常返回<br>一个标识该对象的句柄(HANDLE)。我们把标识该内核对象的句柄传递给有关windows函数<br>，告诉系统去操作哪一个内核对象。内核对象属于系统内核而不是进程，内核对象可被<br>多个进程访问使用，也即可在多个进程间共享。每个内核对象自身有一个引用计数值，<br>它记录有多少进程使用该对象，当引用计数值为零时由系统负责销毁内核对象。在多个<br>进程间共享内核对象有三种方法：句柄继承、命名、句柄复制。在本文后面将要提到的<br>文件映像对象亦是内核对象。<br>在Windows中每一个进程都有自己私有的地址空间，对32位的进程来说地址空间的大小是<br>从0x00000000 到 0xFFFFFFFF共4GB范围。这个空间仅仅是内存地址的范围，而不是计算<br>机的物理存储RAM空间，因而又称为虚拟内存空间。使用某段虚拟内存空间需要经过保留<br>和提交两个过程，将物理存储分配映像到地址空间的该段区域上。物理存储不应理解为<br>RAM，实际上应理解为来自于磁盘上（通常为硬盘）的系统内存分页文件，在必要时（读<br>写访问时）其内容才会被系统写到RAM中或从RAM中写回来。磁盘上的这种系统内存分页<br>文件又称为虚拟内存。<br>二． 内存映像文件<br>几乎每个应用程序都要和文件打交道。比如，应用程序有时需要打开、读取、再关闭文<br>件；而有时需要打开文件，将数据读到一个缓冲区再写回到文件中另一个位置。通常实<br>现起来都显得有点繁琐。Microsoft Windows提供了满足这两方面要求的最佳解决途径：<br>内存映像文件。<br>象使用虚拟内存一样，使用内存映像文件同样需要经过保留和提交两个过程，首先在进<br>程内存空间保留一块区域，然后提交物理存储给这段区域。不同的是物理存储来自于磁<br>盘上的文件，而不是系统的分页文件。也即将磁盘上指定的数据文件作为虚拟内存，这<br>个实现过程被称为文件映像，可以将文件全部或部分映像到进程的地址空间中。文件映<br>像过以后，可以把文件映像的部分当作已全部被载入内存一样的去访问它，这时又称它<br>为内存映像文件。<br>内存映像文件通常有三个方面的应用：<br>1． 系统使用内存映像文件载入和执行.EXE和.DLL文件。一方面节省了系统分页文件空<br>间，另一方面缩短了加载应用程序开始执行所需的时间。<br>2． 使用内存映像文件访问磁盘上的数据文件。绕开对文件实行I/O操作和对文件内容的<br>缓冲，交由操作系统内核去完成。<br>3． 使用内存映像文件可以实现在多个进程间彼此共享数据。Windows提供了在进程间进<br>行数据通信的其它多种方法。但这些方法也是通过内存映像文件来实现的，所以内存映<br>像文件是实现进程间通信最有效率的方法。<br>三． 内存映像文件使用步骤<br>要使用内存映像文件，可以按以下步骤：<br>(1) 调用Windows API 函数CreateFile（）创建或是打开一个文件，得到一个标识该文<br>件（内核对象）的句柄，它确定了哪一个磁盘文件将要作为内存映像文件。<br>(2) 将（1）中得到的文件对象句柄作为第一个参数调用Windows API 函数CreateFileM<br>apping（）创建一个文件映像对象。通知系统该文件的大小及对该文件的访问方式，同<br>时也得到一个标识该文件映像对象的句柄。<br>(3) 将（2）中得到的文件映像对象句柄作为第一个参数调用Windows API 函数MapView<br>OfFile（）通知系统映像文件全部或部分内容到进程的某一段地址空间，并将此段空间<br>首地址通过该函数返回。这一步也就是使用虚拟内存的保留和提交过程，此后就可以利<br>用此首地址实现对文件内容的读写了。<br>也可以不做第一步，直接从第二步开始，但这时要用INVALID_HANDLE_VALUE为参数作为<br>标识文件对象的句柄，这时系统以其分页文件作为内存映像文件而不用指定磁盘上的哪<br>一个磁盘文件。当你使用完内存映像文件后，需要做以下几步清除动作。<br>(1) 调用Windows API 函数UnmapViewOfFile（）,通知系统释放文件映像对象在进程地<br>址空间中占用的区域。<br>(2) 调用Windows API 函数CloseHandle()，分别关闭文件映像对象和文件对象。<br>四． 内存映像文件应用举例<br>1．应用一 —— 系统加载.EXE和.DLL<br>当一个.EXE文件被载入准备运行时，系统要执行以下几步：<br>(1) 系统定位.EXE文件在磁盘的位置。<br>(2) 系统创建一个新的内核对象——进程。<br>(3) 系统为此进程创建其私有地址空间。<br>(4) 系统保留地址空间中足够大的一块区域容纳.EXE文件。而这块区域的基地址在.EXE<br>文件中有所指定，通常在0x00400000处。<br>(5) 系统记下支持这块区域的物理存储是.EXE文件，而不是在系统内存分页文件。<br>这之后系统访问.EXE文件有关信息项，确定所要载入哪些.DLL（动态连接库）文件。系<br>统调用LoadLibrary函数载入.DLL文件，执行类似上述(4)、(5)步的操作。<br>(1) 系统保留地址空间中足够大的一块区域容纳.DLL文件。同样其基地址在.DLL件中有<br>所指定。 Visual C++下制作DLL，默认情况下是 0x10000000处。<br>(2) 如果从该基地址开始的区域已被另一个.DLL或.EXE所占，或从该基地址开始的区域<br>不够大，系统将在地址空间寻找另一块区域，保留给.DLL文件。<br>(3) 系统记下支持这块区域的物理存储是在.DLL文件，而不是在系统内存分页文件。<br>在所有的.EXE和.DLL文件被映像到进程的地址空间中后，系统开始执行.EXE文件的入口<br>点代码。<br>2．应用二 —— 进程间共享数据<br>Windows的确提供了很多快速、方便的机制用于应用程序间共享数据和信息。这些机制包<br>括RPC、COM、OLE、DDE、WINDOWS消息（特别是WM_COPYDATA），剪贴板，管道，套节字<br>等等。然而在Windows中，同一台机器上多进程间共享数据最底层的机制是内存映像文件<br>。也就是说在同一台机器上，采用上述提到的方法实现进程间通信，最终全都是通过内<br>存映像文件分别实现各自特定的任务。因此使用内存映像文件是提高这类程序性能的一<br>种极好途径。<br>多进程间共享数据是通过将同一个文件映像对象的同一块区域映像到各进程地址空间中<br>来实现的。映像到在各个进程中的地址空间区域可能有所不同，但是各进程的这段区域<br>共享相同的物理存储分页文件，如图1所示。因此，当其中一个进程向文件映像对象的这<br>一区域写入数据时，其他进程在它们自身的地址空间中就能看到这一区域的变化。<br>让我们接着看系统加载.EXE启动一个应用程序这个例子。当启动一个程序时，系统调用<br>CreateFile函数打开磁盘上的.EXE文件。然后系统调用CreateFileMapping函数创建一个<br>文件映像对象，最后调用MapViewOfFileEx (用SEC_IMAGE 标志)将.EXE文件映像到进程<br>的地址空间中。此处用MapViewOfFileEx代替MapViewOfFile使文件映像到进程地址空间<br>中的首地址是存储在.EXE文件中指定的位置。然后系统创建进程的主线程，把此映像区<br>域可执行代码区的第一个字节的地址赋给线程的执行指针，然后让CPU开始执行代码。<br>如果用户执行同一个程序第二个实例时，系统会发现所要创建.EXE文件的文件映像对象<br>在内核中已经存在，因而不会再创建新的文件对象或文件映像对象。取而代之的是，系<br>统再次映像文件，这次是在新创建进程的地址空间中。可见系统同时映像同一个文件到<br>两个地址空间中。显然这更有效使用了内存，因为两个进程共享同一个包含正在执行代<br>码部分的物理存储文件。<br>象所有共享内核对象方法一样，可以使用句柄继承、命名、句柄复制三种方法在多个进<br>程间共享文件映像对象。下面列出了用命名方法共享内核对象，实现在两个进程间共享<br>数据的部分具体代码。用命名方法实现多个进程共享同一个文件映像对象时，所有进程<br>只需要对共享的文件映像对象使用完全相同的名称。<br>进程1：<br>//创建一个物理存储来自系统分页文件的文件映像对象，<br>//其大小为4 KB 命名为MMFSharedData.<br>&nbsp;&nbsp; s_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData"));<br>//将该对象内容全部映像到进程地址空间中<br>&nbsp;&nbsp;&nbsp; PVOID pView = MapViewOfFile(s_hFileMap,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);<br>进程2：<br>// 打开名称为MMFSharedData 的文件映像对象<br>HANDLE hFileMapT = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FALSE, TEXT("MMFSharedData"));<br>//将该对象内容全部映像到进程地址空间中<br>PVOID pView = MapViewOfFile(hFileMapT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);<br>这两个进程在其各自pView指针开始处4KB内容的物理存储来自同一个分页文件的同一段<br>区域，因而具有相同的内容，也即它们共享同一段数据。<br>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/63905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2010-01-21 19:44 <a href="http://www.cnitblog.com/shuyezi122/archive/2010/01/21/63905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转Delphi托盘编程实战演练</title><link>http://www.cnitblog.com/shuyezi122/archive/2010/01/20/63840.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Wed, 20 Jan 2010 12:25:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2010/01/20/63840.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/63840.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2010/01/20/63840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/63840.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/63840.html</trackback:ping><description><![CDATA[在Delphi中涉及到系统编程的方面毫无例外都要调用API函数，在ShellAPI.pas单元中有要用到的API函数的原型。<br>实战演练：<br>一．新建一个应用程序： File-&gt;New Applicaton，在uses后部分定义一个消息常量：<br>WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。<br>再定义过程<br>procedure WMNID(var msg:TMessage);message WM_NID;<br>二．定义一个全局变量： NotifyIcon:TNotifyIconData，NotifyIcon是非常重要的一个变量，整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型，按住Ctrl键，在TNotifyIconData 双击即进入ShellAPI.pas单元。（注：在Delphi中，这是一个非常好的对源代码进行分析的方法，源代码说明一切，你要想知道程序背后的内幕，最好的方法就是分析源代码！）此时出现了以下赋值语句：<br>TNotifyIconData = TNotifyIconDataA，这个意思很明显，就是说TNotifyIconData和TNotifyIconDataA是同种数据类型，接着往下看有：TNotifyIconDataA = _NOTIFYICONDATAA，意思与刚才的一样，再往下看： <br>type<br>_NOTIFYICONDATAA = record<br>&nbsp;&nbsp;&nbsp;&nbsp; cbSize: DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp; Wnd: HWND;<br>&nbsp;&nbsp;&nbsp;&nbsp; uID: UINT;<br>&nbsp;&nbsp;&nbsp;&nbsp; uFlags: UINT;<br>&nbsp;&nbsp;&nbsp;&nbsp; uCallbackMessage: UINT;<br>&nbsp;&nbsp;&nbsp;&nbsp; hIcon: HICON;<br>&nbsp;&nbsp;&nbsp;&nbsp; szTip: array [0..63] of AnsiChar;<br>end;<br>这可真是&#8220;千呼万唤始出来，犹抱琵琶半遮面&#8221;。现在大家很清楚了，我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量，就相当于C/C++中的结构体变量（C/C++的程序员应该是再熟悉不过了）。下面我们逐个来解释记录类型中的7个部分各有什么功能。<br>1&gt; cbSize就是你定义的NotifyIcon变量的大小，用SizeOf(TNotifyIconData)可以取得，如果你是一个熟练的C/C++程序员，你应该不会陌生。在C/C++中，每当要为一个结构体变量分配内存的时候都要：通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。<br>2&gt; Wnd是一个句柄，你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。<br>例如：你准备在任务栏的托盘小图标上单击时窗体是窗体在&#8220;显示&#8221;和&#8220;隐藏&#8221;之间切换，则把Wnd指向主窗体。<br>3&gt; uID:如果你要创建多个托盘小程序，那么怎么区分它们呢？就是靠这个ID号来区分。<br>3&gt; uFlags是一个标志位，它表示当前所创建的托盘程序具有哪些性质：<br>&nbsp;&nbsp;&nbsp;&nbsp; NIF_ICON&nbsp;&nbsp;&nbsp;&nbsp; 表示当前所设置的图标（即hIcon的值）是有效的 <br>&nbsp;&nbsp;&nbsp;&nbsp; NIF_MESSAGE 表示当前所设置的系统消息（即uCallBackMessage的值）是有效的<br>&nbsp;&nbsp;&nbsp;&nbsp; NIF_TIP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示当前所设置的提示条（即szTip的值）是有效的。<br>4&gt; uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息，也就是说这里定义一个消息名，当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个你在<br>uCallBackMessage中定义的消息名，然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。 <br>6&gt; hIcon为托盘图标的句柄，根据这个句柄你就可以增加、修改、删除。<br>7&gt; szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。<br>在这里我花了大量的笔墨介绍TNotifyIconData的内幕，把这部分搞清楚了，后面的东西就顺理成章了。<br>三． 双击主窗体，进入FormCreate的代码区域：<br>&nbsp;&nbsp; TForm1.FormCreate(Sender:TObject);<br>&nbsp;&nbsp; Begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //NotifyIcon为全局变量，在程序的开头已经定义了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; with NotifyIcon do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cbSize:=SizeOf(TNotifyIconData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wnd:=Handle;&nbsp;&nbsp; //指向当前窗体Form1的句柄<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uID:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uCallBackMessage:=WM_NID;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hIcon:=Application.Icon.Handle;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szTip:=&#8221;张家恶少&#8221;；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;.<br>&nbsp;&nbsp;&nbsp;&nbsp; //把设置好的变量NotifyIcon加入到系统中以便处理<br>&nbsp;&nbsp;&nbsp; Shell_NotifyIcon(NIM_ADD,@NotifyIcon);<br>&nbsp;&nbsp; End;<br>四．接下来就是定义一个消息处理函数：系统给窗体发来了一个消息，就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的，大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样：消息处理函数要在后面加上消息的名称，这样当系统发来WM_NID消息时，就是自动触发<br>WMNID消息处理函数。<br>procedure tform1.WMNID(var msg:TMessage);message WM_NID;<br>begin<br>&nbsp;&nbsp; case msg.LParam of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WM_RBUTTONUP: ShowMessage(&#8216;您点击的是右键&#8217;);<br>&nbsp;&nbsp; End;<br>End;<br>好了，一个最简单的程序诞生了，大家自己设置好自己喜欢的图标.<br>Project-&gt;Options,选中Application页面，在Icon项中加载自己喜欢的图标，这样程序运行时，在任务栏里显示的就是你喜欢的图标了。当你单击图标时，窗体Form1会在可见与不可见之间切换，也就是说单击一下显示，再单击一下又隐藏。当你右击图标的时候会弹出一条消息：&#8220;你点击的是右键&#8221;。<br>五．最后要记住在关闭应用程序的时候要释放掉建立的托盘程序，否则会占用系统资源。<br>TForm1.FormDestroy(Sender:TObject);<br>Begin<br>Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);<br>End;
<p>毕业快半年了，很多东西在学校总理解不了，认识不够深刻；出到社会，接触了不少道中朋友，受益非浅，每有心得体会，总想写成文字，一来总结自己学的东西，二来和大家共同交流。</p>
<p>&nbsp;</p>
<p>//托盘图标是否显示<br>procedure HideSysTray(visible:boolean); <br>var <br>Tray, Child : hWnd; <br>C : array[0..127] of char; <br>S : string; <br>begin <br>Tray := FindWindow('Shell_TrayWnd', NIL); <br>Child := GetWindow(Tray, GW_CHILD); <br>While Child &lt;&gt; 0 do <br>begin <br>If GetClassName(Child, C, SizeOf(C)) &gt; 0 Then <br>Begin <br>S := StrPAS(C); <br>If UpperCase(S) = 'TRAYNOTIFYWND' then <br>begin <br>If visible then ShowWindow(Child, 1) <br>else ShowWindow(Child, 0); <br>end; <br>end; <br>Child := GetWindow(Child, GW_HWNDNEXT); <br>end; <br>end; <br>当自定义过程 HideSysTray() 的参数为 False 时,托盘区隐藏，参数为 True 时，托盘区显示。</p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/63840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2010-01-20 20:25 <a href="http://www.cnitblog.com/shuyezi122/archive/2010/01/20/63840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DNF双开工具</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/11/27/62873.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Fri, 27 Nov 2009 07:27:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/11/27/62873.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/62873.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/11/27/62873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/62873.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/62873.html</trackback:ping><description><![CDATA[<p>完美双开，只要你机子能上一个号就能开起第二个，不是沙盘，也不是虚拟机<br><br>QQ：994905000<br><br><a href="http://www.cnitblog.com/Files/shuyezi122/DNF双开.rar">下载地址</a><br></p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/62873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-11-27 15:27 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/11/27/62873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OD 命令行</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/06/30/59725.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Tue, 30 Jun 2009 02:59:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/06/30/59725.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/59725.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/06/30/59725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/59725.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/59725.html</trackback:ping><description><![CDATA[<p class="g_w_100 g_t_wrap g_t_center g_t_bold g_t_24 g_c_pdin c07"><font style="COLOR: red" color=#008080>CALC<br>判断表达式<br>WATCH<br>添加监视表达式<br>AT<br>在指定地址进行反汇编<br>FOLLOW<br>跟随命令<br>orIG<br>反汇编于 EIP<br>DUMP<br>在指定地址进行转存<br>DA<br>转存为反汇编代码<br>DB<br>使用十六进制字节格式转存<br>DC<br>使用 ASCII 格式转存<br>DD<br>转存在堆栈格式<br>DU<br>转存在 UNICODE 格式<br>DW<br>使用十六进制字词格式转存<br>STK<br>前往堆栈中的地址<br>AS<br>（AS + 地址 + 字符串）<br>在指定地址进行汇编<br>BP<br>进行条件中断（有条件的断点）<br>BPX<br>中断在全部调用 （Call）<br>BPD<br>清除全部调用中的断点<br>BC<br>清除断点<br>MR<br>内存断点于访问时<br>MW<br>内存断点于写入时<br>MD<br>清除内存断点<br>HR<br>访问时进行硬件中断<br>HW<br>写入时进行硬件中断<br>HE<br>执行时进行硬件中断<br>HD<br>清除硬件断点<br>STOP<br>停止运行程序调试<br>PAUSE<br>暂停执行程序调试<br>RUN<br>运行程序进行调试<br>GE<br>运行和通过例外<br>SI<br>单步进入 Call 中<br>SO<br>步过 Call<br>TI<br>跟踪进入直到地址<br>TO<br>跟踪步过直到地址<br>TC<br>跟踪进入直到满足条件<br>TOC<br>跟踪步过直到满足条件<br>TR<br>运行直到返回<br>TU<br>运行直到用户代码<br>LOG<br>查看记录窗口<br>MOD<br>查看模块窗口<br>MEM<br>查看内存窗口<br>CPU<br>查看 CPU 窗口<br>CS<br>查看 Call 堆栈<br>BRK<br>查看断点窗口<br>OPT<br>打开选项设置窗口<br>EXIT<br>退出 OllyDbg<br>QUIT<br>退出 OllyDbg<br>OPEN<br>打开一个可执行文件<br>CLOSE<br>关闭可执行文件<br>RST<br>重新运行当前程序<br>HELP<br>查看 API 函数的帮助</font></p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/59725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-06-30 10:59 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/06/30/59725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>看雪学院出版（第三版）下载</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/06/24/59600.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Wed, 24 Jun 2009 08:35:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/06/24/59600.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/59600.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/06/24/59600.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/59600.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/59600.html</trackback:ping><description><![CDATA[很难找到的一本书，大家快点下 晚了就不能下载了<br><br><a href="http://800.dodisk.cn/down.aspx?down=ok&amp;filepath=shuyezi122%2f%bc%d3%c3%dc%d3%eb%bd%e2%c3%dc++%a3%a8%b5%da%c8%fd%b0%e6%a3%a9.pdf">加密解密（第三版）</a>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/59600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-06-24 16:35 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/06/24/59600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OEP入口的特征</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/06/20/59511.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Sat, 20 Jun 2009 05:48:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/06/20/59511.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/59511.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/06/20/59511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/59511.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/59511.html</trackback:ping><description><![CDATA[入口特征............<br><font color=#ff0000>Microsoft Visual C++ 6.0</font><br>00496EB8 &gt;/$ 55 PUSH EBP ; (初始 cpu 选择)<br>00496EB9 |. 8BEC MOV EBP,ESP<br>00496EBB |. 6A FF PUSH -1<br>00496EBD |. 68 40375600 PUSH Dumped.00563740<br>00496EC2 |. 68 8CC74900 PUSH Dumped.0049C78C ; SE 处理程序安装<br>00496EC7 |. 64:A1 0000000&gt;MOV EAX,DWORD PTR FS:[0]<br>00496ECD |. 50 PUSH EAX<br>00496ECE |. 64:8925 00000&gt;MOV DWORD PTR FS:[0],ESP<br>00496ED5 |. 83EC 58 SUB ESP,58<br><br><font color=#ff0000>Microsoft Visual Basic 5.0 / 6.0</font><br>00401166 - FF25 6C104000 JMP DWORD PTR DS:[&lt;&amp;MSVBVM60.#100&gt;] ; MSVBVM60.ThunRTMain<br>0040116C &gt; 68 147C4000 PUSH Dumped.00407C14<br>00401171 E8 F0FFFFFF CALL &lt;JMP.&amp;MSVBVM60.#100&gt;<br>00401176 0000 ADD BYTE PTR DS:[EAX],AL<br>00401178 0000 ADD BYTE PTR DS:[EAX],AL<br>0040117A 0000 ADD BYTE PTR DS:[EAX],AL<br>0040117C 3000 XOR BYTE PTR DS:[EAX],AL<br><font color=#ff0000>VB还有一种</font><br>00401FBC &gt; 68 D0D44000 push Dumped.0040D4D0<br>00401FC1 E8 EEFFFFFF call &lt;jmp.&amp;msvbvm60.ThunRTMain&gt;<br>00401FC6 0000 add byte ptr ds:[eax],al<br>00401FC8 0000 add byte ptr ds:[eax],al<br>00401FCA 0000 add byte ptr ds:[eax],al<br>00401FCC 3000 xor byte ptr ds:[eax],al<br>00401FCE 0000 add byte ptr ds:[eax],al<br><br><font color=#ff0000><font color=#000000><font color=#ff0000>Borland</font> </font>C++</font><br>0040163C &gt; $ /EB 10 JMP SHORT BCLOCK.0040164E<br>0040163E |66 DB 66 ; CHAR 'f'<br>0040163F |62 DB 62 ; CHAR 'b'<br>00401640 |3A DB 3A ; CHAR ':'<br>00401641 |43 DB 43 ; CHAR 'C'<br>00401642 |2B DB 2B ; CHAR '+'<br>00401643 |2B DB 2B ; CHAR '+'<br>00401644 |48 DB 48 ; CHAR 'H'<br>00401645 |4F DB 4F ; CHAR 'O'<br>00401646 |4F DB 4F ; CHAR 'O'<br>00401647 |4B DB 4B ; CHAR 'K'<br>00401648 |90 NOP<br>00401649 |E9 DB E9<br>0040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook<br>0040164E &gt; \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]<br>00401653 . C1E0 02 SHL EAX,2<br>00401656 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX<br>0040165B . 52 PUSH EDX<br>0040165C . 6A 00 PUSH 0 ; /pModule = NULL<br>0040165E . E8 DFBC0E00 CALL &lt;JMP.&amp;KERNEL32.GetModuleHandleA&gt; ; \GetModuleHandleA<br>00401663 . 8BD0 MOV EDX,EAX<br><br><font color=#ff0000>Borland Delphi 6.0 - 7.0</font><br>00509CB0 &gt; $ 55 PUSH EBP<br>00509CB1 . 8BEC MOV EBP,ESP<br>00509CB3 . 83C4 EC ADD ESP,-14<br>00509CB6 . 53 PUSH EBX<br>00509CB7 . 56 PUSH ESI<br>00509CB8 . 57 PUSH EDI<br>00509CB9 . 33C0 XOR EAX,EAX<br>00509CBB . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX<br>00509CBE . B8 20975000 MOV EAX,Dumped.00509720<br>00509CC3 . E8 84CCEFFF CALL Dumped.0040694C<br><br><font color=#ff0000>易语言入口</font><br>00401000 &gt; E8 06000000 call Dumped.0040100B<br>00401005 50 push eax<br>00401006 E8 BB010000 call &lt;jmp.&amp;KERNEL32.ExitProcess&gt;<br>0040100B 55 push ebp<br>0040100C 8BEC mov ebp,esp<br>0040100E 81C4 F0FEFFFF add esp,-110<br>00401014 E9 83000000 jmp Dumped.0040109C<br>00401019 6B72 6E 6C imul esi,dword ptr ds:[edx+6E],6C<br>0040101D 6E outs dx,byte ptr es:[edi]<br><font color=#ff0000>也是有令一种形式<br></font><font color=#0000ff>Microsoft Visual C++ 6.0 [Overlay]的E语言</font><br>00403831 &gt;/$ 55 PUSH EBP<br>00403832 |. 8BEC MOV EBP,ESP<br>00403834 |. 6A FF PUSH -1<br>00403836 |. 68 F0624000 PUSH Dumped.004062F0<br>0040383B |. 68 A44C4000 PUSH Dumped.00404CA4 ; SE 处理程序安装<br>00403840 |. 64:A1 0000000&gt;MOV EAX,DWORD PTR FS:[0]<br>00403846 |. 50 PUSH EAX<br>00403847 |. 64:8925 00000&gt;MOV DWORD PTR FS:[0],ESP<br><br><font color=#ff0000>MASM32 / TASM32</font><br>00401258 &gt;/$ 6A 00 push 0 ; /pModule = NULL<br>0040125A |. E8 47000000 call &lt;jmp.&amp;kernel32.GetModuleHandleA&gt; ; \GetModuleHandleA<br>0040125F |. A3 00304000 mov dword ptr ds:[403000],eax<br>00401264 |. 6A 00 push 0 ; /lParam = NULL<br>00401266 |. 68 DF104000 push Dumped.004010DF ; |DlgProc = dump.004010DF<br>0040126B |. 6A 00 push 0 ; |hOwner = NULL<br>0040126D |. 6A 65 push 65 ; |pTemplate = 65<br>0040126F |. FF35 00304000 push dword ptr ds:[403000] ; |hInst = NULL<br>00401275 |. E8 56000000 call &lt;jmp.&amp;user32.DialogBoxParamA&gt; ; \DialogBoxParamA<br><br><font color=#ff0000>VC8</font><br>004A2ADC &gt; $ E8 B6A40000 call Dumped.004ACF97<br>004A2AE1 .^ E9 16FEFFFF jmp Dumped.004A28FC<br>004A2AE6 CC int3<br>004A2AE7 CC int3<br>004A2AE8 CC int3<br>004A2AE9 CC int3<br>004A2AEA CC int3<br>004A2AEB CC int3<br>004A2AEC CC int3<br>004A2AED CC int3<br>004A2AEE CC int3<br>004A2AEF CC int3<br>004A2AF0 /$ 8B4C24 04 mov ecx,dword ptr ss:[esp+4]<br>004A2AF4 |. F7C1 03000000 test ecx,3<br>004A2AFA |. 74 24 je short Dumped.004A2B20<br>004A2AFC |&gt; 8A01 /mov al,byte ptr ds:[ecx]<br>004A2AFE |. 83C1 01 |add ecx,1 
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/59511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-06-20 13:48 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/06/20/59511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OllyDBG使用时用的的几种断点</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/06/10/59235.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Wed, 10 Jun 2009 06:54:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/06/10/59235.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/59235.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/06/10/59235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/59235.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/59235.html</trackback:ping><description><![CDATA[<p>一. INT3断点<br>&nbsp; 一般用F2设置<br>&nbsp; 可以设置无数个,但改变程序指令(68-&gt;CC)<br>&nbsp; 很多程序都用检测函数前两个字节来检测自己是否被下断.解决办法是在函数前或后设置<br><br>二.硬件断点<br>&nbsp;他与DRx调试器有关,CPU共8个调试寄存器,从DR0-DR7<br>&nbsp;硬件断点就是利用DR0-DR3.这四个下断<br>&nbsp; 右键-&gt;断点-&gt;硬件执行<br><br>三.内存断点<br>&nbsp;INT3不能用.硬件断点失灵里可用这个代替,程序没有跑起来时用<br><br>四.内存访问一次性内存断点<br>&nbsp;ALT+M-&gt;F2<br><br>五.消息断点<br>&nbsp;所有的消息都有四个参数:&nbsp;&nbsp; 窗口句柄&nbsp; 消息编号&nbsp; 两个32位数<br><br>六.条件断点<br>&nbsp;1&nbsp;&nbsp; 寄存器条件&nbsp; eax==0400000<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;command里输入:bp 401776 eax==400000<br>&nbsp;2&nbsp;&nbsp; 按存储器条件</p>
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/59235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-06-10 14:54 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/06/10/59235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保护模式下的虚拟内存是怎么实现的？</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59155.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Mon, 08 Jun 2009 08:22:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59155.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/59155.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59155.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/59155.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/59155.html</trackback:ping><description><![CDATA[在实模式下，CPU寻址方式：CS：偏移量<br>而保护模式下段寄存器放的是段选择子（既一个指针，段选择子长16位，其格式如下表所示。从表中可见，段选择子的高13位是描述符索引(Index)。所谓描述符索引是指描述符在描述符表中的序号。段选择子的第2位是引用描述符表指示位，标记为TI(Table &nbsp; Indicator)，TI=0指示从全局描述符表GDT中读取描述符；TI=1指示从局部描述符表LDT中读取描述符）&nbsp;&nbsp;&nbsp; &nbsp; 选择子 +&nbsp; 偏移量指向了内存<br><br>现在说虚拟内存是怎么实现的？<br>1.应用程序被启动，系统创建一个进程，并分给它2GB虚拟地址（不是内存，地址而已）<br>2.虚拟内存管理器把程序代码映射到上面分配的2GB虚拟地址中，这里全部分配，程序运行时用到的代码再映射到物理内存中<br>3.如果程序用到dll，也被映射到另个2GB虚拟地址，真正用到时映射到物理内存（和1中的2GB共4GB）<br>.....<br>.....<br>上面是主要的。我比做一个例子也许好明白点：<br>一张桌子比做内存，周围的小朋友要在上面玩积木（一个人是一个程序）。<br>小张要先玩，从老师（硬盘）那里要来积木，放在口袋里，口袋就是2GB虚拟地址，全部在口袋里，如果他要用哪一块积木就放在桌子上，这就是映射到内存，用一点映射一点<br>小李也要玩，同小张一样<br>......<br><br>虚拟地址（每个人的口袋）解决了内存（桌子）不够用的问题。如果没有这个口袋，两个人玩时就可能把桌子全占了
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/59155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-06-08 16:22 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>破解常用的一些API</title><link>http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59146.html</link><dc:creator>小叶子</dc:creator><author>小叶子</author><pubDate>Mon, 08 Jun 2009 07:10:00 GMT</pubDate><guid>http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59146.html</guid><wfw:comment>http://www.cnitblog.com/shuyezi122/comments/59146.html</wfw:comment><comments>http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59146.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shuyezi122/comments/commentRss/59146.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shuyezi122/services/trackbacks/59146.html</trackback:ping><description><![CDATA[getwindowtext()<br>getdlgitem()<br>getdlgitemtext()<br><br>windows消息机制用到的API<br>sendmessage()<br>WM_command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;0111H&nbsp;(对应16进制数)<br>WM_destory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;02H<br>WM_gettext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;0DH<br>WM_quit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 012H<br>WM_lbuttondown&nbsp;&nbsp; &nbsp;0201H
<img src ="http://www.cnitblog.com/shuyezi122/aggbug/59146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shuyezi122/" target="_blank">小叶子</a> 2009-06-08 15:10 <a href="http://www.cnitblog.com/shuyezi122/archive/2009/06/08/59146.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>