﻿<?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++博客-时间的痕迹-文章分类-win32 sdk 编程</title><link>http://www.cppblog.com/ivenher/category/707.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 19:15:32 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 19:15:32 GMT</pubDate><ttl>60</ttl><item><title>windows网络编程十九</title><link>http://www.cppblog.com/ivenher/articles/12529.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Fri, 15 Sep 2006 14:05:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/12529.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/12529.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/12529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/12529.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/12529.html</trackback:ping><description><![CDATA[
		<p>8.2.4 重叠模型<br />在Wi n s o c k中，相比我们迄今为止解释过的其他所有I / O模型，重叠I / O（Overlapped I/O）<br />模型使应用程序能达到更佳的系统性能。重叠模型的基本设计原理便是让应用程序使用一个重叠的数据结构，一次投递一个或多个Winsock I/O请求。针对那些提交的请求，在它们完成之后，应用程序可为它们提供服务。该模型适用于除Windows CE之外的各种Wi n d o w s平台。<br />模型的总体设计以Wi n 3 2重叠I / O机制为基础。那个机制可通过R e a d F i l e和Wr i t e F i l e两个函数，针对设备执行I / O操作。<br />最开始的时候，Wi n s o c k重叠I / O模型只能应用于Windows NT操作系统上运行的Wi n s o c k1 . 1应用程序。作为应用程序，它可针对一个套接字句柄，调用R e a d F i l e以及Wr i t e F i l e，同时指定一个重叠式结构（稍后详述），从而利用这个模型。自Winsock 2发布开始，重叠I / O便已集成到新的Wi n s o c k函数中，比如W S A S e n d和W S A R e c v。这样一来，重叠I / O模型便能适用于安装了Winsock 2的所有Wi n d o w s平台。</p>
		<p>注意在Winsock 2发布之后，重叠I/O仍可在Windows NT和Windows 2000这两个操作系统中，随R e a d F i l e和Wr i t e F i l e两个函数使用。但是，Windows 95和Windows 98均不具备这一功能。考虑到应用程序的跨平台兼容问题，同时考虑到性能方面的因素，应尽量避免使用Wi n 3 2的R e a d F i l e和Wr i t e F i l e函数，分别换以W S A R e c v和W S A S e n d函数。本节只打算讲述通过新的Winsock 2函数，来使用重叠I/O模型。<br />要想在一个套接字上使用重叠I / O模型，首先必须使用W S A _ F L A G _ O V E R L A P P E D这个标志，创建一个套接字。如下所示：</p>
		<p>  s = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);<br />  创建套接字的时候，假如使用的是s o c k e t函数，而非W S A S o c k e t函数，那么会默认设置W S A _ F L A G _ O V E R L A P P E D标志。成功建好一个套接字，同时将其与一个本地接口绑定到一起后，便可开始进行重叠I / O 操作，方法是调用下述的Wi n s o c k 函数，同时指定一个<br />W S A O V E R L A P P E D结构（可选）：<br />■ W S A S e n d<br />■ W S A S e n d To<br />■ W S A R e c v<br />■ W S A R e c v F r o m<br />■ W S A I o c t l<br />■ A c c e p t E x<br />■ Tr n a s m i t F i l e<br />大家现在或许已经知道，其中每个函数都与一个套接字上数据的发送、数据接收以及连接的接受有关。因此，这些活动可能会花极少的时间才能完成。这正是每个函数都可接受一个W S A O V E R L A P P E D结构作为参数的原因。若随一个W S A O V E R L A P P E D结构一起调用这些函数，函数会立即完成并返回，无论套接字是否设为锁定模式（本章开头已详细讲过了）。它<br />们依赖于W S A O V E R L A P P E D结构来返回一个I / O请求的返回。<br />主要有两个方法可用来管理一个重叠I / O请求的完成：我们的应用程序可等待“事件对象通知”，亦可通过“完成例程”，对已经完成的请求加以处理。上面列出的函数（ A c c e p t E x除外）还有另一个常用的参数：<br />l p C o m p l e t i o n R O U T I N E。该参数指定的是一个可选的指针，指向一个完成例程函数，在重叠请求完成后调用。接下去，我们将探讨事件通知方法。在本章稍后，还会介绍如何使用可选的完成例程，代替事件，对完成的重叠请求加以处理。<br />1. 事件通知<br />重叠I / O的事件通知方法要求将Wi n 3 2事件对象与W S A O V E R L A P P E D结构关联在一起。若使用一个W S A O V E R L A P P E D结构，发出像W S A S e n d和W S A R e c v这样的I / O调用，它们会立即返回。<br />通常，大家会发现这些I / O 调用会以失败告终，返回S O C K E T _ E R R O R 。使用W S A G e t L a s t E r r o r函数，便可获得与错误状态有关的一个报告。这个错误状态意味着I / O操作正在进行。稍后的某个时间，我们的应用程序需要等候与W S A O V E R L A P P E D结构对应的事件对象，了解一个重叠I / O请示何时完成。W S A O V E R L A P P E D结构在一个重叠I / O请求的初始化，及其后续的完成之间，提供了一种沟通或通信机制。下面是这个结构的定义：</p>
		<p> typedef struct WSAOVERLAPPED<br /> {<br />  DWORD Internal;<br />  DWORD InternalHigh;<br />  DWORD Offset;<br />  DWORD OffsetHigh;<br />  WSAEVENT hEvent;<br /> }WSAOVERLAPPED,FAR *LPWSAOVERLPPED;<br /> <br />其中，I n t e r n a l、I n t e r n a l H i g h、O ff s e t和O ff s e t H i g h字段均由系统在内部使用，不应由应用程序直接进行处理或使用。而另一方面， h E v e n t字段有点儿特殊，它允许应用程序将一个事件对象句柄同一个套接字关联起来。大家可能会觉得奇怪，如何将一个事件对象句柄分配给该字段呢？正如我们早先在W S A E v e n t S e l e c t模型中讲述的那样，可用W S A C r e a t e E v e n t函数来创建一个事件对象句柄。一旦创建好一个事件句柄，简单地将重叠结构的h E v e n t字段分配给事件句柄，再使用重叠结构，调用一个Wi n s o c k函数即可，比如W S A S e n d或W S A R e c v。<br />一个重叠I / O请求最终完成后，我们的应用程序要负责取回重叠I / O操作的结果。一个重叠请求操作最终完成之后，在事件通知方法中， Wi n s o c k会更改与一个W S A O V E R L A P P E D结构对应的一个事件对象的事件传信状态，将其从“未传信”变成“已传信”。由于一个事件对象已分配给W S A O V E R L A P P E D结构，所以只需简单地调用W S AWa i t F o r M u l t i p l e E v e n t s函数，从而判断出一个重叠I / O调用在什么时候完成。该函数已在我们前面讲述WSAEventSelect I/O模型时介绍过了。W S AWa i t F o r M u l t i p l e E v e n t s函数会等候一段规定的时间，等待一个或多个事件对象进入“已传信”状态。在此再次提醒大家注意： W S AWa i t F o r M u l t i p l e E v e n t s函数一次<br />最多只能等待6 4个事件对象。发现一次重叠请求完成之后，接着需要调用W S A G e t O v e r l a p p e dR e s u l t（取得重叠结构）函数，判断那个重叠调用到底是成功，还是失败。该函数的定义如下：<br /> BOOL WSAGetOverlappedResult(<br />                SOCKET s,<br />                LPWSAOVERLAPPED lpOverlapped,<br />                LPWORD lpcbTransfer,<br />                BOOL  fWait,<br />                LPWORD lpdwFlags<br />               );<br />其中， s参数用于指定在重叠操作开始的时候，与之对应的那个套接字。l p O v e r l a p p e d参数是一个指针，对应于在重叠操作开始时，指定的那个W S A O V E R L A P P E D 结构。<br />l p c b Tr a n s f e r参数也是一个指针，对应一个D W O R D（双字）变量，负责接收一次重叠发送或接收操作实际传输的字节数。f Wa i t参数用于决定函数是否应该等待一次待决（未决）的重叠操作完成。若将f Wa i t设为T R U E，那么除非操作完成，否则函数不会返回；若设为FA L S E，而且操作仍然处于“待决”状态，那么W S A G e t O v e r l a p p e d R e s u l t函数会返回FA L S E值，同时返回一个W S A _ I O _ I N C O M P L E T E（I / O操作未完成）错误。但就我们目前的情况来说，由于需要等候重叠操作的一个已传信事件完成，所以该参数无论采用什么设置，都没有任何效果。<br />最后一个参数是l p d w F l a g s，它对应于一个指针，指向一个D W O R D（双字），负责接收结果标志（假如原先的重叠调用是用W S A R e c v或W S A R e c v F r o m函数发出的）。<br />如W S A G e t O v e r l a p p e d R e s u l t函数调用成功，返回值就是T R U E。这意味着我们的重叠I / O操作已成功完成，而且由l p c b Tr a n s f e r参数指向的值已进行了更新。若返回值是FA L S E，那么可能是由下述任何一种原因造成的：<br />■ 重叠I / O操作仍处在“待决”状态。<br />■ 重叠操作已经完成，但含有错误。<br />■ 重叠操作的完成状态不可判决，因为在提供给W S A G e t O v e r l a p p e d R e s u l t函数的一个或<br />多个参数中，存在着错误。</p>
		<p>失败后，由l p c b Tr a n s f e r参数指向的值不会进行更新，而且我们的应用程序应调用W S A G e t L a s t E r r o r函数，调查到底是何种原因造成了调用失败。<br />在程序清单8 - 7中，我们向大家阐述了如何编制一个简单的服务器应用，令其在一个套接字上对重叠I / O操作进行管理，程序完全利用了前述的事件通知机制。对该程序采用的编程步骤总结如下：<br />1) 创建一个套接字，开始在指定的端口上监听连接请求。<br />2) 接受一个进入的连接请求。<br />3) 为接受的套接字新建一个W S A O V E R L A P P E D结构，并为该结构分配一个事件对象句柄。<br />也将事件对象句柄分配给一个事件数组，以便稍后由W S AWa i t F o r M u l t i p l e E v e n t s函数使用。<br />4) 在套接字上投递一个异步W S A R e c v请求，指定参数为W S A O V E R L A P P E D结构。<br />注意函数通常会以失败告终，返回S O C K E T _ E R R O R错误状态W S A _ I O _ P E N D I N G（I/O操作尚未完成）。<br />5) 使用步骤3 )的事件数组，调用W S AWa i t F o r M u l t i p l e E v e n t s函数，并等待与重叠调用关联在一起的事件进入“已传信”状态（换言之，等待那个事件的“触发”）。<br />6) WSAWa i t F o r M u l t i p l e E v e n t s函数完成后，针对事件数组，调用W S A R e s e t E v e n t（重设事件）函数，从而重设事件对象，并对完成的重叠请求进行处理。<br />7) 使用W S A G e t O v e r l a p p e d R e s u l t函数，判断重叠调用的返回状态是什么。<br />8) 在套接字上投递另一个重叠W S A R e c v请求。<br />9) 重复步骤5 ) ~ 8 )。<br />这个例子极易扩展，提供对多个套接字的支持。方法是将代码的重叠I / O处理部分移至一个独立的线程内，让主应用程序线程为附加的连接请求提供服务。<br />程序清单8-7 采用事件机制的简单重叠I / O处理示例</p>
<img src ="http://www.cppblog.com/ivenher/aggbug/12529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-09-15 22:05 <a href="http://www.cppblog.com/ivenher/articles/12529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows网络编程十七</title><link>http://www.cppblog.com/ivenher/articles/12512.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Fri, 15 Sep 2006 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/12512.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/12512.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/12512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/12512.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/12512.html</trackback:ping><description><![CDATA[
		<p>8.2.3 WSAEventSelect<br />Wi n s o c k提供了另一个有用的异步I / O模型。和W S A A s y n c S e l e c t模型类似的是，它也允许应用程序在一个或多个套接字上，接收以事件为基础的网络事件通知。对于表8 - 3总结的、由W S A A s y n c S e l e c t模型采用的网络事件来说，它们均可原封不动地移植到新模型。在用新模型开发的应用程序中，也能接收和处理所有那些事件。该模型最主要的差别在于网络事件会投递至一个事件对象句柄，而非投递至一个窗口例程。<br />事件通知<br />事件通知模型要求我们的应用程序针对打算使用的每一个套接字，首先创建一个事件对象。创建方法是调用W S A C r e a t e E v e n t函数，它的定义如下：</p>
		<p>WSAEVENT WSACreateEvent(void);</p>
		<p>W S A C r e a t e E v e n t函数的返回值很简单，就是一个创建好的事件对象句柄。事件对象句柄到手后，接下来必须将其与某个套接字关联在一起，同时注册自己感兴趣的网络事件类型，如表8 - 3所示。要做到这一点，方法是调用W S A E v e n t S e l e c t函数，对它的定义如下：</p>
		<p>int WSAEventSelect(<br />          SOCKET s, <br />          WSAEVENT hEventObject,<br />          long lNetwordEvents<br />         );<br /> 其中， s参数代表自己感兴趣的套接字。h E v e n t O b j e c t参数指定要与套接字关联在一起的 事件对象—用W S A C r e a t e E v e n t取得的那一个。而最后一个参数l N e t w o r k E v e n t s，则对应一个“位掩码”，用于指定应用程序感兴趣的各种网络事件类型的一个组合（如表8 - 3所示）。要想获知对这些事件类型的详细说明，请参考早先讨论过的WSAAsyncSelect I/O模型。<br />为W S A E v e n t S e l e c t创建的事件拥有两种工作状态，以及两种工作模式。其中，两种工作状态分别是“已传信”（s i g n a l e d）和“未传信”（n o n s i g n a l e d）。工作模式则包括“人工重设”（manual reset）和“自动重设”（auto reset）。W S A C r e a t e E v e n t最开始在一种未传信的工作状态中，并用一种人工重设模式，来创建事件句柄。随着网络事件触发了与一个套接字关联在<br />一起的事件对象，工作状态便会从“未传信”转变成“已传信”。由于事件对象是在一种人工重设模式中创建的，所以在完成了一个I / O请求的处理之后，我们的应用程序需要负责将工作状态从已传信更改为未传信。要做到这一点，可调用W S A R e s e t E v e n t函数，对它的定义如下：</p>
		<p> BOOL  WSAResetEvent(WSAEVENT hEvent);<br /> <br /> 该函数唯一的参数便是一个事件句柄；基于调用是成功还是失败，会分别返回T R U E或FA L S E。应用程序完成了对一个事件对象的处理后，便应调用W S A C l o s e E v e n t函数，释放由事件句柄使用的系统资源。对W S A C l o s e E v e n t函数的定义如下：</p>
		<p> BOOL WSACloseEvent(WSAEVENT hEvent);<br /> <br /> 该函数也要拿一个事件句柄作为自己唯一的参数，并会在成功后返回T R U E，失败后返回FA L S E。<br />一个套接字同一个事件对象句柄关联在一起后，应用程序便可开始I / O处理；方法是等待网络事件触发事件对象句柄的工作状态。W S AWa i t F o r M u l t i p l e E v e n t s函数的设计宗旨便是用来等待一个或多个事件对象句柄，并在事先指定的一个或所有句柄进入“已传信”状态后，或在超过了一个规定的时间周期后，立即返回。下面是W S AWa i t F o r M u l t i p l e E v e n t s函数的定义：</p>
		<p>DWORD WSAWaitForMultipleEvents(<br />                DWORD cEvent,<br />                const WSAEVENT FAR * lphEvents,<br />                BOOL  fWaitAll,<br />                DWORD dwTimeout,<br />                BOOL  fAlertable<br />               );<br />               <br /> 其中， c E v e n t s和l p h E v e n t s参数定义了由W S A E V E N T对象构成的一个数组。在这个数组中，c E v e n t s指定的是事件对象的数量，而l p h E v e n t s对应的是一个指针，用于直接引用该数组。<br />要注意的是， W S AWa i t F o r M u l t i p l e E v e n t s只能支持由W S A _ M A X I M U M _ WA I T _ E V E N T S对象规定的一个最大值，在此定义成6 4个。因此，针对发出W S AWa i t F o r M u l t i p l e E v e n t s调用的每个线程，该I / O模型一次最多都只能支持6 4个套接字。假如想让这个模型同时管理不止6 4个套<br />接字，必须创建额外的工作者线程，以便等待更多的事件对象。f Wa i t A l l 参数指定了W S AWa i t F o r M u l t i p l e E v e n t s如何等待在事件数组中的对象。若设为T R U E，那么只有等l p h E v e n t s数组内包含的所有事件对象都已进入“已传信”状态，函数才会返回；但若设为FA L S E，任何一个事件对象进入“已传信”状态，函数就会返回。就后一种情况来说，返回值指出了到底是哪个事件对象造成了函数的返回。通常，应用程序应将该参数设为FA L S E，<br />一次只为一个套接字事件提供服务。d w Ti m e o u t参数规定了W S AWa i t F o r M u l t i p l e E v e n t s最多可等待一个网络事件发生有多长时间，以毫秒为单位，这是一项“超时”设定。超过规定的时间，函数就会立即返回，即使由f Wa i t A l l参数规定的条件尚未满足也如此。如超时值为0，函数会检测指定的事件对象的状态，并立即返回。这样一来，应用程序实际便可实现对事件对<br />象的“轮询”。但考虑到它对性能造成的影响，还是应尽量避免将超时值设为0。假如没有等待处理的事件， W S AWa i t F o r M u l t i p l e E v e n t s便会返回W S A _ WA I T _ T I M E O U T。如d w s Ti m e o u t设为W S A _ I N F I N I T E（永远等待），那么只有在一个网络事件传信了一个事件对象后，函数才<br />会返回。最后一个参数是f A l e r t a b l e，在我们使用W S A E v e n t S e l e c t模型的时候，它是可以忽略的，且应设为FA L S E。该参数主要用于在重叠式I / O模型中，在完成例程的处理过程中使用。<br />本章后面还会对此详述。</p>
		<p>若W S AWa i t F o r M u l t i p l e E v e n t s收到一个事件对象的网络事件通知，便会返回一个值，指出造成函数返回的事件对象。这样一来，我们的应用程序便可引用事件数组中已传信的事件，并检索与那个事件对应的套接字，判断到底是在哪个套接字上，发生了什么网络事件类型。<br />对事件数组中的事件进行引用时，应该用W S AWa i t F o r M u l t i p l e E v e n t s的返回值，减去预定义值W S A _ WA I T _ E V E N T _ 0，得到具体的引用值（即索引位置）。如下例所示：</p>
		<p>Index = WSAWaitForMultipleEvents(...);<br />MyEvent = EventArray[Index - WSA_WAIT_EVENT_0];<br />知道了造成网络事件的套接字后，接下来可调用W S A E n u m N e t w o r k E v e n t s函数，调查发生了什么类型的网络事件。该函数定义如下：</p>
		<p> int WSAEnumNetworkEvents(<br />              SOCKET s,<br />              WSAEVENT hEventObject,<br />              LPWSANETWORKEVENTS lpNetworkEvents<br />             );<br /> s参数对应于造成了网络事件的套接字。h E v e n t O b j e c t参数则是可选的；它指定了一个事件句柄，对应于打算重设的那个事件对象。由于我们的事件对象处在一个“已传信”状态，所以可将它传入，令其自动成为“未传信”状态。如果不想用h E v e n t O b j e c t参数来重设事件，那么可使用W S A R e s e t E v e n t 函数， 该函数早先已经讨论过了。最后一个参数是l p N e t w o r k E v e n t s，代表一个指针，指向W S A N E T W O R K E V E N T S结构，用于接收套接字上发<br />生的网络事件类型以及可能出现的任何错误代码。下面是W S A N E T W O R K E V E N T S结构的定义：</p>
		<p> typedef struct _WSANETWORKEVENTS<br /> {<br />  long lNetworkEvents;<br />  int iErrorCode[FD_MAX_EVENTS];<br /> }WSANETWORKEVENTS,FAR * LPWSANETWORKEVENTS;<br /> <br /> l N e t w o r k E v e n t s参数指定了一个值，对应于套接字上发生的所有网络事件类型（参见表8 - 3）。<br />注意一个事件进入传信状态时，可能会同时发生多个网络事件类型。例如，一个繁忙<br />的服务器应用可能同时收到FD_READ和FD_WRITE通知。<br />i E r r o r C o d e参数指定的是一个错误代码数组，同l N e t w o r k E v e n t s中的事件关联在一起。针对每个网络事件类型，都存在着一个特殊的事件索引，名字与事件类型的名字类似，只是要在事件名字后面添加一个“ _ B I T”后缀字串即可。例如，对F D _ R E A D事件类型来说，i E r r o r C o d e数组的索引标识符便是F D _ R E A D _ B I T。下述代码片断对此进行了阐释（针对F D _ R E A D事件）：</p>
		<p>  if(NetWorkEvents.lNetworkEvents &amp; FD_READ)<br />  {<br />   if(NetWorkEvents.iErrorCode[FD_READ_BIT] != 0)<br />   {<br />    printf("FD_READ FAILED with error %d\n",NetWorkEvents.iErrorCode[FD_READ_BIT]);<br />   }<br />  }</p>
		<p>完成了对W S A N E T W O R K E V E N T S结构中的事件的处理之后，我们的应用程序应在所有可用的套接字上，继续等待更多的网络事件。在程序清单8 - 6中，我们阐释了如何使用W S A E v e n t S e l e c t这种I / O模型，来开发一个服务器应用，同时对事件对象进行管理。这个程序主要着眼于开发一个基本的服务器应用要涉及到的步骤，令其同时负责一个或多个套接字的管理。</p>
		<p>完成了对W S A N E T W O R K E V E N T S结构中的事件的处理之后，我们的应用程序应在所有可用的套接字上，继续等待更多的网络事件。在程序清单8 - 6中，我们阐释了如何使用W S A E v e n t S e l e c t这种I / O模型，来开发一个服务器应用，同时对事件对象进行管理。这个程序主要着眼于开发一个基本的服务器应用要涉及到的步骤，令其同时负责一个或多个套接字的管理。<br />程序清单8-6 采用WSAEventSelect I/O模型的示范服务器源代码</p>
<img src ="http://www.cppblog.com/ivenher/aggbug/12512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-09-15 15:43 <a href="http://www.cppblog.com/ivenher/articles/12512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入getmessage和peekmessage</title><link>http://www.cppblog.com/ivenher/articles/12473.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Sep 2006 10:18:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/12473.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/12473.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/12473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/12473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/12473.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: bob gunderson																		msdn						技术组																		作于						:1992						年						11						月						11						日																																 					...&nbsp;&nbsp;<a href='http://www.cppblog.com/ivenher/articles/12473.html'>阅读全文</a><img src ="http://www.cppblog.com/ivenher/aggbug/12473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-09-14 18:18 <a href="http://www.cppblog.com/ivenher/articles/12473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows核心编程--windows程序的执行 </title><link>http://www.cppblog.com/ivenher/articles/12458.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Sep 2006 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/12458.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/12458.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/12458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/12458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/12458.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Arial" twffan="done">Windows</span>
				</b>
				<b>
						<span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">应用程序的执行</span>
				</b>
				<b>
						<span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Arial" twffan="done">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b>
						<span lang="EN-US" style="COLOR: blue; FONT-FAMILY: Arial" twffan="done">
								<o:p> </o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">Windows</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">支持两种类型的应用程序。一种是基于图形用户界面（</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">GUI</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">）的应用程序，另一种是基于控制台用户界面（</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">CUI</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">）的应用程序。</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">(</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">两者间可以相互转化</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">,</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">没有明确的界限</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">,</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">就是说可以让</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">CUI</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">程序中可以有</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">Dialog</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">界面等</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">,</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">而</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">GUI</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">界面中也可以有</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">console</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">来输出信息</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" twffan="done">
						<o:p> </o:p>
				</span>
		</p>
		<p style="LINE-HEIGHT: 18.75pt">
				<font face="宋体">
						<span style="FONT-SIZE: 10pt" twffan="done">对于一个应用程序<span lang="EN-US" twffan="done">:</span></span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体" twffan="done">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="LINE-HEIGHT: 18.75pt">
				<font face="宋体">
						<span style="FONT-SIZE: 10.5pt; BACKGROUND: red; COLOR: black; mso-bidi-font-family: 'Times New Roman'; mso-highlight: red" twffan="done">一</span>
						<span style="FONT-SIZE: 10.5pt; COLOR: black; mso-bidi-font-family: 'Times New Roman'" twffan="done">操作系统实际上先调用的是<span lang="EN-US" twffan="done">C / C + +</span>运行期启动函数。该函数负责对<span lang="EN-US" twffan="done">C / C + +</span>运行期库进行初始化，这样，就可以调用<span lang="EN-US" twffan="done">m a l l o c </span>和<span lang="EN-US" twffan="done">f r e e </span>之类的函数。它还能够确保已经声明的任何全局对象和静态<span lang="EN-US" twffan="done">C + +</span>对象能够在代码执行以前正确地创建。链接程序负责在它连接可执行文件时选择相应的<span lang="EN-US" twffan="done">C / C + +</span>运行期启动函数。如果设定了<span lang="EN-US" twffan="done">/ S U B S Y S T E M : W I N D O W S </span>链接程序开关，那 么该链接程序期望找到一个<span lang="EN-US" twffan="done">Wi n M a i n </span>或<span lang="EN-US" twffan="done">w Wi n m a i n</span>函数。如果这两个函数都不存在，链接程序便返回一个<span lang="EN-US" twffan="done">“</span>未转换的外部符号<span lang="EN-US" twffan="done">”</span>的错误消 息。否则，它可以分别选择<span lang="EN-US" twffan="done">Wi n M a i n C RT S t a r t u p </span>函数或<span lang="EN-US" twffan="done">w Wi n M a i n C RT S t a r t u p </span>函数。<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
				</font>
		</p>
		<p style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 9.0pt">
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">启动函数的功能归纳如下：</span>
						<span lang="EN-US" twffan="done">
						</span>
				</font>
		</p>
		<p style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">• </span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">检索指向新进程的完整命令行的指针。</span>
				</font>
		</p>
		<p style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">• </span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">检索指向新进程的环境变量的指针。</span>
						<span lang="EN-US" twffan="done">
						</span>
				</font>
		</p>
		<p style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-line-height-alt: 9.0pt; mso-char-indent-count: -1.0">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">• </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">对</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">C / C + +</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">运行期的全局变量进行初始化。如果包含了</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">S t d L i b . h </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">文件，代码就能访问这些变量。表</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">4 - 1 </span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">列出了这些变量。</span>
						<span lang="EN-US" twffan="done">
						</span>
				</font>
		</p>
		<p style="MARGIN: 0cm 0cm 0pt 10pt; TEXT-INDENT: -10pt; mso-line-height-alt: 9.0pt; mso-char-indent-count: -1.0">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">• </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">对</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">C </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">运行期内存单元分配函数（</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">m a l l o c </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">和</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">c a l l o c </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">）和其他低层输入</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">/</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">输出例程使用的内存栈进行初始化。</span>
						<span lang="EN-US" twffan="done">
						</span>
				</font>
		</p>
		<p style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">• </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">为所有全局和静态</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">C + +</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">类对象调用构造函数。</span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">
								<o:p>
								</o:p>
						</span>
				</font>
		</p>
		<p style="LINE-HEIGHT: 18.75pt">
				<span style="FONT-SIZE: 10pt; BACKGROUND: red; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-highlight: red" twffan="done">
						<font face="宋体">二</font>
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">当所有这些初始化操作完成后，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">C / C + +</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">启动函数就调用应用程序的进入点函数。如果编写了一个</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">w Wi n M a i n </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">
						<font face="宋体">函数，它将以下面的形式被调用</font>
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial" twffan="done">
				</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; COLOR: black; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial" twffan="done">：</span>
						<span lang="EN-US" twffan="done">
						</span>
				</font>
		</p>
		<pre style="BACKGROUND: #d7d7d7; LINE-HEIGHT: 18.75pt">GetStartupInfo(&amp;StartupInfo);
int nMainRetVal = wWinMain(GetMjduleHandle(NULL),
   NULL, pszCommandLineUnicode,
   (StartupInfo.dwFlags &amp; STARTF_USESHOWWINDOW) ? 
   StartupInfo.wShowWindow:SW_SHOWDEFAULT);</pre>
		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">
				<font style="BACKGROUND-COLOR: #ff1493">
						<pre> </pre>
						<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 18.75pt">
								<br />三</p>
				</font>
		</span>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">当进入点函数返回时，启动函数便调用</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">C </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">运行期的</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">e x i t </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">函数，将返回值（</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">n M a i n R e t Va l </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">）传递给它。</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">E x i t </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">函数负责下面的操作：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-line-height-alt: 0pt; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">• </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">调用由</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">_onexit</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">函数的调用而注册的任何函数。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-line-height-alt: 0pt; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">• </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">为所有全局的和静态的</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">C++</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">类对象调用析构函数。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-line-height-alt: 0pt; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">• </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">调用操作系统的</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">ExitProcess</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">函数，将</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">nMainRetVal</span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">传递给它。这使得该操作系统能够撤消进程并设置它的</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial; mso-font-kerning: 0pt" twffan="done">e x i t </span>
				<span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-font-kerning: 0pt" twffan="done">代码。</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 18.75pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto">
				<span lang="EN-US" twffan="done">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 18.75pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'" twffan="done">附录</span>
				<span lang="EN-US" twffan="done">:</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">各种应用程序的进入点及对应的启动函数<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
		</p>
		<p style="LINE-HEIGHT: 18.75pt">
				<span lang="EN-US" twffan="done">
						<o:p>
								<font face="宋体"> </font>
						</o:p>
				</span>
		</p>
		<div align="center" twffan="done">
				<table class="MsoNormalTable" style="BORDER-RIGHT: olive 1.5pt outset; BORDER-TOP: olive 1.5pt outset; BORDER-LEFT: olive 1.5pt outset; WIDTH: 463px; BORDER-BOTTOM: olive 1.5pt outset; HEIGHT: 175px; mso-cellspacing: .7pt; mso-padding-alt: 4.5pt 4.5pt 4.5pt 4.5pt" cellspacing="1" cellpadding="0" width="463" border="1">
						<tbody>
								<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 41.72%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="41%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">应用程序类型<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 23.84%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="23%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">进入点<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 33.78%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="33%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">嵌入可执行文件的启动函数<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 1">
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 41.72%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="41%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">需要<span lang="EN-US" twffan="done">ANSI</span>字符和字符串的<span lang="EN-US" twffan="done">GUI</span>应用程序<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 23.84%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="23%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">WinMain<o:p></o:p></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 33.78%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="33%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">WinMainCRTStartup<o:p></o:p></span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 2">
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 41.72%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="41%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">需要<span lang="EN-US" twffan="done">Unicode</span>字符和字符串的<span lang="EN-US" twffan="done">GUI</span>应用程序<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 23.84%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="23%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">wWinMainw<o:p></o:p></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 33.78%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="33%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">WinMainCRTStartup<o:p></o:p></span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 3">
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 41.72%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="41%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">需要<span lang="EN-US" twffan="done">ANSI</span>字符和字符串的<span lang="EN-US" twffan="done">CUI</span>应用程序<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 23.84%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="23%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">main<o:p></o:p></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 33.78%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="33%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">mainCRTStartup<o:p></o:p></span>
												</p>
										</td>
								</tr>
								<tr style="mso-yfti-irow: 4; mso-yfti-lastrow: yes">
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 41.72%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="41%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">需要<span lang="EN-US" twffan="done">Unicode</span>字符和字符串的<span lang="EN-US" twffan="done">CUI</span>应用程序<span lang="EN-US" twffan="done"><o:p></o:p></span></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 23.84%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="23%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">wmain<o:p></o:p></span>
												</p>
										</td>
										<td style="BORDER-RIGHT: olive 1pt inset; PADDING-RIGHT: 4.5pt; BORDER-TOP: olive 1pt inset; PADDING-LEFT: 4.5pt; PADDING-BOTTOM: 4.5pt; BORDER-LEFT: olive 1pt inset; WIDTH: 33.78%; PADDING-TOP: 4.5pt; BORDER-BOTTOM: olive 1pt inset; BACKGROUND-COLOR: transparent; mso-border-alt: inset olive .75pt" width="33%">
												<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center">
														<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" twffan="done">wmainCRTStartup<o:p></o:p></span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<p style="LINE-HEIGHT: 18.75pt">
				<span lang="EN-US" twffan="done">
						<o:p>
								<font face="宋体"> </font>
						</o:p>
				</span>
		</p>
		<p style="LINE-HEIGHT: 18.75pt">
				<span lang="EN-US" style="FONT-SIZE: 10.5pt; mso-bidi-font-family: 'Times New Roman'" twffan="done">
						<o:p>
								<font face="宋体"> </font>
						</o:p>
				</span>
		</p>
<img src ="http://www.cppblog.com/ivenher/aggbug/12458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-09-14 15:13 <a href="http://www.cppblog.com/ivenher/articles/12458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows 程序解析 </title><link>http://www.cppblog.com/ivenher/articles/12457.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Sep 2006 07:10:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/12457.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/12457.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/12457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/12457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/12457.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //				 INCLUDES 				//////////////////////////////////////////////				/																								#define				 WIN32_LEAN_AND_MEAN  				//				 just say no to MFC															...&nbsp;&nbsp;<a href='http://www.cppblog.com/ivenher/articles/12457.html'>阅读全文</a><img src ="http://www.cppblog.com/ivenher/aggbug/12457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-09-14 15:10 <a href="http://www.cppblog.com/ivenher/articles/12457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用API写Windows程序 （转） </title><link>http://www.cppblog.com/ivenher/articles/12455.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Thu, 14 Sep 2006 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/12455.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/12455.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/12455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/12455.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/12455.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 先来看个简单实例:#include "windows.h" int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { 　　MessageBox (NULL, TEXT ("你好，欢迎来到VC之路"), TEXT ("欢迎"), 0) ; 　　return 0...&nbsp;&nbsp;<a href='http://www.cppblog.com/ivenher/articles/12455.html'>阅读全文</a><img src ="http://www.cppblog.com/ivenher/aggbug/12455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-09-14 15:05 <a href="http://www.cppblog.com/ivenher/articles/12455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows程序的基本结构</title><link>http://www.cppblog.com/ivenher/articles/2348.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Sun, 01 Jan 2006 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/articles/2348.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/2348.html</wfw:comment><comments>http://www.cppblog.com/ivenher/articles/2348.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/2348.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/2348.html</trackback:ping><description><![CDATA[<STRONG>一、概述</STRONG> <BR><BR>　　<A href="http://dev.21tx.com/os/windows/" target=_blank><FONT color=#3366cc>Windows</FONT></A>程序具有相对固定的结构，对编写者而言，不需要书写整个过程，大部分过程由系统完成。<BR><BR>　　程序中只要按一定的格式填写系统留给客户的那一小部分。<BR><BR>　　所需要完成的有：<BR><BR>　　窗口类的定义、窗口的建立、消息函数的书写、消息循环。<BR>　　<B>二、消息处理函数</B><BR><BR>　　Windows程序是事件<A href="http://drivers.21tx.com/" target=_blank><FONT color=#3366cc>驱动</FONT></A>的，对于一个窗口，它的大部分例行维护是由系统维护的。没个窗口都有一个消息处理函数。<BR><BR>　　在消息处理函数中，对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。<BR><BR>　　客户写一个消息处理函数，在窗口建立前，将消息处理函数与窗口关联。这样，每当有消息产生时，就会去调用这个消息处理函数。<BR><BR>　　通常情况下，客户都不会处理全部的消息，而是只处理自己感兴趣的消息，其他的，则送回到系统的缺省消息处理函数中去。<BR><BR>
<TABLE class=txcode cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<BR>{<BR>switch (message)<BR>{<BR>case ...<BR>...<BR>case ...<BR>...<BR><BR>}<BR>return DefWindowProc (hwnd, message, wParam, lParam) ;<BR>}</TD></TR></TBODY></TABLE><BR>　　<B>三、窗口的建立</B> <BR><BR>　　客户需要自己建立窗口，建立后会得到系统返回的窗口句柄(HWND),后继的针对窗口的操作都针对句柄进行。<BR><BR>　　1.注册窗口类<BR><BR>　　建立窗口前，需要制定好这个窗口的相关属性，最主要的就是将自己定义的消息处理函数与窗口关联，其他的属性还包括：菜单、图标等等。<BR><BR>　　这个属性指定步骤是通过指定"窗口类"来完成的。<BR><BR>　　对于自己建立的窗口，这个"窗口类"需要自己制定，也即自己填充一个WNDCLASS结构,然后向系统注册。<BR>对于一些特殊窗口，如按钮等控件，他们的行为是系统制定好了的，所以不需要自己注册，直接使用对应的“窗口类”名称就行了。<BR><BR>　　2.建立窗口<BR><BR>　　建立窗口时，注册的"窗口类"名称作为参数传入。<BR><BR>　　这样，当有针对该窗口的消息时，将调用“窗口类”中指定的消息处理函数，在其中得到处理。 <BR><BR>　　<B>四、消息循环</B><BR><BR>　　系统会将针对这个程序的消息依次放到程序的“消息队列”中，由程序自己依次取出消息，在分发到对应的窗口中去。<BR><BR>　　因此，建立窗口后，将进入一个循环。<BR><BR>　　在循环中，取出消息、派发消息，循环往复，直到取得的消息是退出消息。<BR><BR>　　循环退出后，程序即结束。<BR><BR>
<TABLE class=txcode cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>#include "stdafx.h"<BR>#include ＜windows.h＞<BR><BR>//一、消息处理函数<BR>//参数:窗口句柄，消息，消息参数，消息参数<BR>LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<BR>{<BR>　//处理感兴趣的消息<BR>　switch (message)<BR>　{<BR>　　case WM_DESTROY:<BR>　　　//当用户关闭窗口，窗口销毁，程序需结束，发退出消息，以退出消息循环<BR>　　　PostQuitMessage (0) ;<BR>　　　return 0 ;<BR>　}<BR>　//其他消息交给由系统提供的缺省处理函数<BR>　return ::DefWindowProc (hwnd, message, wParam, lParam) ;<BR>}<BR><BR>//二、应用程序主函数<BR>//参数:实例句柄、前一个实例的句柄、命令行参数、窗口显示方式<BR>int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,<BR>PSTR szCmdLine, int iCmdShow)<BR>{<BR>　//1.注册窗口类<BR>　static TCHAR szAppName[] = TEXT ("HelloWin") ; //窗口类名称<BR>　//定制"窗口类"结构<BR>　WNDCLASS wndclass ;<BR>　wndclass.style = CS_HREDRAW | CS_VREDRAW ;<BR>　wndclass.lpfnWndProc = WndProc ; //关联消息处理函数 <BR>　wndclass.cbClsExtra = 0 ;<BR>　wndclass.cbWndExtra = 0 ;<BR>　wndclass.hInstance = hInstance ; //实例句柄<BR>　wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标<BR>　wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标<BR>　wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); //画刷<BR>　wndclass.lpszMenuName = NULL ;<BR>　wndclass.lpszClassName = szAppName; //类名称<BR>　//注册<BR>　if (!Re<A href="http://dev.21tx.com/corp/gis/" target=_blank><FONT color=#3366cc>GIS</FONT></A>terClass (&amp;wndclass))<BR>　{<BR>　　MessageBox (NULL, TEXT ("RegisterClass Fail!"), <BR>　　szAppName, MB_ICONERROR) ;<BR>　　return 0 ;<BR>　}<BR><BR>　//建立窗口<BR>　HWND hwnd ;<BR>　hwnd = CreateWindow (szAppName, //窗口类名称<BR>　　TEXT ("The Hello Program"), //窗口标题 <BR>　　WS_OVERLAPPEDWINDOW, //窗口风格<BR>　　CW_USEDEFAULT,<BR>　　CW_USEDEFAULT,<BR>　　CW_USEDEFAULT,<BR>　　CW_USEDEFAULT,<BR>　　NULL,<BR>　　NULL,<BR>　　hInstance, //实例句柄<BR>　　NULL);<BR><BR>　ShowWindow (hwnd, iCmdShow) ;<BR>　UpdateWindow (hwnd) ;<BR>　<BR>　//消息循环<BR>　MSG msg ;<BR>　while (GetMessage (&amp;msg, NULL, 0, 0)) //从消息队列中取消息 <BR>　{<BR>　　TranslateMessage (&amp;msg) ; //转换消息<BR>　　DispatchMessage (&amp;msg) ; //派发消息<BR>　}<BR>　return msg.wParam ;<BR>} </TD></TR></TBODY></TABLE><img src ="http://www.cppblog.com/ivenher/aggbug/2348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2006-01-01 15:01 <a href="http://www.cppblog.com/ivenher/articles/2348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>