﻿<?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>C++博客-编程自动化-随笔分类-visual studio</title><link>http://www.cppblog.com/AutomateProgram/category/8930.html</link><description>当音乐和传说在深夜中沉寂后，程序的每个字符还在跳动！</description><language>zh-cn</language><lastBuildDate>Mon, 18 Oct 2010 15:21:48 GMT</lastBuildDate><pubDate>Mon, 18 Oct 2010 15:21:48 GMT</pubDate><ttl>60</ttl><item><title>功能强大的Regsvr32命令</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/14/109700.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 14 Mar 2010 13:23:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/14/109700.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/109700.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/14/109700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/109700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/109700.html</trackback:ping><description><![CDATA[<p style="COLOR: #000000">原文地址：<a href="http://hi.baidu.com/guoguo6688/blog/item/3e4de9164fd3561a962b4341.html">http://hi.baidu.com/guoguo6688/blog/item/3e4de9164fd3561a962b4341.html</a><font color=#00ff00 size=3 face=黑体><br>一个网友的提问，提醒有必要对WingdowsXP的&#8220;Regsvr32&#8221;命令作一简要介绍——</font></p>
<div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FLOAT: right; COLOR: #000000; CLEAR: both; PADDING-TOP: 0px"></div>
<p style="COLOR: #000000"><font color=#00ff00 size=3 face=宋体>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#ffff00>&#8220;Regsvr32.exe&#8221;命令是用来对&#8220;ActiveX控件&#8221;进行注册的。</font></font></p>
<p style="COLOR: #000000"><font size=3 face=宋体><font color=#ff0000 face=黑体>Regsvr32命令格式<br></font><font color=#00ff00>/u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 卸载ActiveX控件<br>/s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注册成功后不显示操作成功信息框<br>/c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 控制台输出<br>/I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用DllInstall安装函数并将可选的参数[cmdline]传给它，当使用 /u时调用卸载函数</font></font></p>
<p style="COLOR: #000000"><font size=3 face=宋体><font color=#ff0000 face=黑体>Regsvr32主要功能</font>&nbsp;&nbsp;<br><br><font color=#ffff00>A、修复 IE 浏览器</font><font color=#ffff00><br></font>&nbsp;&nbsp;&nbsp;&nbsp;<font color=#00ff00>如果发现IE不能打开新的窗口，用&#8221;鼠标左键&#8220;点击超链接没有任何反应，用鼠标右键点击超链接，在弹出的菜单中选择&#8220;在新窗口打开&#8221;也没有任何反应——<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、单击&#8220;开始--&gt;运行&#8221;，在&#8220;运行&#8221;窗口中，输入&#8220;regsvr32 actxprxy.dll&#8221;，然后&#8220;确定&#8221;，接着会出现一个信息对话框&#8220;DllRegisterServer in actxprxy.dll succeeded&#8221;，再次点击&#8220;确定&#8221;；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、再次打开&#8220;运行&#8221;窗口，输入&#8220;regsvr32 shdocvw.dll&#8221;，单击&#8220;确定&#8221;；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、重新启动Windows系统，运行IE，就会发现——OK了。<br><br></font><font color=#ffff00>B、卸载无用&#8220;鸡肋&#8221;<br></font>&nbsp;&nbsp;&nbsp;&nbsp;<font color=#00ff00>Windows XP自带ZIP功能，占用了很多系统资源，其功能还不如第三方解压缩软件。如要卸载它——<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击&#8220;开始&#8594;运行&#8221;，在运行对话框中输入&#8220;regsvr32 /u zipfldr.dll&#8221;，单击&#8220;确定&#8221;后，弹出卸载成功信息框，就完成卸载ZIP功能。恢复ZIP功能，输入&#8220;regsvr32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipfldr.dll&#8221;即可。<br></font><br><font color=#ffff00>C、防范脚本病毒</font></font></p>
<p style="COLOR: #000000"></p>
<p style="COLOR: #000000"><font color=#00ff00>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size=3 face=宋体>当前嵌在网页中的脚本病毒很是厉害。很多脚本病毒的复制、传播都离不开&#8220;FSO对象（File System Object）&#8221;，因此禁用&#8220;File System Object&#8221;就能有效地控制脚本病毒的传播。方法——<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单击&#8220;开始--&gt;运行&#8221;，在&#8220;运行&#8221;窗口中，输入&#8221;regsvr32 /u scrrun.dll"，就可以禁用FSO对象。需要使用FSO对象时，输入&#8220;regsvr32 scrrun.dll &#8221;即可。</font></font><font size=3 face=宋体> </font></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/109700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-14 21:23 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/14/109700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DLLs</title><link>http://www.cppblog.com/AutomateProgram/archive/2010/03/04/108884.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 04 Mar 2010 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2010/03/04/108884.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/108884.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2010/03/04/108884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/108884.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/108884.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://www.vckbase.com/document/viewdoc/?id=1667">http://www.vckbase.com/document/viewdoc/?id=1667</a></p>
我正在学习DLLs，谈不上对其有什么高屋建瓴的见解;本文只是（通过）编码让你看到并想知道代码是如何运行的。在本文中，我假定你知道如何使用你的编译器特性，比如设置目录路径等等。
<p>为了建立项目，请选择Win32 控制台项目（Win32 Console Application），并且在应用程序设置标签（the advanced tab）上，选择DLL和空项目选项。DLLs可能并不如你想像的那样难。首先写你的头文件（header file）；称为DLLTutorial.h。这个文件与其它头文件一样，其中只是一些函数的原型。<br></p>
<pre>#ifndef _DLL_TUTORIAL_H_<br>#define _DLL_TUTORIAL_H_<br>#include &lt;iostream&gt;
#if defined DLL_EXPORT<br>#define DECLDIR __declspec(dllexport)<br>#else<br>#define DECLDIR __declspec(dllimport)<br>#endif
<p>&nbsp;</p>
extern "C"<br>{<br>        DECLDIR int Add( int a, int b );<br>        DECLDIR void Function( void );<br>}<br>#endif<br>
</pre>
<p>前面两行指示编译器只包含这个文件一次。extern "C"告诉编译器该部分可以在C/C++中使用。</p>
<p>在VC++中这里有两个方法来导出函数：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 1、使用__declspec，一个Microsoft定义的关键字。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2、创建一个模块定义文件(Module-Definition File即.DEF)。第一种方法稍稍比第二种方法简单些，但两种都工作得很好。</p>
<p>__declspec(dllexport)导出函数符号到在你的DLL中的一个存储类。当下面一行被定义时我定义DECLDIR来运行这个函数，<br><br></p>
<pre>#define DLL_EXPORT<br></pre>
同时也导入函数如果下面一行 <br>
<pre>#define DLL_EXPORT</pre>
<p>没有在源文件中出现。在此情况下，你将导出函数Add（int a, int b)和Function()。</p>
<p>现在，你需要写一个将要称为DLLTutorial.cpp的源文件。<br></p>
<pre>#include &lt;iostream&gt;<br>#include "DLL_Tutorial.h"
<p>&nbsp;</p>
#define DLL_EXPORT
extern "C"<br>{<br>        DECLDIR int Add( int a, int b )<br>        {<br>        return( a + b );<br>        }
DECLDIR void Function( void )<br>        {<br>        std::cout &lt;&lt; "DLL Called!" &lt;&lt; std::endl;<br>        }
}<br>
</pre>
这里你定义了（DLL中的）所有函数。Int Add(int a, int b)只简单地将两个数相加而void Function(void)只是在你的DLL被调用时（将信息）通知你。在我像你展示如何使用DLL前，我想告诉你一些关于模块定义文件（.def）的内容。
<p><strong>模块定义文件（.def）</strong></p>
<p>模块定义文件是一个有着.def文件扩展名的文本文件。它被用于导出一个DLL的函数，和__declspec(dllexport)很相似，但是.def文件并不是Microsoft定义的。一个.def文件中只有两个必需的部分：LIBRARY 和 EXPORTS。让我们先看一个基本的.def文件稍后我将解析之。<br></p>
<pre>LIBRARY dll_tutorial<br>DESCRIPTION "our simple DLL"<br>EXPORTS<br>        Add @1<br>        Function @2
</pre>
<p>第一行，''LIBRARY''是一个必需的部分。它告诉链接器（linker）如何命名你的DLL。下面被标识为''DESCRIPTION''的部分并不是必需的，但是我喜欢把它放进去。该语句将字符串写入 .rdata 节[据 MSDN]，它告诉人们谁可能使用这个DLL，这个DLL做什么或它为了什么（存在）。再下面的部分标识为''EXPORTS''是另一个必需的部分；这个部分使得该函数可以被其它应用程序访问到并且它创建一个导入库。当你生成这个项目时，不仅是一个.dll文件被创建，而且一个文件扩展名为.lib的导出库也被创建了。除了前面的部分以外，这里还有其它四个部分标识为：NAME, STACKSIZE, SECTIONS, 和 VERSION。我将不再在本文中涉及这些内容，但是如果你在Internet上搜索，我想你将找到一些东西（译注： MSDN2003上对模板定义文件各部分内容有详尽解释，请参阅）。另外，一个分号(;)开始一个注解，如同''//''在C++中一样。</p>
<p>现在你已经创建了你的DLL，你需要学习如何在一个应用程序中使用它了。当这个DLL被生成后，它创建了一个.dll文件和一个.lib文件；这两个都是你需要的。</p>
<p><strong>隐式链接</strong></p>
<p>这里有两个方法来载入一个DLL；一个方法是捷径另一个则相比要复杂些。捷径是只链接到你.lib 文件并将.dll文件置入你的新项目的路径中去。因此，创建一个新的空的Win32控制台项目并添加一个源文件。将你做的DLL放入你的新项目相同的目录下。</p>
<p>&nbsp;</p>
<pre>#include &lt;iostream&gt;<br>#include &lt;DLLTutorial.h&gt;
<p>&nbsp;</p>
int main()<br>{<br>        Function();<br>        std::cout &lt;&lt; Add(32, 58) &lt;&lt; "\n";<br>        return(1);<br>}<br></pre>
<p>你必需要链接到DLLTutorial.lib文件。我在项目属性中设置了，但是你可能会用下面的语句代替：</p>
<pre>#pragma comment(lib, "DLLTutorial.lib") </pre>
<p><br>请注意我让编译器来查看我的DLL文件夹已获得.lib文件同时让它顺便看下该目录中的DLL头文件。如果你不想这么做，你可以总是把他们放入你的新项目的目录中并使用""（引号）而不是&lt;&gt;。这就是载入一个DLL的简单方法。</p>
<p><strong>显示链接 </strong></p>
<p>难点的加载DLL的方法是有稍微有点复杂的。你将需要函数指针和一些Windows函数。但是，通过这种载入DLLs的方法，你不需要DLL的.lib或头文件，而只需要DLL。下面列出一些代码，我稍后将解析之。</p>
<pre>#include &lt;iostream&gt;<br>#include &lt;windows.h&gt;
<p>&nbsp;</p>
<p>typedef int (*AddFunc)(int,int);<br>typedef void (*FunctionFunc)();</p>
<p>int main()<br>{<br>        AddFunc _AddFunc;<br>        FunctionFunc _FunctionFunc;<br>        HINSTANCE hInstLibrary = LoadLibrary("DLL_Tutorial.dll");
if (hInstLibrary == NULL)<br>        {<br>        FreeLibrary(hInstLibrary);<br>        }</p>
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");<br>
_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
if ((_AddFunc == NULL) || (_FunctionFunc == NULL))<br>        {<br>        FreeLibrary(hInstLibrary);<br>        }
std::cout &lt;&lt; _AddFunc(23, 43) &lt;&lt; std::endl;<br>        _FunctionFunc();
std::cin.get();
FreeLibrary(hInstLibrary);
return(1);<br> }<br>
</pre>
<p>首先你会注意到：这里包括进了文件&#8220;windows.h&#8221;同时移走了&#8220;DLL_Tutorial.h&#8221;。原因很简单：因为windows.h包含了一些Windows函数，当然你现在将只需要其中几个而已。它也包含了一些将会用到的Windows特定变量。你可以去掉DLL的头文件（DLL_Tutorial.h）因为－如我前面所说－当你使用这个方法载入DLL时你并不需要它。</p>
<p>下面你会看到：以下面形式的一小块古灵精怪的代码:</p>
<pre>typedef int (*AddFunc)(int,int);<br>
typedef void (*FunctionFunc)();<br>
</pre>
<p>这是函数指针。因为这是一个关于DLL的自学指南，深入探究函数指针超出了本指南的范围；因此，现在我们只把它们当作DLL包含的函数的别名。我喜欢在尾部用&#8220;Func&#8221;命名之。(int,int)部分是这个函数的参数部分，比如，Add函数要获得两个整数；因此，你需要它们（译注：指(int,int)部分）作为函数指针的参数。Function函数没有参数，因此你让它为空。main()部分中的前面两行是声明函数指针以使得你可以认为它们等同于DLL内部的函数。我只是喜欢预先定义它们。</p>
<p>一个HINSTANCE是一个Windows数据类型：是一个实例的句柄；在此情况下，这个实例将是这个DLL。你可以通过使用函数LoadLibrary()获得DLL的实例，它获得一个名称作为参数。在调用LoadLibrary函数后，你必需查看一下函数返回是否成功。你可以通过检查HINSTANCE是否等于NULL（在Windows.h中定义为0或Windows.h包含的一个头文件）来查看其是否成功。如果其等于NULL，该句柄将是无效的，并且你必需释放这个库。换句话说，你必需释放DLL获得的内存。如果函数返回成功，你的HINSTANCE就包含了指向DLL的句柄。</p>
<p>一旦你获得了指向DLL的句柄，你现在可以从DLL中重新获得函数。为了这样作，你必须使用函数GetProcAddress()，它将DLL的句柄（你可以使用HINSTANCE）和函数的名称作为参数。你可以让函数指针获得由GetProcAddress()返回的值，同时你必需将GetProcAddress()转换为那个函数定义的函数指针。举个例子，对于Add()函数，你必需将GetProcAddress()转换为AddFunc；这就是它知道参数及返回值的原因。现在，最好先确定函数指针是否等于NULL以及它们拥有DLL的函数。这只是一个简单的if语句；如果其中一个等于NULL，你必需如前所述释放库。</p>
<p>一旦函数指针拥有DLL的函数，你现在就可以使用它们了，但是这里有一个需要注意的地方：你不能使用函数的实际名称；你必需使用函数指针来调用它们。在那以后，所有你需要做的是释放库如此而已。</p>
<p>现在你知道了DLL的一些基本知识。你知道如何创建它们，你也知道如何用两种不同的方法链接它们。这里仍然有更多的东西需要我们学习，但我把它们留给你们自己探索了和更棒的作者来写了。</p>
<p><br><br>例子：<br>建立一个空的dll工程：<br>新建.h文件<br>#ifdef DLL1_API<br>#else<br>#define DLL1_API&nbsp; _declspec(dllimport)<br>#endif</p>
<p>extern "C" DLL1_API int add(int a, int b);<br>extern "C" DLL1_API int subtract(int a, int b);</p>
<p>class DLL1_API Point<br>{<br>public:<br>&nbsp;void outPoint(int x, int y);<br>};<br><br>新建.cpp文件<br>#define DLL1_API&nbsp; _declspec(dllexport)<br>#include "Dll1.h"</p>
<p>#include &lt;Windows.h&gt;<br>#include &lt;stdio.h&gt;</p>
<p>int add(int a, int b)<br>{<br>&nbsp;return a + b;<br>}</p>
<p>int subtract(int a, int b)<br>{<br>&nbsp;return a - b;<br>}</p>
<p>void Point::outPoint(int x, int y)<br>{<br>&nbsp;HWND hwnd=GetForegroundWindow();<br>&nbsp;HDC hdc=GetDC(hwnd);<br>&nbsp;TCHAR buf[20];<br>&nbsp;memset(buf,0,20);<br>&nbsp;wsprintf(buf,L"x=%d,y=%d",x,y);<br>&nbsp;TextOut(hdc,0,0,buf,wcslen(buf));<br>&nbsp;ReleaseDC(hwnd,hdc);<br>}<br><br>编译工程，把生成的dll，和.lib放到应用的工程下。<br>#include "Dll1.h"<br>#pragma comment(lib, "TestDll.lib")<br>应用工程和导入工程。</p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/108884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2010-03-04 14:07 <a href="http://www.cppblog.com/AutomateProgram/archive/2010/03/04/108884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SendMessage函数完全使用手册（转）</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/30/68211.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sun, 30 Nov 2008 03:22:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/30/68211.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/68211.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/30/68211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/68211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/68211.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: source:http://blog.itpub.net/post/4630/412209&nbsp;&nbsp;&nbsp; 首先 我们了解一下Windows的消息机制。Windows是一个消息驱动式系统，Windows消息提供应用程序与应用程序之间，应用程序与Windows系统之间进行通信的手段。举个例子，打开记事本程序，该程序有一个 &#8220;文件&#8220;菜单。 那么，在运行该...&nbsp;&nbsp;<a href='http://www.cppblog.com/AutomateProgram/archive/2008/11/30/68211.html'>阅读全文</a><img src ="http://www.cppblog.com/AutomateProgram/aggbug/68211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-30 11:22 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/30/68211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的外挂制作(转)</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68106.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 28 Nov 2008 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68106.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/68106.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/68106.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/68106.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://www.vckbase.com/document/viewdoc/?id=1832">http://www.vckbase.com/document/viewdoc/?id=1832</a><br></p>
<p>关键字：外挂，连连看</p>
<p><strong>引言：</strong></p>
<p>　　最近在朋友那搞了个连连看游戏来玩玩，觉得还不错，不过就是玩不过人家， 记得以前在一本书上看到过连连看外挂的做法，还比较简单，自己还没忘，于是下定决心， 自己做一个，然后&#8230;&#8230;。哈哈，看谁还打得过我。<br>　　好了，现在说下外挂的具体思路（我假设大家都知道连连看游戏的规则）。 这个外挂无非就是要电脑来帮我门找到相同的图片并看他们是否连通。这里有两个问题，一个 就是怎么让电脑区别不同的图片呢？这里有个简单的办法，就是在每个图片中取5个点，然后 将这5个点的像素值相加做为这种图片的ID，这样一般不会出现重复的ID，如下图所示例：</p>
<p><img src="http://www.vckbase.com/document/journal/vckbase53/images/myDraftimg1.gif"></p>
<p>　　这样第一个问题就解决了，第二个问题就是怎么判断它们是否连通，这个您研究下代码就OK拉。 好了现在我们假设第二个问题已经解决了，那么，我们只需要往连连看游戏的窗口的两个相同且连通的图片的地方发送两个鼠标单击的消息 就OK了或者在他们上面画两个圈提示以下。下面是程序运行是的样子：</p>
<p><img src="http://www.vckbase.com/document/journal/vckbase53/images/myDraftimg2.gif"></p>
<p>看到没，两个相同的图片被外挂程序标记了颜色。或者你可以直接点击&#8220;自动消除&#8221;来自动消除两 个图片。</p>
<p><strong>编程实现：</strong></p>
<p>　　这里有个难点，就是该连连看的游戏的背景不是单色的，是一幅图片，那我们怎么区分 到底是背景还是前景的图片呢？我这里采用了个笨办法，就是用调试的办法去跟踪，把每个区域的 背景也生成了它们的ID，到时比较一下就是了。这里就是我跟踪得到的数据，我把它门写到了数组里 到时候用就是了。相关代码如下：<br></p>
<pre>	//这里边放的是背景的ID
int BackGround[]={83886075,83886060,59434490,82188285,83820266,65305594,83754472,
79584810,82141361,71323293,79582750,79584250,75889042,83818977,62589434,
83175162,83332551,83553749,83818467,73624378,81705626,82759346,82496174,
82100272,81070586,81468437,83754215,83885803,77729230,73148330,78524918,
77217286,83754215,68069635,83597193,80299161,81172078,83027654,83503432,
83686365,65042170,59778810,62410490,83356632,67567649,83523625,81967762,
74584570,83885803,78520804,79577810,83027658,83818467,82220538,61620986,
83820266,83687393,83555050,83818222,83886072};
m_pBackGround=new int[BK_COUNT];
for(int i=0;i&lt; BK_COUNT;i++)
{
m_pBackGround[i]=BackGround[i];
}			</pre>
下面的函数就是根据图片的行号和列号来生成图片的ID，如果是背景图片则返回一个标志。<br>
<pre>//************该函数根据由x、y指定的行列返回该位置的方块的ID号
//如果是背景则返回 BACKGROUND
int CLLK_CheatDlg::GetRectData(int x, int y)
{
CPoint ptPos[5];	//五个像素点
COLORREF colorData[5];
int nRetVal=0;
int basicX,basicY;		//该方块左上角的坐标
basicX=x*BLOCK_WIDTH;
basicY=y*BLOCK_HEIGHT;
//取该方块的5个点判断
ptPos[0].x=basicX+BLOCK_WIDTH/2;    //中间点
ptPos[0].y=basicY+BLOCK_HEIGHT/2;
ptPos[1].x=ptPos[0].x;              //上边
ptPos[1].y=ptPos[0].y-5;
ptPos[2].x=ptPos[0].x;
ptPos[2].y=ptPos[0].y+5;            //下边
ptPos[3].x=ptPos[0].x-5;
ptPos[3].y=ptPos[0].y;              //左边
ptPos[4].x=ptPos[0].x+5;            //右边
ptPos[4].y=ptPos[0].y;
for(int i=0;i&lt; 5;i++)
{
colorData[i] = GetPixel(m_MemDC.m_hDC,ptPos[i].x,ptPos[i].y);
}
for(i=0;i&lt; 5;i++)
{
nRetVal+=colorData[i];
}
for(i=0;i&lt; BK_COUNT;i++)
{
if(nRetVal==m_pBackGround[i])
return BACKGROUND;
}
return nRetVal;
}			</pre>
接下来是判断两个图片是否连通，代码如下：<br>
<pre>BOOL CLLK_CheatDlg::IsLink(int x1, int y1, int x2, int y2)
{
//X直连方式
if(x1==x2)
{
if(X1_Link_X2(x1,y1,y2))
return TRUE;
}
//Y直连方式
else if(y1==y2)
{
if(Y1_Link_Y2(x1,x2,y1))
return TRUE;
}
//一个转弯直角的联通方式
if(OneCornerLink(x1,y1,x2,y2))
{
return TRUE;
}
//两个转弯直角的联通方式
else if(TwoCornerLink(x1,y1,x2,y2))
{
return TRUE;
}
return FALSE;
}</pre>
　　这下主要的工作已做的差不多了，接下来就是挨个查找相同的图片，并判断它们是否连通的，如果是则提示或者 直接消除。这样一个简单的外挂就做成了，是不是不敢相信？
<p>其他的代码请查看源文件。<br><br><strong>结束语</strong></p>
<p>　　这个程序还有点小BUG，就是有时会查不到可以消除的图片，有可能就是获取背景图片的ID时没有获取 到准确的值导致程序发送的消息得不到效果。如果大家有好的办法可以自己去完善一下。 </p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/68106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-28 22:02 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决mfc42ud.lib和LIBCD.lib(crt0.obj)的问题(转)</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68105.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 28 Nov 2008 14:01:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68105.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/68105.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/68105.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/68105.html</trackback:ping><description><![CDATA[原文地址：<a href="http://blog.csdn.net/ralix/archive/2008/03/26/2221116.aspx">http://blog.csdn.net/ralix/archive/2008/03/26/2221116.aspx</a><br><br>
<div class=cnt id=blog_text>
<p>VC时遇到的问题，收集整理如下：<br><br>问题一：<br>LINK : fatal error LNK1104: cannot open file "mfc42ud.lib"<br>缺少支持Unicode的文件；MFC安装的时候，默认是不安装支持Unicode的相关文件的在vc 的安装盘上有，在vc98\MFC\Lib\下, 还需要dll，在vc98\Debug下。我把这些库打了个包，上传了。<br><br>下载地址：<a href="http://coosign.bokee.com/inc/MFC42UD.jpg"><u><font color=#800080>http://coosign.bokee.com/inc/MFC42UD.jpg</font></u></a><br>把.jpg改为.rar解压。把lib放到vc的mfc\lib下，dll放到windows\system32下。</p>
<p>问题二：<br>LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main2006-11-06 11:00引：我猜你是直接打开（或编辑）了一个Winmain程序就Build。VC++此时假定你要建立Console程序而不是GUI程序，而Console程序的Startup&nbsp;&nbsp; Code要载入的是main()而不是Winmain(),导致连接失败。改正的方法是将菜单Project/Settings下Link项Option内的/subsystem:console改为/subsystem:windows。更稳妥的做法是以后先New一个Win32&nbsp;&nbsp; GUI&nbsp;&nbsp; Project，再拷贝入你的程序,再Build。</p>
<p>在纹理合成时碰到过这个错误，用上述方法解决了．&nbsp;</p>
</div>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/68105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-28 22:01 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc资源网站</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68050.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Fri, 28 Nov 2008 00:47:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68050.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/68050.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/68050.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/68050.html</trackback:ping><description><![CDATA[国内： &nbsp; <br>&nbsp; 1.编程先锋 &nbsp; &nbsp; http://wlbookwl.myrice.com &nbsp; &nbsp; <br>&nbsp; 2.Visual &nbsp; C++-MFC开发指南首页 &nbsp; http://www.vchelp.net &nbsp; <br>&nbsp; 3.程序家园 &nbsp; &nbsp; http://www.vcfan.com &nbsp; <br>&nbsp; 4.爱361 &nbsp; &nbsp; http://www.ai361.com &nbsp; &nbsp; <br>&nbsp; 5.vc之路 &nbsp; &nbsp; http://www.vcroad.net &nbsp; &nbsp; <br>&nbsp; 6.vc大本营 &nbsp; &nbsp; http://www.pcvc.net &nbsp; <br>&nbsp; 7.vc知识库 &nbsp; &nbsp; http://www.vckbase.com &nbsp; <br>&nbsp; 8.vc王朝 &nbsp; &nbsp; http://my.szptt.net.cn/vcdynasty &nbsp; <br>&nbsp; 9.编程好望角 &nbsp; &nbsp; http://www.myvc.net &nbsp; <br>&nbsp; 10.VC代码 &nbsp; http://www.vccode.com &nbsp; <br>&nbsp; 国外： &nbsp; <br>&nbsp; 1.www.codeproject.com &nbsp; <br>&nbsp; 2.www.codeguru.com
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/68050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-28 08:47 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/28/68050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无聊的vc++6.0---vc错误提示</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/20/67387.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Thu, 20 Nov 2008 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/20/67387.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/67387.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/20/67387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/67387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/67387.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em">原文：<a href="http://lnkm.2006.blog.163.com/blog/static/31474774200843181419322/">http://lnkm.2006.blog.163.com/blog/static/31474774200843181419322/</a><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一直写程序都不习惯使用类，有几次使用类分离都出现连接错误，苦苦找不到原因，在Baidu海搜还是一无所获，最近做数据结构实验报告又碰到这个错误，搜了很久，并配合课本的例子，终于找到了错误的原因。 </p>
<p style="TEXT-INDENT: 2em">1、当类模板的定义及实现分离（即写在不同文件中）时，在其他文件中包含类模板的定义必须包含其类实现文件（即.cpp文件），而不能包含类定义文件（即.h文件），否则将收到&#8220;error LNK2001&#8221;错误。 </p>
<p style="TEXT-INDENT: 2em">2、若是一般的类（即不是模板类），在其他文件包含则必须包含头文件（即.h文件，类声明文件），而不能包含源文件（即.cpp文件，类实现文件），否则将收到&#8220;error LNK2005&#8221;错误。 </p>
<p style="TEXT-INDENT: 2em"><font color=#3366ff>如：</font> </p>
<p style="TEXT-INDENT: 2em">///test.h文件 </p>
<p style="TEXT-INDENT: 2em">#ifndef HH </p>
<p style="TEXT-INDENT: 2em">#define HH </p>
<p style="TEXT-INDENT: 2em">class CTest </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">public: </p>
<p style="TEXT-INDENT: 2em">CTest(); </p>
<p style="TEXT-INDENT: 2em">~CTest(); </p>
<p style="TEXT-INDENT: 2em">int get(); </p>
<p style="TEXT-INDENT: 2em">void set(int d); </p>
<p style="TEXT-INDENT: 2em">private: </p>
<p style="TEXT-INDENT: 2em">int num; </p>
<p style="TEXT-INDENT: 2em">}; </p>
<p style="TEXT-INDENT: 2em">#endif </p>
<p style="TEXT-INDENT: 2em">///test.cpp文件 </p>
<p style="TEXT-INDENT: 2em">#include"lll.h" </p>
<p style="TEXT-INDENT: 2em">CTest::CTest() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">}; </p>
<p style="TEXT-INDENT: 2em">CTest::~CTest() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">}; </p>
<p style="TEXT-INDENT: 2em">int CTest::get() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">return num; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">void CTest::set(int d) </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">num=d; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">///main文件 </p>
<p style="TEXT-INDENT: 2em">#include"test.cpp"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#ff0000>&nbsp; //这里应该为#include"test.h" </font></p>
<p style="TEXT-INDENT: 2em">#include&lt;iostream&gt; </p>
<p style="TEXT-INDENT: 2em">using namespace std; </p>
<p style="TEXT-INDENT: 2em">int main() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">CTest tt; </p>
<p style="TEXT-INDENT: 2em">int n; </p>
<p style="TEXT-INDENT: 2em">cin&gt;&gt;n; </p>
<p style="TEXT-INDENT: 2em">tt.set(n); </p>
<p style="TEXT-INDENT: 2em">cout&lt;&lt;tt.get()&lt;&lt;endl; </p>
<p style="TEXT-INDENT: 2em">return 0; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">以上程序将收到如下错误： </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2005: "public: __thiscall CTest::CTest(void)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#63;&#48;&#99;&#108;&#108;&#108;&#64;&#64;&#81;&#65;&#69;&#64;&#88;&#90;"><font color=#703f3a>??0clll@@QAE@XZ</font></a><wbr></wbr>) already defined in lll.obj </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2005: "public: __thiscall CTest::~CTest(void)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#63;&#49;&#99;&#108;&#108;&#108;&#64;&#64;&#81;&#65;&#69;&#64;&#88;&#90;"><font color=#703f3a>??1clll@@QAE@XZ</font></a><wbr></wbr>) already defined in lll.obj </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2005: "public: int __thiscall CTest::get(void)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#103;&#101;&#116;&#64;&#99;&#108;&#108;&#108;&#64;&#64;&#81;&#65;&#69;&#72;&#88;&#90;"><font color=#703f3a>?get@clll@@QAEHXZ</font></a><wbr></wbr>) already defined in lll.obj </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2005: "public: void __thiscall CTest::set(int)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#115;&#101;&#116;&#64;&#99;&#108;&#108;&#108;&#64;&#64;&#81;&#65;&#69;&#88;&#72;&#64;&#90;"><font color=#703f3a>?set@clll@@QAEXH@Z</font></a><wbr></wbr>) already defined in lll.obj </p>
<p style="TEXT-INDENT: 2em">Debug/tt.exe : fatal error LNK1169: one or more multiply defined symbols found </p>
<p style="TEXT-INDENT: 2em">Error executing link.exe. </p>
<p style="TEXT-INDENT: 2em"><font color=#0000ff>又如：</font> </p>
<p style="TEXT-INDENT: 2em">///test文件： </p>
<p style="TEXT-INDENT: 2em">#ifndef HH </p>
<p style="TEXT-INDENT: 2em">#define HH </p>
<p style="TEXT-INDENT: 2em">template&lt;class T&gt; </p>
<p style="TEXT-INDENT: 2em">class CTest </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">public: </p>
<p style="TEXT-INDENT: 2em">CTest(); </p>
<p style="TEXT-INDENT: 2em">~CTest(); </p>
<p style="TEXT-INDENT: 2em">T get(); </p>
<p style="TEXT-INDENT: 2em">void set(T d); </p>
<p style="TEXT-INDENT: 2em">private: </p>
<p style="TEXT-INDENT: 2em">T num; </p>
<p style="TEXT-INDENT: 2em">}; </p>
<p style="TEXT-INDENT: 2em">#endif </p>
<p style="TEXT-INDENT: 2em">///test.cpp文件 </p>
<p style="TEXT-INDENT: 2em">#include"test.h" </p>
<p style="TEXT-INDENT: 2em">template&lt;class T&gt; </p>
<p style="TEXT-INDENT: 2em">CTest&lt;T&gt;::CTest() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">}; </p>
<p style="TEXT-INDENT: 2em">template&lt;class T&gt; </p>
<p style="TEXT-INDENT: 2em">CTest&lt;T&gt;::~CTest() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">}; </p>
<p style="TEXT-INDENT: 2em">template&lt;class T&gt; </p>
<p style="TEXT-INDENT: 2em">T CTest&lt;T&gt;::get() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">return num; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">template&lt;class T&gt; </p>
<p style="TEXT-INDENT: 2em">void CTest&lt;T&gt;::set(T d) </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">num=d; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">///main文件： </p>
<p style="TEXT-INDENT: 2em">#include"test.h"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#ff0000> //这里应改为#include"test.cpp" </font></p>
<p style="TEXT-INDENT: 2em">#include&lt;iostream&gt; </p>
<p style="TEXT-INDENT: 2em">using namespace std; </p>
<p style="TEXT-INDENT: 2em">int main() </p>
<p style="TEXT-INDENT: 2em">{ </p>
<p style="TEXT-INDENT: 2em">CTest&lt;int&gt; tt; </p>
<p style="TEXT-INDENT: 2em">int n; </p>
<p style="TEXT-INDENT: 2em">cin&gt;&gt;n; </p>
<p style="TEXT-INDENT: 2em">tt.set(n); </p>
<p style="TEXT-INDENT: 2em">cout&lt;&lt;tt.get()&lt;&lt;endl; </p>
<p style="TEXT-INDENT: 2em">return 0; </p>
<p style="TEXT-INDENT: 2em">} </p>
<p style="TEXT-INDENT: 2em">如上程序将收到如下错误： </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2001: unresolved external symbol "public: __thiscall CTest&lt;int&gt;::~CTest&lt;int&gt;(void)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#63;&#49;&#63;&#36;&#99;&#108;&#108;&#108;&#64;&#72;&#64;&#64;&#81;&#65;&#69;&#64;&#88;&#90;"><font color=#703f3a>??1?$clll@H@@QAE@XZ</font></a><wbr></wbr>) </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2001: unresolved external symbol "public: int __thiscall CTest&lt;int&gt;::get(void)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#103;&#101;&#116;&#64;&#63;&#36;&#99;&#108;&#108;&#108;&#64;&#72;&#64;&#64;&#81;&#65;&#69;&#72;&#88;&#90;"><font color=#703f3a>?get@?$clll@H@@QAEHXZ</font></a><wbr></wbr>) </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2001: unresolved external symbol "public: void __thiscall CTest&lt;int&gt;::set(int)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#115;&#101;&#116;&#64;&#63;&#36;&#99;&#108;&#108;&#108;&#64;&#72;&#64;&#64;&#81;&#65;&#69;&#88;&#72;&#64;&#90;"><font color=#703f3a>?set@?$clll@H@@QAEXH@Z</font></a><wbr></wbr>) </p>
<p style="TEXT-INDENT: 2em">main.obj : error LNK2001: unresolved external symbol "public: __thiscall CTest&lt;int&gt;::CTest&lt;int&gt;(void)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#63;&#48;&#63;&#36;&#99;&#108;&#108;&#108;&#64;&#72;&#64;&#64;&#81;&#65;&#69;&#64;&#88;&#90;"><font color=#703f3a>??0?$clll@H@@QAE@XZ</font></a><wbr></wbr>) </p>
<p style="TEXT-INDENT: 2em">Debug/tt.exe : fatal error LNK1120: 4 unresolved externals </p>
<p style="TEXT-INDENT: 2em">Error executing link.exe.<img id=replace_img_263906504_0 src="http://img.blog.163.com/photo/qP5cJigkxL8tD0HGEmSslg==/4018899717475160820.jpg" border=0></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/67387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-20 16:34 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/20/67387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>valarray函数库(转)</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/18/67175.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Tue, 18 Nov 2008 01:24:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/18/67175.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/67175.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/18/67175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/67175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/67175.html</trackback:ping><description><![CDATA[原文地址：<a href="http://www.cppblog.com/tgh621/archive/2008/04/17/47356.html">http://www.cppblog.com/tgh621/archive/2008/04/17/47356.html</a><br><br>
<p><span>valarray</span><span>类用法</span></p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>apply <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>将</span><span>valarray</span><span>数组的每一个值都用</span><span>apply</span><span>所接受到的函数进行计算</span></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>cshift <span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>将</span><span>valarray</span><span>数组的数据进行循环移动，参数为正者左移为负就右移</span></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>max<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>返回</span><span>valarray</span><span>数组的最大值</span></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>min<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>返回</span><span>valarray</span><span>数组的最小值</span></p>
<p><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>resize<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>重新设置</span><span>valarray</span><span>数组大小，并对其进行初始化</span></p>
<p><span><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>shift<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>将</span><span>valarray</span><span>数组移动，参数为正者左移，为负者右移，移动后由</span><span>0</span><span>填充剩余位</span></p>
<p><span><span>7.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>size<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>得到数组的大小</span></p>
<p><span><span>8.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>sum<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>数组求和</span></p>
<p><span>构造函数</span><span><span> </span></span></p>
<p><span>valarray( );</span></p>
<p align=left><span>explicit valarray(size</span><em><span>_</span></em><span>t </span><em><span>_Count</span></em><span>);</span></p>
<p align=left><span>valarray(<span>&nbsp;&nbsp; </span>const Type&amp; </span><em><span>_Val</span></em><span>,<span>&nbsp;&nbsp;&nbsp; </span>size</span><em><span>_</span></em><span>t </span><em><span>_Count</span></em><span>);</span></p>
<p align=left><span>valarray(<span>&nbsp;&nbsp; </span>const Type* </span><em><span>_Ptr</span></em><span>,<span>&nbsp;&nbsp;&nbsp; </span>size</span><em><span>_</span></em><span>t </span><em><span>_Count</span></em><span>);</span></p>
<p align=left><span>valarray(<span>&nbsp;&nbsp; </span>const slice</span><em><span>_</span></em><span>array&lt;Type&gt;&amp; </span><em><span>_SliceArray</span></em><span>);</span></p>
<p align=left><span>valarray(<span>&nbsp;&nbsp; </span>const gslice</span><em><span>_</span></em><span>array&lt;Type&gt;&amp; </span><em><span>_GsliceArray</span></em><span>);</span></p>
<p align=left><span>valarray(<span>&nbsp;&nbsp; </span>const mask</span><em><span>_</span></em><span>array&lt;Type&gt;&amp; </span><em><span>_MaskArray</span></em><span>);</span></p>
<p align=left><span>valarray(<span>&nbsp;&nbsp; </span>const indirect</span><em><span>_</span></em><span>array&lt;Type&gt;&amp; </span><em><span>_IndArray</span></em><span>);</span></p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p align=left>&nbsp;</p>
<p><span>slice</span><span>类用法</span></p>
<p><span>该类主要配合</span><span>valarray</span><span>类使用，可以从</span><span>valarray</span><span>中提取子数组</span></p>
<p align=left><span>slice( );</span>&nbsp;</p>
<p align=left><span>slice(<span>&nbsp;&nbsp; </span>size</span><em><span>_</span></em><span>t </span><em><span>_StartIndex</span></em><span>,//</span><span>截取数组的开始位置</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>const valarray&lt;size</span><em><span>_</span></em><span>t&gt; </span><em><span>_Len</span></em><span>, //</span><span>子数组的最大长度</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>const valarray&lt;size</span><em><span>_</span></em><span>t&gt; </span><em><span>_Stride//</span></em><em><span>相隔多少个元素选中一个</span></em></p>
<p align=left><span>);</span></p>
<p><span>用法：</span></p>
<p align=left><span>int main( )</span></p>
<p align=left><span>{</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>using namespace std;</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>int i;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp; </span>valarray&lt;int&gt; va ( 20 ), vaResult;</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>for ( i = 0 ; i &lt; 20 ; i+=1 )</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>va [ i ] =&nbsp;2 * (i + 1 );</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp; </span>cout &lt;&lt; "The operand valarray va is:\n( ";</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for ( i = 0 ; i &lt; 20 ; i++ )</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; va [ i ] &lt;&lt; " ";</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>cout &lt;&lt; ")." &lt;&lt; endl;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp; </span>slice vaSlice ( 1 , 7 , 3 );</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>vaResult = va [ vaSlice ];</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp; </span>cout &lt;&lt; "\nThe slice of valarray va is vaResult:"</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;&lt; "\nva[slice( 1, 7, 3)] = ( ";</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for ( i = 0 ; i &lt; 7 ; i++ )</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>cout &lt;&lt; vaResult [ i ] &lt;&lt; " ";</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span>cout &lt;&lt; ")." &lt;&lt; endl;</span></p>
<p><span>}</span></p>
<p><span>输出结果：</span></p>
<p align=left><span>The operand valarray va is:</span></p>
<p align=left><span>( 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 ).</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>The slice of valarray va is vaResult:</span></p>
<p align=left><span>va[slice( 1, 7, 3)] = ( 4 10 16 22 28 34 40 ).</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>Gslice</span><span>类用法</span></p>
<p><span>Gslice</span><span>类的用法和<span>slice</span>基本相同，只是它截取的是循环子串，当母串进行一次提取后的字串元素数目达不到要求时，<span>gslice</span>会将提取后的母串继续组合进行提取直到满足要求或者母串被提取完了</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>公共函数<span>(</span>对数组的操作<span>)</span></span></p>
<p><span>1.abs<span>&nbsp;&nbsp; </span></span><span>对数组的每一个元素取绝对值</span></p>
<p><span>2.acos<span>&nbsp;&nbsp; </span></span><span>返回每个元素的反余弦值</span></p>
<p><span>3.asin&nbsp;</span><span>返回每个元素的反正弦值</span></p>
<p><span>4.atan&nbsp;</span><span>返回每个元素的正切值</span></p>
<p><span>5.atan2<span> </span></span><span>笛卡尔正切值</span></p>
<p><span>6.cos<span>&nbsp;&nbsp; </span></span><span>余弦值</span></p>
<p><span>7.cosh&nbsp;</span><span>双曲线余弦值</span></p>
<p><span>8.exp<span>&nbsp;&nbsp; </span></span><span>返回自然指数<span>E^x</span></span></p>
<p><span>9.log<span>&nbsp;&nbsp; </span></span><span>返回自然对数</span></p>
<p><span>10.log10<span>&nbsp;&nbsp;&nbsp; </span></span><span>返回以<span>10</span>为底的返回自然对数</span></p>
<p><span>11.exp<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>返回<span>x^y</span></span></p>
<p><span>12.sin<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>正弦值</span></p>
<p><span>13.sinh<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>双曲线正弦值</span></p>
<p><span>14.sqrt<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>开方</span></p>
<p><span>15.tan<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>正切值</span></p>
<p><span>16.tanh<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>反正切值</span></p>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/67175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-18 09:24 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/18/67175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows时间函数大全（转载）</title><link>http://www.cppblog.com/AutomateProgram/archive/2008/11/15/66999.html</link><dc:creator>漂漂</dc:creator><author>漂漂</author><pubDate>Sat, 15 Nov 2008 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/AutomateProgram/archive/2008/11/15/66999.html</guid><wfw:comment>http://www.cppblog.com/AutomateProgram/comments/66999.html</wfw:comment><comments>http://www.cppblog.com/AutomateProgram/archive/2008/11/15/66999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/AutomateProgram/comments/commentRss/66999.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/AutomateProgram/services/trackbacks/66999.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>介绍</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>我们在衡量一个函数运行时间，或者判断一个算法的时间效率，或者在程序中我们需要一个定时器，定时执行一个特定的操作，比如在多媒体中，比如在游戏中等，都会用到时间函数。还比如我们通过记录函数或者算法开始和截至的时间，然后利用两者之差得出函数或者算法的运行时间。编译器和操作系统为我们提供了很多时间函数，这些时间函数的精度也是各不相同的，所以，如果我们想得到准确的结果，必须使用合适的时间函数。现在我就介绍</span><span>windows</span><span>下的几种常用时间函数。</span></p>
<p><span>1</span><span>：</span><span>Sleep</span><span>函数</span></p>
<p><span>使用：</span><span>sleep(1000)</span><span>，在</span><span>Windows</span><span>和</span><span>Linux</span><span>下</span><span>1000</span><span>代表的含义并不相同，</span><span>Windows</span><span>下的表示</span><span>1000</span><span>毫秒，也就是</span><span>1</span><span>秒钟；</span><span>Linux</span><span>下表示</span><span>1000</span><span>秒，</span><span>Linux</span><span>下使用毫秒级别的函数可以使用</span><span>usleep</span><span>。</span></p>
<p><span>原理：</span><span>sleep</span><span>函数是使调用</span><span>sleep</span><span>函数的线程休眠，线程主动放弃时间片。当经过指定的时间间隔后，再启动线程，继续执行代码。</span><span>Sleep</span><span>函数并不能起到定时的作用，主要作用是延时。在一些多线程中可能会看到</span><span>sleep(0);</span><span>其主要目的是让出时间片。</span></p>
<p><span>精度：</span><span>sleep</span><span>函数的精度非常低，当系统越忙它精度也就越低，有时候我们休眠</span><span>1</span><span>秒，可能</span><span>3</span><span>秒后才能继续执行。它的精度取决于线程自身优先级、其他线程的优先级，以及线程的数量等因素。</span></p>
<p><span>2</span><span>：</span><span>MFC</span><span>下的</span><span>timer</span><span>事件</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>使用：</span><span>1.</span><span>调用函数</span><span>SetTimer()</span><span>设置定时间隔，如</span><span>SetTimer(0,100,NULL)</span><span>即为设置</span><span>100</span><span>毫秒的时间间隔；</span><span>2.</span><span>在应用程序中增加定时响应函数</span><span>OnTimer()</span><span>，并在该函数中添加响应的处理语句，用来完成时间到时的操作。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>原理：同</span><span>sleep</span><span>函数一样。不同的是</span><span>timer</span><span>是一个定时器，可以指定回调函数，默认为</span><span>OnTimer()</span><span>函数。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>精度：</span><span>timer</span><span>事件的精度范围在毫米级别，系统越忙其精度也就越差。</span></p>
<p><span>3</span><span>：</span><span>C</span><span>语言下的</span><span>Time</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>使用：</span><span>time_t t;time(&amp;t);Time</span><span>函数是获取当前时间。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>原理：</span><span>time</span><span>函数主要用于获取当前时间，比如我们做一个电子时钟程序，就可以使用此函数，获取系统当前的时间。</span></p>
<p><span>精度：秒级别</span></p>
<p><span>4</span><span>：</span><span>COM</span><span>对象中的</span><span>COleDateTime</span><span>，</span><span>COleDateTimeSpan</span><span>类</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>使用：</span><span>COleDateTime start_time = COleDateTime::GetCurrentTime();</span></p>
<p><span>COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;</span></p>
<p><span>While(end_time.GetTotalSeconds() &lt; 2)</span></p>
<p><span>{</span></p>
<p><span>// </span><span>处理延时或定时期间能处理其他的消息</span></p>
<p><span>DoSomething()</span></p>
<p><span>end_time = COleDateTime::GetCurrentTime-start_time;</span></p>
<p><span>}</span></p>
<p><span>原理：以上代表延时</span><span>2</span><span>秒，而这两秒内我们可以循环调用</span><span>DoSomething()</span><span>，从而实现在延时的时候我们也能够处理其他的函数，或者消息。</span><span>COleDateTime,COleDateTimeSpan</span><span>是</span><span>MFC</span><span>中</span><span>CTime</span><span>，</span><span>CTimeSpan</span><span>在</span><span>COM</span><span>中的应用，所以，上面的方法对于</span><span>CTime</span><span>，</span><span>CTimeSpa</span><span>同样有效。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>精度：秒级别</span></p>
<p><span>5</span><span>：</span><span>C</span><span>语言下的时钟周期</span><span>clock()</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>使用：</span><span>&nbsp;&nbsp;&nbsp;clock_t start = clock();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(100);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clock_t end = clock();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double d = (double)(start - end) / CLOCKS_PER_SEC;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>原理：</span><span>clock()</span><span>是获取计算机启动后的时间间隔。</span><span> </span></p>
<p><span>精度：</span><span>ms</span><span>级别，对于短时间内的定时或者延时可以达到</span><span>ms</span><span>级别，对于时间比较长的定时或者延迟精度还是不够。在</span><span>windows</span><span>下</span><span>CLOCKS_PER_SEC</span><span>为</span><span>1000</span><span>。</span></p>
<p><span>6</span><span>：</span><span>Windows</span><span>下的</span><span>GetTickCount()</span></p>
<p><span>使用：</span><span>&nbsp;&nbsp;DWORD start = GetTickCount();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(100);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD end = GetTickCount();</span></p>
<p><span>原理：</span><span>GetTickCount()</span><span>是获取系统启动后的时间间隔。通过进入函数开始定时，到退出函数结束定时，从而可以判断出函数的执行时间，这种时间也并</span></p>
<p><span>非是函数或者算法的真实执行时间，因为在函数和算法线程不可能一直占用</span><span>CPU</span><span>，对于所有判断执行时间的函数都是一样，不过基本上已经很准确，可以通过查询进行定时。</span><span>GetTickCount()</span><span>和</span><span>Clock()</span><span>函数是向主板</span><span>BIOS</span><span>要</span><span>real time clock</span><span>时间，会有中断产生，以及延迟问题。</span></p>
<p><span>精度：</span><span>WindowsNT 3.5</span><span>以及以后版本精度是</span><span>10ms</span><span>，它的时间精度比</span><span>clock</span><span>函数的要高，</span><span>GetTickCount()</span><span>常用于多媒体中。</span></p>
<p><span>7</span><span>：</span><span>Windows</span><span>下</span><span>timeGetTime</span></p>
<p><span>使用：需要包含</span><span>Mmsystem.h</span><span>，</span><span>Windows.h</span><span>，加入静态库</span><span>Winmm.lib.</span></p>
<p><span>timeBeginPeriod(1);</span></p>
<p><span>DWORD start = timeGetTime();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(100);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD end = timeGetTime();</span></p>
<p><span>timeEndPeriod(1);</span></p>
<p><span>原理：</span><span>timeGetTime</span><span>也时常用于多媒体定时器中，可以通过查询进行定时。通过查询进行定时，本身也会影响定时器的定时精度。</span></p>
<p><span>精度：毫秒，与</span><span>GetTickCount()</span><span>相当。但是和</span><span>GetTickCount</span><span>相比，</span><span>timeGetTime</span><span>可以通过</span><span>timeBeginPeriod</span><span>，</span><span>timeEndPeriod</span><span>设置定时器的最小解析精度</span><span>, timeBeginPeriod,timeEndPeriod</span><span>必须成对出现。</span></p>
<p><span>8</span><span>：</span><span>windows</span><span>下的</span><span>timeSetEvent</span></p>
<p><span>使用：还记的</span><span>VC</span><span>下的</span><span>Timer</span><span>吗？</span><span>Timer</span><span>是一个定时器，而以上我们提到几种时间函数或者类型，实现定时功能只能通过轮训来实现，也就是必须另外创建一个线程单独处理，这样会影响定时精度，好在</span><span>windows</span><span>提供了内置的定时器</span><span>timeSetEvent</span><span>，函数原型为</span></p>
<p><span>MMRESULT timeSetEvent</span><span>（</span><span> UINT uDelay, //</span><span>以毫秒指定事件的周期</span></p>
<p><span>UINT uResolution, //</span><span>以毫秒指定延时的精度，数值越小定时器事件分辨率越高。缺省值为</span><span>1ms</span></p>
<p><span>LPTIMECALLBACK lpTimeProc, //</span><span>指向一个回调函数</span></p>
<p><span>WORD dwUser, //</span><span>存放用户提供的回调数据</span></p>
<p><span>UINT fuEvent </span><span>）</span><span>// </span><span>标志参数，</span><span>TIME_ONESHOT</span><span>：执行一次；</span><span>TIME_PERIODIC</span><span>：周期性执行</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>具体应用时，可以通过调用</span><span>timeSetEvent()</span><span>函数，将需要周期性执行的任务定义在</span><span> lpFunction</span><span>回调函数中</span><span>(</span><span>如：定时采样、控制等</span><span>)</span><span>，从而完成所需处理的事件。需要注意的是：任务处理的时间不能大于周期间隔时间。另外，在定</span></p>
<p>&nbsp;<span>时器使用完毕后，应及时调用</span><span>timeKillEvent()</span><span>将之释放。</span></p>
<p><span>原理：可以理解为代回调函数的</span><span>timeGetTime</span></p>
<p><span>精度：毫秒，</span><span>timeSetEvent</span><span>可以通过</span><span>timeBeginPeriod</span><span>，</span><span>timeEndPeriod</span><span>设置定时器的最小解析精度</span><span>, timeBeginPeriod,timeEndPeriod</span><span>必须成对出现。</span></p>
<p><span>9</span><span>：高精度时控函数</span><span>QueryPerformanceFrequency</span><span>，</span><span>QueryPerformanceCounter</span></p>
<p><span>使用：</span><span>LARGE_INTEGER m_nFreq;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER m_nBeginTime;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER nEndTime;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceFrequency(&amp;m_nFreq); // </span><span>获取时钟周期</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(&amp;m_nBeginTime); // </span><span>获取时钟计数</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(100);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(&amp;nEndTime);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; (nEndTime.QuadPart-m_nBeginTime.QuadPart)*1000/m_nFreq.QuadPart &lt;&lt; endl;</span></p>
<p><span>原理：</span><span>CPU</span><span>上也有一个计数器，以机器的</span><span>clock</span><span>为单位，可以通过</span><span>rdtsc</span><span>读取，而不用中断，因此其精度与系统时间相当。</span></p>
<p><span>精度：计算机获取硬件支持，精度比较高，可以通过它判断其他时间函数的精度范围。</span></p>
<p><span>10</span><span>小结：以上提到常用的</span><span>9</span><span>种时间函数，由于他们的用处不同，所以他们的精度也不尽相同，所以如果简单的延时可以用</span><span>sleep</span><span>函数，稍微准确的延时可以使用</span><span>clock</span><span>函数，</span><span>GetTickCount</span><span>函数，更高级的实用</span><span>timeGetTime</span><span>函数；简单的定时事件可以用</span><span>Timer</span><span>，准确地可以用</span><span>timeSetEvent</span><span>；或取一般系统时间可以通</span><span>time</span><span>，或者</span><span>CTime</span><span>，或者</span><span>COleDateTime</span><span>，获取准确的时间可以用</span><span>clock</span><span>，或者</span><span>GetTickCount</span><span>函数，或者</span><span>timeGetTime</span><span>函数，而获取准确地系统时间要使用硬件支持的</span><span>QueryPerformanceFrequency</span><span>函数，</span><span>QueryPerformanceCounter</span><span>函数。<br><br>CStopwatch.h<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CStopwatch&nbsp;<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;CStopwatch()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceFrequency(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_liPerfFreq);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Start();&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Start()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_liPerfStart);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Returns&nbsp;#&nbsp;of&nbsp;milliseconds&nbsp;since&nbsp;Start&nbsp;was&nbsp;called</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;__int64&nbsp;Now()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;liPerfNow;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryPerformanceCounter(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">liPerfNow);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(((liPerfNow.QuadPart&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;m_liPerfStart.QuadPart)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;m_liPerfFreq.QuadPart);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;m_liPerfFreq;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Counts&nbsp;per&nbsp;second</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;m_liPerfStart;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Starting&nbsp;count</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">};</span></div>
<br>使用：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;CStopwatchTest.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br></span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">CStopwatch.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CStopwatch&nbsp;stopWatch;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;z&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;&nbsp;z</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;__int64&nbsp;qwElapsedTime&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;stopWatch.Now();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
</span>
<img src ="http://www.cppblog.com/AutomateProgram/aggbug/66999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/AutomateProgram/" target="_blank">漂漂</a> 2008-11-15 16:17 <a href="http://www.cppblog.com/AutomateProgram/archive/2008/11/15/66999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>