﻿<?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++博客-steven -文章分类-VC</title><link>http://www.cppblog.com/steven/category/5444.html</link><description>steven</description><language>zh-cn</language><lastBuildDate>Wed, 06 Jan 2010 17:02:47 GMT</lastBuildDate><pubDate>Wed, 06 Jan 2010 17:02:47 GMT</pubDate><ttl>60</ttl><item><title>FILE 指针传递给DLL无法操作报致命错误 </title><link>http://www.cppblog.com/steven/articles/104829.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Tue, 05 Jan 2010 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/104829.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/104829.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/104829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/104829.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/104829.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在DLL中实现对文件的操作，可在实作时候发现，文件指针传递给DLL后，无法对文件进行操作，提示致命错误。DEBUG跟踪发现，dll中在操作文件指针的时候遇见了异常，0x00000005:Acess Violation,此错误是对无效指针操作等非法访问造成.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>上网搜索,找到相关文章: FILE指针传递给DLL为何无法正确操作－－隐式重复定义的陷阱 (<a href="http://blog.chinaunix.net/u2/79248/showart_1191453.html">http://blog.chinaunix.net/u2/79248/showart_1191453.html</a>)<br><br>&nbsp; 问题原因：出现了隐式重复定义。exe 和DLL中重复定义_iob<br>&nbsp; 解决办法：编译工程都设置成DEBUG MTD(Multi-threaded Debug DLL (/MDd))（use MFSas&nbsp;static&nbsp; library&nbsp;)<br>&nbsp; 环境：DL(VS2005）,exe (VC6.0,VS2005) 
<img src ="http://www.cppblog.com/steven/aggbug/104829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2010-01-05 15:39 <a href="http://www.cppblog.com/steven/articles/104829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序控制串口作为一个开关</title><link>http://www.cppblog.com/steven/articles/101891.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 25 Nov 2009 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/101891.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/101891.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/101891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/101891.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/101891.html</trackback:ping><description><![CDATA[通过串口的开和关,我们可以得到不同的输出电压,从而可以实现开关的功能.<br><br>串口一共9Pin,平常较常用的是RS232,TX 和RX,做开关使用的时候用到DTR 和RTS,一般是第四和第七Pin.<br><br>在打开串口的时候必须Enable DTR和RTS。<br><br>dcb.fDtrControl = DTR_CONTROL_ENABLE;&nbsp;<br>dcb.fRtsControl= RTS_CONTROL_ENABLE;<br><br>DTR，RTS Pin 在串口开和关的时候电压分别为正负11 伏. 如此可以做两个开关实现四种状态。
<img src ="http://www.cppblog.com/steven/aggbug/101891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2009-11-25 10:40 <a href="http://www.cppblog.com/steven/articles/101891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CreateFileMapping()  get error 6 Invalide handle  CE</title><link>http://www.cppblog.com/steven/articles/87923.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 17 Jun 2009 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/87923.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/87923.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/87923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/87923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/87923.html</trackback:ping><description><![CDATA[<p>今天尝试用CreateFileMapping() 映射文件的方法来处理文件，没想到刚开始就遇到问题了。<br>简单描述：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hFile= CreateFile(L"\\123.txt",, GENERIC_READ | GENERIC_WRITE, 0, NULL,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OPEN_EXISTING FILE_ATTRIBUTE_NORMAL, NULL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hMapFile =CreateFileMapping( hFile,&nbsp;NULL,&nbsp;&nbsp; PAGE_READWRITE, 0,100, NULL);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (hMapFile == NULL) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("hMapFile is NULL: last error: %d\n", GetLastError() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hMapFile);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;错误代码 6，&#8220;句柄无效&#8221;，调试检查hFile 句柄，确实有效。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 在PC上工作正常的代码，移植到PDA上会出现这个问题，相当的难受人，唯一的在一个E文网站看到一篇文章有说到，CE,和PPC上不能用CreateFile()得到的句柄作为CreateFileMapping()的输入，该怎么解决却没有看到下文。<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题先放在这了，如果有高手遇到过类似问题，请不吝指教，留下脚印。<br><br><br>仔细看MSDN，原来是自己把自己给忽悠了，上面明明写了要用CreateFileForMapping()来得到句柄，自己一直没有小心看.</p>
<img src ="http://www.cppblog.com/steven/aggbug/87923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2009-06-17 23:41 <a href="http://www.cppblog.com/steven/articles/87923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 hPreInstance 与CreateMutex</title><link>http://www.cppblog.com/steven/articles/68264.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 01 Dec 2008 02:20:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/68264.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/68264.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/68264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/68264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/68264.html</trackback:ping><description><![CDATA[<p>"是否某个程式的第一个执行实体,可以由 WinMain 的参数hPreInstance来判断."---侯捷 MFC 基础编程<br></p>
<p><br>In both Release and debug 模式,hPreInstance每次都会得到0X00000000,并不因为有另外一个实体的存在而得到别的输入.但是CreateMutex()可以侦测到是不是第一个实体.<br><br>不知道是我理解的不对还是这种说法有误？<br>那么，CreateMutex() 又是怎么来实现的呢？<br><br>有点断章取义了，文章后面有说到：<br><br>&nbsp; "以上情况在Windows NT和Windows 95 中略有变化由于Win32 程式的每个执行实体,都有自己的地址空间,共用一个视窗类别已经不可能,hPreInstance 永远为零。"</p>
<img src ="http://www.cppblog.com/steven/aggbug/68264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-12-01 10:20 <a href="http://www.cppblog.com/steven/articles/68264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十进制数转化为二进制，看里面有多少个1</title><link>http://www.cppblog.com/steven/articles/65996.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 05 Nov 2008 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/65996.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/65996.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/65996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/65996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/65996.html</trackback:ping><description><![CDATA[<p>#include "stdafx.h"<br>#include "stdio.h"<br>#include &lt;stdlib.h&gt;<br>#include &lt;process.h&gt;</p>
<p><br>int main(int argc, char* argv[])<br>{<br>&nbsp;int countx = 0,<br>&nbsp;&nbsp;x=9991;<br>&nbsp;char szBinary[64]={0};<br>&nbsp;printf("please input an int data\n",countx);<br>&nbsp;scanf("%d",&amp;x);</p>
<p>&nbsp;itoa(x,szBinary,2);<br>&nbsp;printf("x=%d\t%s\n",x,szBinary);<br>&nbsp;while(x)<br>&nbsp;{<br>&nbsp;&nbsp;countx ++;<br>&nbsp;&nbsp;x = x&amp;(x-1);<br>&nbsp;&nbsp;itoa(x,szBinary,2);<br>&nbsp;&nbsp;printf("x=%d\t%s\n",x,szBinary);<br>&nbsp;}<br>&nbsp;printf("countx=%d\n",countx);<br>&nbsp;system("pause");<br>//&nbsp;printf("press any key to quit\n",countx);<br>&nbsp;return 0;<br>}<br><br>算法固然好,但是不很直观哦<br>其实我觉得只要转化成字符串之后,直接找里面"1"字符就可以了,同样的扩展性更好,可以转化成随意进制,找随意数字的个数 .</p>
<img src ="http://www.cppblog.com/steven/aggbug/65996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-11-05 09:05 <a href="http://www.cppblog.com/steven/articles/65996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>钩子函数</title><link>http://www.cppblog.com/steven/articles/63575.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Thu, 09 Oct 2008 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/63575.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/63575.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/63575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/63575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/63575.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 学习使用钩子函数，一些问题记录下来：<br>&nbsp;&nbsp;<br>1 局部钩子在使用钩子的程序中定义，使用，只能钩使用这个钩子的程序的消息，有些钩子只能做全局钩子。具体见MSDN。<br>
<table align=center>
    <tbody>
        <tr vAlign=top>
            <th align=left width="39%">Hook</th>
            <th align=left width="61%">Scope</th>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_CALLWNDPROC</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_CALLWNDPROCRET</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_CBT</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_DEBUG</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_FOREGROUNDIDLE</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_GETMESSAGE</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_JOURNALPLAYBACK</td>
            <td width="61%">Global only</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_JOURNALRECORD</td>
            <td width="61%">Global only</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_KEYBOARD</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_KEYBOARD_LL</td>
            <td width="61%">Global only</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_MOUSE</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_MOUSE_LL</td>
            <td width="61%">Global only</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_MSGFILTER</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_SHELL</td>
            <td width="61%">Thread or global</td>
        </tr>
        <tr vAlign=top>
            <td width="39%">WH_SYSMSGFILTER</td>
            <td width="61%">Global only</td>
        </tr>
    </tbody>
</table>
使用键盘钩子可以完全钩除消息，使得目标程序得不到键盘消息，在安装钩子的时候处理完了，不把它交给下一个钩子。<br>&nbsp;&nbsp;&nbsp; return CallNextHookEx() 的时候直接return 1,注意不能返回0。<br>剩下一个小问题，钩子钩到的消息中，可以使用GetKeyNameText(lParam,szText,iLen)得到键名，仔细看了lParam的说明和值，实在不明白怎么处理出来的，可能底层还有个对应表之类的东西吧。
<img src ="http://www.cppblog.com/steven/aggbug/63575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-10-09 18:15 <a href="http://www.cppblog.com/steven/articles/63575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>API 往桌面上写东西，把图片往上贴</title><link>http://www.cppblog.com/steven/articles/62820.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Fri, 26 Sep 2008 07:44:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/62820.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/62820.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/62820.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/62820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/62820.html</trackback:ping><description><![CDATA[<p>&nbsp;只是往桌面上写一次,刷新就没有了,如果需要一直显示的话,就需要连续的写和画了.偶尔看了一下,还有不少人踩了上来,怎么就不留个脚印呢?<br><br>#include "stdafx.h"<br>#include "stdio.h"<br>#include "TCHAR.H"</p>
<p><br>HWND&nbsp;&nbsp;hWndDesk;<br>HDC&nbsp;&nbsp;&nbsp;hdc,hdcmem;//hdc1,<br>BITMAP&nbsp;&nbsp;bm; <br>HBITMAP&nbsp;&nbsp;hOldBmp;<br>HPEN&nbsp;&nbsp;hPen;</p>
<p>HANDLE&nbsp;&nbsp;hBitmapImag;</p>
<p>TCHAR&nbsp;&nbsp;szTemp[MAX_PATH]={0};</p>
<p>int APIENTRY WinMain(HINSTANCE hInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSTR&nbsp;&nbsp;&nbsp;&nbsp; lpCmdLine,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nCmdShow)<br>{</p>
<p>&nbsp;char*&nbsp;cpText&nbsp;&nbsp; ="在桌面输出例程";&nbsp;&nbsp;&nbsp;//要显示的字符串&nbsp;&nbsp; <br>&nbsp;hWndDesk=GetDesktopWindow();<br>&nbsp;if(hWndDesk==NULL)<br>&nbsp;&nbsp;MessageBox(NULL,"GetDesktopWindow() fail",NULL,0);<br>&nbsp;hPen=CreatePen(PS_SOLID,20,RGB(255,0,0));<br>&nbsp;if(hPen==NULL) MessageBox(NULL,"CreatePen() fail",NULL,0); </p>
<p>&nbsp;//hdc1=GetDC(hWndDesk);<br>&nbsp;hdc=GetWindowDC(hWndDesk);&nbsp; //hdc1 hdc 的结果不一样，句柄不一样，使用hdc1显示将没有效果,原因GetDC()得到的只是客户区的句柄,而GetWindowDC()得到的是包括非客户区的整个窗口的句柄,你可以在标题栏操作<br>&nbsp;//GetWindowText(hWndDesk,szTemp,MAX_PATH);</p>
<p>&nbsp;&nbsp;TextOut(hdc,100,100, cpText, strlen(cpText)); &nbsp;//在桌面上显示字符串&nbsp; </p>
<p>&nbsp;&nbsp;hBitmapImag=(HBITMAP)LoadImage(NULL,TEXT("c:\\pic.bmp"),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);<br>&nbsp;if(!hBitmapImag) MessageBox(NULL,TEXT("LoadImage() fail"),NULL,0);<br>&nbsp;GetObject( hBitmapImag, sizeof( BITMAP), (LPVOID)&amp;bm); <br>&nbsp;&nbsp;<br>&nbsp;hdcmem=CreateCompatibleDC(hdc);&nbsp;&nbsp; </p>
<p>&nbsp;hOldBmp =(HBITMAP)SelectObject(hdcmem,hBitmapImag);<br>&nbsp;BitBlt(hdc,100,100,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);&nbsp;&nbsp;&nbsp; <br>&nbsp;SelectObject(hdc, hOldBmp);</p>
<p>&nbsp;DeleteObject(hPen);<br>&nbsp;ReleaseDC(hWndDesk,&nbsp;&nbsp; hdc);</p>
<p>&nbsp;return 0;<br>}</p>
<img src ="http://www.cppblog.com/steven/aggbug/62820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-09-26 15:44 <a href="http://www.cppblog.com/steven/articles/62820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EVC 下结束进程</title><link>http://www.cppblog.com/steven/articles/59187.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 18 Aug 2008 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/59187.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/59187.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/59187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/59187.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/59187.html</trackback:ping><description><![CDATA[<p>经常使用程序结束进程，有时候会遇到结束进程失败的情况，不知道该怎么办了？希望哪位高手看到给个解决的办法。<br>在VC编写PC端程序,可以通过获取管理权限来取得结束进程的权限,PDA上不知道如何做.<br><br>这是使用的代码。<br>BOOL PDATerminateProc(CString ProcToKill)<br>{<br>&nbsp;int cntTerminate=0;<br>&nbsp;HANDLE hSnapshot=INVALID_HANDLE_VALUE;<br>&nbsp;PROCESSENTRY32 procEntry;<br>&nbsp;procEntry.dwSize=sizeof(PROCESSENTRY32);<br>&nbsp;CString szProcName;<br>&nbsp;hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);<br>&nbsp;if (hSnapshot)<br>&nbsp;{<br>&nbsp;&nbsp;if (Process32First(hSnapshot,&amp;procEntry))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;szProcName=procEntry.szExeFile;<br>&nbsp;&nbsp;&nbsp;if (!szProcName.CompareNoCase(ProcToKill))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hProcess = OpenProcess(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS_TERMINATE,FALSE,procEntry.th32ProcessID);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(hProcess)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!TerminateProcess(hProcess,0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strError.Format(_T("TerminateProcess() fail\n Error:%d"),GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cntTerminate++;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString strError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strError.Format(_T("OpenProcess() fail\n Error:%d"),GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(GetLastError()==ERROR_ACCESS_DENIED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strError=_T("error!")+strError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;while(Process32Next(hSnapshot,&amp;procEntry))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;szProcName=procEntry.szExeFile;<br>&nbsp;&nbsp;&nbsp;if (!szProcName.CompareNoCase(ProcToKill))<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;HANDLE hProcess = OpenProcess(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PROCESS_TERMINATE,FALSE,procEntry.th32ProcessID);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(hProcess)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!TerminateProcess(hProcess,0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString strError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strError.Format(_T("TerminateProcess() fail\n Error:%d"),GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString strError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strError.Format(_T("OpenProcess() fail\n Error:%d"),GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(GetLastError()==ERROR_ACCESS_DENIED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strError=_T("Error!")+strError;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if (cntTerminate++&gt;=1)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}//else MessageBox(NULL,procEntry.szExeFile,L"debug",MB_OK|MB_TOPMOST);<br>&nbsp;&nbsp;}<br>//&nbsp;&nbsp;CloseToolhelp32Snapshot(hSnapshot);<br>&nbsp;&nbsp;CloseHandle(hSnapshot);<br>&nbsp;}<br>&nbsp;return (cntTerminate&gt;0);<br>}<br><br>返回的错误是ERROR 5:拒绝访问.</p>
<img src ="http://www.cppblog.com/steven/aggbug/59187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-08-18 10:24 <a href="http://www.cppblog.com/steven/articles/59187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定时关闭的对话框窗口</title><link>http://www.cppblog.com/steven/articles/52996.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Thu, 12 Jun 2008 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/52996.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/52996.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/52996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/52996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/52996.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以前有想做一个可以定时关闭的消息对话框,后来淡忘了,今天偶尔浏览到有实现这个功能的代码(来自微软),借来用用.<br>想想也挺简单的.<br>详细见代码.(在VC6.0中测试OK,WINDOWS XP).<br>&nbsp;/***********************************************************************&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THIS&nbsp;&nbsp; CODE&nbsp;&nbsp; AND&nbsp;&nbsp; INFORMATION&nbsp;&nbsp; IS&nbsp;&nbsp; PROVIDED&nbsp;&nbsp; "AS&nbsp;&nbsp; IS"&nbsp;&nbsp; WITHOUT&nbsp;&nbsp; WARRANTY&nbsp;&nbsp; OF&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANY&nbsp;&nbsp; KIND,&nbsp;&nbsp; EITHER&nbsp;&nbsp; EXPRESSED&nbsp;&nbsp; OR&nbsp;&nbsp; IMPLIED,&nbsp;&nbsp; INCLUDING&nbsp;&nbsp; BUT&nbsp;&nbsp; NOT&nbsp;&nbsp; LIMITED&nbsp;&nbsp; TO&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THE&nbsp;&nbsp; IMPLIED&nbsp;&nbsp; WARRANTIES&nbsp;&nbsp; OF&nbsp;&nbsp; MERCHANTABILITY&nbsp;&nbsp; AND/OR&nbsp;&nbsp; FITNESS&nbsp;&nbsp; FOR&nbsp;&nbsp; A&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARTICULAR&nbsp;&nbsp; PURPOSE.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Copyright 1998 Microsoft Corporation. All Rights Reserved.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ***********************************************************************/&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /***********************************************************************&nbsp;&nbsp; <br>&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; MsgBox.c&nbsp;&nbsp; <br>&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; Abstract:&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sample&nbsp;&nbsp; program&nbsp;&nbsp; to&nbsp;&nbsp; demonstrate&nbsp;&nbsp; how&nbsp;&nbsp; a&nbsp;&nbsp; program&nbsp;&nbsp; can&nbsp;&nbsp; display&nbsp;&nbsp; a&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timed&nbsp;&nbsp; message&nbsp;&nbsp; box.&nbsp;&nbsp; <br>&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; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define&nbsp;&nbsp; STRICT&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include&nbsp;&nbsp; &lt;windows.h&gt;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**********************************************************************&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Overview&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp; key&nbsp;&nbsp; to&nbsp;&nbsp; creating&nbsp;&nbsp; a&nbsp;&nbsp; timed&nbsp;&nbsp; message&nbsp;&nbsp; box&nbsp;&nbsp; is&nbsp;&nbsp; exiting&nbsp;&nbsp; the&nbsp;&nbsp; dialog&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; box&nbsp;&nbsp; message&nbsp;&nbsp; loop&nbsp;&nbsp; internal&nbsp;&nbsp; to&nbsp;&nbsp; the&nbsp;&nbsp; message&nbsp;&nbsp; box.&nbsp;&nbsp; Since&nbsp;&nbsp; the&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message&nbsp;&nbsp; loop&nbsp;&nbsp; for&nbsp;&nbsp; a&nbsp;&nbsp; message&nbsp;&nbsp; box&nbsp;&nbsp; is&nbsp;&nbsp; part&nbsp;&nbsp; of&nbsp;&nbsp; USER,&nbsp;&nbsp; you&nbsp;&nbsp; cannot&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modify&nbsp;&nbsp; it&nbsp;&nbsp; without&nbsp;&nbsp; using&nbsp;&nbsp; hooks&nbsp;&nbsp; and&nbsp;&nbsp; other&nbsp;&nbsp; such&nbsp;&nbsp; methods.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; However,&nbsp;&nbsp; all&nbsp;&nbsp; message&nbsp;&nbsp; loops&nbsp;&nbsp; exit&nbsp;&nbsp; when&nbsp;&nbsp; they&nbsp;&nbsp; receive&nbsp;&nbsp; a&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WM_QUIT&nbsp;&nbsp; message.&nbsp;&nbsp; Furthermore,&nbsp;&nbsp; a&nbsp;&nbsp; nested&nbsp;&nbsp; message&nbsp;&nbsp; loop,&nbsp;&nbsp; if&nbsp;&nbsp; it&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; receives&nbsp;&nbsp; a&nbsp;&nbsp; WM_QUIT&nbsp;&nbsp; message,&nbsp;&nbsp; must&nbsp;&nbsp; break&nbsp;&nbsp; the&nbsp;&nbsp; loop&nbsp;&nbsp; and&nbsp;&nbsp; then&nbsp;&nbsp; re-post&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp; quit&nbsp;&nbsp; message&nbsp;&nbsp; so&nbsp;&nbsp; that&nbsp;&nbsp; the&nbsp;&nbsp; next&nbsp;&nbsp; outer&nbsp;&nbsp; layer&nbsp;&nbsp; can&nbsp;&nbsp; process&nbsp;&nbsp; it.&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Therefore,&nbsp;&nbsp; you&nbsp;&nbsp; can&nbsp;&nbsp; get&nbsp;&nbsp; the&nbsp;&nbsp; nested&nbsp;&nbsp; message&nbsp;&nbsp; loop&nbsp;&nbsp; to&nbsp;&nbsp; exit&nbsp;&nbsp; by&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calling&nbsp;&nbsp; PostQuitMessage().&nbsp;&nbsp; The&nbsp;&nbsp; nested&nbsp;&nbsp; message&nbsp;&nbsp; loop&nbsp;&nbsp; will&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clean&nbsp;&nbsp; up&nbsp;&nbsp; and&nbsp;&nbsp; post&nbsp;&nbsp; a&nbsp;&nbsp; new&nbsp;&nbsp; quit&nbsp;&nbsp; message.&nbsp;&nbsp; When&nbsp;&nbsp; the&nbsp;&nbsp; MessageBox&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returns,&nbsp;&nbsp; you&nbsp;&nbsp; peek&nbsp;&nbsp; to&nbsp;&nbsp; see&nbsp;&nbsp; if&nbsp;&nbsp; there&nbsp;&nbsp; is&nbsp;&nbsp; a&nbsp;&nbsp; quit&nbsp;&nbsp; message.&nbsp;&nbsp; If&nbsp;&nbsp; so,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then&nbsp;&nbsp; it&nbsp;&nbsp; means&nbsp;&nbsp; that&nbsp;&nbsp; the&nbsp;&nbsp; message&nbsp;&nbsp; loop&nbsp;&nbsp; was&nbsp;&nbsp; abnormally&nbsp;&nbsp; terminated.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; You&nbsp;&nbsp; also&nbsp;&nbsp; consume&nbsp;&nbsp; the&nbsp;&nbsp; WM_QUIT&nbsp;&nbsp; message&nbsp;&nbsp; instead&nbsp;&nbsp; of&nbsp;&nbsp; re-posting&nbsp;&nbsp; it&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; so&nbsp;&nbsp; that&nbsp;&nbsp; the&nbsp;&nbsp; application&nbsp;&nbsp; continues&nbsp;&nbsp; running.&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Essentially,&nbsp;&nbsp; you&nbsp;&nbsp; have&nbsp;&nbsp; "tricked"&nbsp;&nbsp; the&nbsp;&nbsp; nested&nbsp;&nbsp; message&nbsp;&nbsp; loop&nbsp;&nbsp; into&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thinking&nbsp;&nbsp; that&nbsp;&nbsp; the&nbsp;&nbsp; application&nbsp;&nbsp; is&nbsp;&nbsp; terminating.&nbsp;&nbsp; When&nbsp;&nbsp; it&nbsp;&nbsp; returns,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; you&nbsp;&nbsp; "eat"&nbsp;&nbsp; the&nbsp;&nbsp; quit&nbsp;&nbsp; message,&nbsp;&nbsp; effectively&nbsp;&nbsp; canceling&nbsp;&nbsp; the&nbsp;&nbsp; fake&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quit&nbsp;&nbsp; that&nbsp;&nbsp; you&nbsp;&nbsp; generated.&nbsp;&nbsp; <br>&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; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**********************************************************************&nbsp;&nbsp; <br>&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; MessageBoxTimer&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp; timer&nbsp;&nbsp; callback&nbsp;&nbsp; function&nbsp;&nbsp; that&nbsp;&nbsp; posts&nbsp;&nbsp; the&nbsp;&nbsp; fake&nbsp;&nbsp; quit&nbsp;&nbsp; message,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which&nbsp;&nbsp; causes&nbsp;&nbsp; the&nbsp;&nbsp; message&nbsp;&nbsp; box&nbsp;&nbsp; to&nbsp;&nbsp; exit&nbsp;&nbsp; because&nbsp;&nbsp; it&nbsp;&nbsp; thinks&nbsp;&nbsp; that&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the&nbsp;&nbsp; application&nbsp;&nbsp; is&nbsp;&nbsp; exiting.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **********************************************************************/&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void&nbsp; CALLBACK&nbsp;&nbsp; MessageBoxTimer(HWND&nbsp;&nbsp; hwnd,&nbsp;&nbsp; UINT&nbsp;&nbsp; uiMsg,&nbsp;&nbsp; UINT&nbsp;&nbsp; idEvent,&nbsp;&nbsp; DWORD&nbsp;&nbsp; dwTime)&nbsp;&nbsp; <br>&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; PostQuitMessage(0);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /***********************************************************************&nbsp;&nbsp; <br>&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; TimedMessageBox&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The&nbsp;&nbsp; same&nbsp;&nbsp; as&nbsp;&nbsp; the&nbsp;&nbsp; standard&nbsp;&nbsp; MessageBox,&nbsp;&nbsp; except&nbsp;&nbsp; it&nbsp;&nbsp; also&nbsp;&nbsp; accepts&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; timeout.&nbsp;&nbsp; If&nbsp;&nbsp; the&nbsp;&nbsp; user&nbsp;&nbsp; does&nbsp;&nbsp; not&nbsp;&nbsp; respond&nbsp;&nbsp; within&nbsp;&nbsp; the&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specified&nbsp;&nbsp; timeout,&nbsp;&nbsp; then&nbsp;&nbsp; the&nbsp;&nbsp; value&nbsp;&nbsp; 0&nbsp;&nbsp; is&nbsp;&nbsp; returned&nbsp;&nbsp; instead&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of&nbsp;&nbsp; one&nbsp;&nbsp; of&nbsp;&nbsp; the&nbsp;&nbsp; ID*&nbsp;&nbsp; values.&nbsp;&nbsp; <br>&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; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT&nbsp; TimedMessageBox(HWND&nbsp;&nbsp; hwndParent, LPCTSTR&nbsp;&nbsp; ptszMessage,LPCTSTR&nbsp;&nbsp; ptszTitle,UINT&nbsp;&nbsp; flags, DWORD&nbsp;&nbsp; dwTimeout)&nbsp;&nbsp; <br>&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; UINT&nbsp;&nbsp; idTimer;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT&nbsp;&nbsp; uiResult;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSG&nbsp;&nbsp; msg;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Set&nbsp;&nbsp; a&nbsp;&nbsp; timer&nbsp;&nbsp; to&nbsp;&nbsp; dismiss&nbsp;&nbsp; the&nbsp;&nbsp; message&nbsp;&nbsp; box.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; idTimer&nbsp;&nbsp; =&nbsp;&nbsp; SetTimer(NULL,&nbsp;&nbsp; 0,&nbsp;&nbsp; dwTimeout,&nbsp;&nbsp; (TIMERPROC)MessageBoxTimer);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uiResult&nbsp;&nbsp; =&nbsp;&nbsp; MessageBox(hwndParent,&nbsp;&nbsp; ptszMessage,&nbsp;&nbsp; ptszTitle,&nbsp;&nbsp; flags);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Finished&nbsp;&nbsp; with&nbsp;&nbsp; the&nbsp;&nbsp; timer.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; KillTimer(NULL,&nbsp;&nbsp; idTimer);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; See&nbsp;&nbsp; if&nbsp;&nbsp; there&nbsp;&nbsp; is&nbsp;&nbsp; a&nbsp;&nbsp; WM_QUIT&nbsp;&nbsp; message&nbsp;&nbsp; in&nbsp;&nbsp; the&nbsp;&nbsp; queue.&nbsp;&nbsp; If&nbsp;&nbsp; so,&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; then&nbsp;&nbsp; you&nbsp;&nbsp; timed&nbsp;&nbsp; out.&nbsp;&nbsp; Eat&nbsp;&nbsp; the&nbsp;&nbsp; message&nbsp;&nbsp; so&nbsp;&nbsp; you&nbsp;&nbsp; don't&nbsp;&nbsp; quit&nbsp;&nbsp; the&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; entire&nbsp;&nbsp; application.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; if&nbsp;&nbsp; (PeekMessage(&amp;msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; If&nbsp;&nbsp; you&nbsp;&nbsp; timed&nbsp;&nbsp; out,&nbsp;&nbsp; then&nbsp;&nbsp; return&nbsp;&nbsp; zero.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uiResult&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; uiResult;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /***********************************************************************&nbsp;&nbsp; <br>&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; WinMain&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Program&nbsp;&nbsp; entry&nbsp;&nbsp; point.&nbsp;&nbsp; <br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Demonstrate&nbsp;&nbsp; TimedMessageBox().&nbsp;&nbsp; <br>&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; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; WINAPI&nbsp;&nbsp; WinMain(&nbsp; HINSTANCE&nbsp;&nbsp; hinst,&nbsp; HINSTANCE&nbsp;&nbsp; hinstPrev, LPSTR&nbsp;&nbsp; pszCmdLine,&nbsp; int&nbsp;&nbsp; nCmdShow)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT&nbsp;&nbsp; uiResult;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; Ask&nbsp;&nbsp; the&nbsp;&nbsp; user&nbsp;&nbsp; a&nbsp;&nbsp; question,&nbsp;&nbsp; and&nbsp;&nbsp; give&nbsp;&nbsp; him&nbsp;&nbsp; or&nbsp;&nbsp; her&nbsp;&nbsp; five&nbsp;&nbsp; seconds&nbsp;&nbsp; to&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; answer&nbsp;&nbsp; it.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uiResult&nbsp;&nbsp; =&nbsp;&nbsp; TimedMessageBox(NULL,"Does a triangle have three sides?","Quiz", MB_YESNO,5000);&nbsp;&nbsp; //&nbsp;&nbsp; NULL&nbsp;&nbsp; first&nbsp;&nbsp; parameter&nbsp;&nbsp; is&nbsp;&nbsp; important.&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch&nbsp;&nbsp; (uiResult)&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp; IDYES:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,&nbsp;&nbsp; "That's&nbsp;&nbsp; right!",&nbsp;&nbsp; "Result",&nbsp;&nbsp; MB_OK);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp; IDNO:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,&nbsp;&nbsp; "Believe&nbsp;&nbsp; it&nbsp;&nbsp; or&nbsp;&nbsp; not,&nbsp;&nbsp; triangles&nbsp;&nbsp; "&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "really&nbsp;&nbsp; do&nbsp;&nbsp; have&nbsp;&nbsp; three&nbsp;&nbsp; sides.",&nbsp;&nbsp; "Result",&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MB_OK);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case&nbsp;&nbsp; 0:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox(NULL,&nbsp;&nbsp; "I&nbsp;&nbsp; sensed&nbsp;&nbsp; some&nbsp;&nbsp; hesitation&nbsp;&nbsp; there.&nbsp;&nbsp;&nbsp;&nbsp; "&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "The&nbsp;&nbsp; correct&nbsp;&nbsp; answer&nbsp;&nbsp; is&nbsp;&nbsp; Yes.",&nbsp;&nbsp; "Result",&nbsp;&nbsp; MB_OK);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; 0;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>
<img src ="http://www.cppblog.com/steven/aggbug/52996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-06-12 11:41 <a href="http://www.cppblog.com/steven/articles/52996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SYSTEMTIME  AND LOCALTIME</title><link>http://www.cppblog.com/steven/articles/51158.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 26 May 2008 09:31:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/51158.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/51158.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/51158.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/51158.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/51158.html</trackback:ping><description><![CDATA[<p>小问题一个,哪位大虾见到了请指教.<br><br>如何将SYSTEMTIME 转化成LOCALTIME,没有见到或者是没有找到可以直接使用的函数.<br><br>typedef struct _SYSTEMTIME {&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wYear</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wMonth</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wDayOfWeek</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wDay</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wHour</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wMinute</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wSecond</a>; <br>&nbsp;&nbsp;&nbsp; WORD <a class=synParam onclick=showTip(this) href="">wMilliseconds</a>; <br>} SYSTEMTIME, *PSYSTEMTIME; </p>
<br>假如得到一个时间是个格林威治时间,如何转到本地时间?需要考虑到本地系统可能设置了不同的时区信息.<br><br>如果自己来实现的话有一种想法:<br>&nbsp;&nbsp;&nbsp;GetSystemTime() 和GetLocalTime()得到时区的差别,然后再来处理自己的时间.<br><br>如果用中间处理的话:<br>&nbsp;&nbsp;&nbsp;可以使用SystemTimeToFileTime() 先转化<br>&nbsp;&nbsp;&nbsp;然后使用<br>&nbsp;&nbsp;&nbsp;FileTimeToLocalFileTime(&amp;CreateTime,&amp;LocalFileTime);<br>&nbsp;&nbsp;&nbsp;FileTimeToSystemTime(&amp;LocalFileTime,&amp;SystemTime);<br>来得到.<br>
<img src ="http://www.cppblog.com/steven/aggbug/51158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-05-26 17:31 <a href="http://www.cppblog.com/steven/articles/51158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程权限问题</title><link>http://www.cppblog.com/steven/articles/51109.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 26 May 2008 03:24:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/51109.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/51109.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/51109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/51109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/51109.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;学习任务管理器中进程管理部分发现问题.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以使用进程枚举出所有进程,但是处理进程的时候总是出现问题,无法操作进程,包括访问,结束.代码如下:</p>
<p>&nbsp;HANDLE hProcess=INVALID_HANDLE_VALUE;<br>&nbsp;HANDLE hSnapshot=INVALID_HANDLE_VALUE;<br>&nbsp;hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);<br>&nbsp;PROCESSENTRY32 pe;<br>&nbsp;Process32First(hSnapshot,&amp;pe);<br>&nbsp;do<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;// do what you want<br>&nbsp;&nbsp;hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);<br>&nbsp;&nbsp;if(hProcess==NULL) {<br>&nbsp;&nbsp;&nbsp;_stprintf(szTemp,"OpenProcess() fail\n %d\n%s",GetLastError(),pe.szExeFile);<br>&nbsp;&nbsp;&nbsp;wsprintf(szExePath,_T("%s"),"not get Process handle OpenProcess()");<br>&nbsp;&nbsp;}else if(0==GetModuleFileNameEx((HINSTANCE)hProcess,NULL,szExePath,MAX_PATH))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;_stprintf(szTemp,"GetModuleFileName() fail %d\n%s\n%s",GetLastError(),pe.szExeFile,szExePath);<br>&nbsp;&nbsp;&nbsp;wsprintf(szExePath,_T("%s"),"not get Process handle GetModuleFileName()");<br>&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;}<br>&nbsp;while(Process32Next(hSnapshot,&amp;pe));<br>&nbsp;CloseHandle(hSnapshot);&nbsp;<br><br>OpenProcess() 错误ERROR CODE 5:拒绝访问.需要取得相应的权限.<br><u>OpenProcessToken函数的功能是打开一个与一进程相联系的访问令牌(access&nbsp;token)，它的原型如下： <br>BOOL&nbsp;OpenProcessToken( <br>&nbsp;&nbsp;HANDLE&nbsp;ProcessHandle,&nbsp; <br>&nbsp;&nbsp;DWORD&nbsp;DesiredAccess,&nbsp; <br>&nbsp;&nbsp;PHANDLE&nbsp;TokenHandle <br>); <br><br>如同MSDN上所说，对于Windows&nbsp;XP&nbsp;Professional，如果一台计算机加入到一个工作组中，而且"Force&nbsp;network&nbsp;logons&nbsp;using&nbsp;local&nbsp;accounts&nbsp;to&nbsp;authenticate&nbsp;as&nbsp;Guest"的限制被激活的话，此函数会失败。 <br><br>另外，如果在调用的时候使用了TOKEN_ALL_ACCESS请求，函数也可能会失败。这是因为TOKEN_ALL_ACCESS可能包含了TOKEN_ADJUST_SESSIONID（在Winnt.h中被定义）。TOKEN_ADJUST_SESSIONID是一个新的访问mask，是在Windows&nbsp;2000和Windows&nbsp;XP中新增的。在Windows&nbsp;NT&nbsp;4.0中，访问令牌的访问控制列表中是没有这个值的。所以，如果一个应用程序是使用新的Platform&nbsp;SDK中的Winnt.h但却在Windows&nbsp;NT&nbsp;4.0下运行的话，在调用OpenProcessToken()或者OpenThreadToken时指定了TOKEN_ALL_ACCESS的话，函数也会失败（使用GetLastError()返回的是ERROR_ACCESS_DENIED)。</u> <br><br><u>typedef struct _TOKEN_PRIVILEGES { <br>&nbsp; DWORD </u><a class=synParam onclick=showTip(this) href=""><font color=#0000ff><u>PrivilegeCount</u></font></a><u>; <br>&nbsp; LUID_AND_ATTRIBUTES </u><a class=synParam onclick=showTip(this) href="http://www.cppblog.com/steven/admin/href_cetemp=" ?><font color=#0000ff><u>PrivilegeCount</u></font></a><u>; <br>&nbsp; LUID_AND_ATTRIBUTES </u><a class=synParam onclick=showTip(this) href=""><font color=#0000ff><u>Privileges</u></font></a><u>[]; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES; <br><br><strong>BOOL AdjustTokenPrivileges(<br>&nbsp; HANDLE</strong><em> <a class=synParam onclick=showTip(this) href="">TokenHandle</a></em><strong>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>// handle to token<br><strong>&nbsp; BOOL</strong><em> <a class=synParam onclick=showTip(this) href="http://www.cppblog.com/steven/admin/href_cetemp=" ?>TokenHandle</a></em><strong>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>// handle to token<br><strong>&nbsp; BOOL</strong><em> <a class=synParam onclick=showTip(this) href="">DisableAllPrivileges</a></em><strong>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>// disabling option<br><strong>&nbsp; PTOKEN_PRIVILEGES</strong><em> <a class=synParam onclick=showTip(this) href="">NewState</a></em><strong>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>// privilege information<br><strong>&nbsp; DWORD</strong><em> <a class=synParam onclick=showTip(this) href="http://www.cppblog.com/steven/admin/href_cetemp=" ?>NewState</a></em><strong>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>// privilege information<br><strong>&nbsp; DWORD</strong><em> <a class=synParam onclick=showTip(this) href="">BufferLength</a></em><strong>,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>// size of buffer<br><strong>&nbsp; PTOKEN_PRIVILEGES</strong><em> <a class=synParam onclick=showTip(this) href="">PreviousState</a></em><strong>, </strong>// original state buffer<br><strong>&nbsp; PDWORD</strong><em> <a class=synParam onclick=showTip(this) href="http://www.cppblog.com/steven/admin/href_cetemp=" ?>PreviousState</a></em><strong>, </strong>// original state buffer<br><strong>&nbsp; PDWORD</strong><em> <a class=synParam onclick=showTip(this) href="">ReturnLength</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em>&nbsp; // required buffer size<br><strong>);<br></strong><br></u>在枚举所有进程之前获取操作权限,就可以避免出错的问题,当然参数要设置为Enable.<br><br>BOOL ProcessPrivilege(BOOL bEnable)<br>{<br>&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bResult = TRUE;<br>&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hToken=INVALID_HANDLE_VALUE;<br>&nbsp;TOKEN_PRIVILEGES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TokenPrivileges;</p>
<p>&nbsp;if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&amp;hToken) == 0)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("OpenProcessToken Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bResult = FALSE;<br>&nbsp;}<br>&nbsp;TokenPrivileges.PrivilegeCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1;<br>&nbsp;TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;<br>&nbsp;LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&amp;TokenPrivileges.Privileges[0].Luid);<br>&nbsp;AdjustTokenPrivileges(hToken,FALSE,&amp;TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);<br>&nbsp;&nbsp;&nbsp; if(GetLastError() != ERROR_SUCCESS)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bResult = FALSE;<br>&nbsp;}<br>&nbsp;CloseHandle(hToken);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;return bResult;<br>}</p>
<br>THAT'S ALL. 
<img src ="http://www.cppblog.com/steven/aggbug/51109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-05-26 11:24 <a href="http://www.cppblog.com/steven/articles/51109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wcstombs 小问题</title><link>http://www.cppblog.com/steven/articles/44784.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Tue, 18 Mar 2008 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/44784.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/44784.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/44784.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/44784.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/44784.html</trackback:ping><description><![CDATA[<p>第二次遇到这个问题了，搞了几个小时，真是可恶。<br><br>从UNICODE 文本中读取文本信息，怎么的显示都是乱码，连着试验了好多种读的方法都不对，最后发现读出来的数据是正确的，在解析的时候出错了。我使用了wcstombs()这个函数，可是每次转换之后它返回的值都是-1。<br><br>原因在于，代码页没有进行设置。需要调用locale.h 中定义的一个函数设置默认的代码页。贴点代码放在这里，下次别忘了。<br><br>&nbsp;HANDLE hFile;<br>&nbsp;BYTE&nbsp;&nbsp; buffer[1024]={0};<br>&nbsp;WCHAR&nbsp; wchbuffer[1024];<br>&nbsp;char&nbsp;&nbsp; chbuffer[1024],chmsg[1024];<br>&nbsp;DWORD&nbsp; dwNeedRead=1024;<br>&nbsp;DWORD&nbsp; dwRead=0;<br>&nbsp;int&nbsp;&nbsp;&nbsp; nRet;<br>&nbsp;FILE *fp;<br>&nbsp;hFile=CreateFile("unicode1.txt",GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);<br>&nbsp;if(hFile==INVALID_HANDLE_VALUE){<br>&nbsp;&nbsp;MessageBox("CreateFile() fail","Error",0);<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;nRet=ReadFile(hFile,buffer,2,&amp;dwRead,NULL); // Unicode 标志 0xFFFE<br>&nbsp;if((!nRet)||2!=dwRead){<br>&nbsp;&nbsp;MessageBox("ReadFile() Read first two byte fail","Error",0);<br>&nbsp;&nbsp;CloseHandle(hFile);<br>&nbsp;&nbsp;return;<br>&nbsp;}<br>&nbsp;else&nbsp; MessageBox("ReadFile() Read first two byte OK","debug ",0);</p>
<p>&nbsp;nRet=ReadFile(hFile,buffer,dwNeedRead,&amp;dwRead,NULL);<br>&nbsp;if(!nRet){<br>&nbsp;&nbsp;MessageBox("ReadFile() fail","Error",0);<br>&nbsp;&nbsp;CloseHandle(hFile);<br>&nbsp;&nbsp;return;<br>&nbsp;}</p>
<p>&nbsp;memcpy(wchbuffer,buffer,1024);<br>&nbsp;_tsetlocale(LC_ALL,_T(""));//设置代码页<br>&nbsp;nRet=wcstombs(chbuffer,wchbuffer,sizeof(wchbuffer));<br>&nbsp;if(nRet==1) {<br>&nbsp;&nbsp;sprintf(chmsg,"wcstombs changed :%d Error:%d",nRet,GetLastError());<br>&nbsp;&nbsp;MessageBox(chmsg,"debug",0);<br>&nbsp;}<br><br>要读所有内容的话，还需要处理。</p>
<img src ="http://www.cppblog.com/steven/aggbug/44784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-03-18 17:50 <a href="http://www.cppblog.com/steven/articles/44784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINDOWS.H 说明</title><link>http://www.cppblog.com/steven/articles/40220.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 02 Jan 2008 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/40220.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/40220.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/40220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/40220.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/40220.html</trackback:ping><description><![CDATA[<font face=Arial size=2>Windows程式的开头都可看到：</font>
<div style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><font style="LINE-HEIGHT: 25px" face=Arial size=3>
<pre style="LINE-HEIGHT: 25px">#include &lt;windows.h&gt;</pre>
</font></div>
<p><font style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>WINDOWS.H是主要的含入档案，它包含了其他Windows表头档案，这些表头档案的某些也包含了其他表头档案。这些表头档案中最重要的和最基本的是：<br></font><font style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>WINDEF.H 基本型态定义。<br>WINNT.H 支援Unicode的型态定义。<br>WINBASE.H Kernel函式。<br>WINUSER.H 使用者介面函式。<br>WINGDI.H 图形装置介面函式。<br></font><font style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>这些表头档案定义了Windows的所有资料型态、函式呼叫、资料结构和常数识别字，它们是Windows文件中的一个重要部分。</font></p>
<img src ="http://www.cppblog.com/steven/aggbug/40220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2008-01-02 11:41 <a href="http://www.cppblog.com/steven/articles/40220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cdecl stdcall fastcall</title><link>http://www.cppblog.com/steven/articles/39685.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 26 Dec 2007 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/39685.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/39685.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/39685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/39685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/39685.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;下面的东西没有感觉，先MARK。<br><br>&nbsp;&nbsp;cdecl &nbsp; 由调用者清除堆栈 &nbsp; <br>&nbsp;&nbsp; stdcall &nbsp; 由被调的函数清除堆栈 &nbsp; <br>&nbsp;&nbsp; fastcall &nbsp; 是把函数参数列表的前三个参数放入寄存器eax,edx,ecx,其他参数压栈。<br><br>
<p>函数调用规则指的是调用者和被调用函数间传递参数及返回参数的方法，常用的有Pascal， stdcall，cdecl.</p>
<p>__cdecl&nbsp; C调用规则：</p>
<p>１．在后面的参数先进入堆栈；</p>
<p>２．在函数返回后，调用者要负责清除堆栈．所以这种调用常会生成较大的可执行程序．</p>
<p>__stdcall&nbsp; 又称为WINAPI， 其调用规则：</p>
<p>１．在后面的参数先进入堆栈；</p>
<p>２．被调用的函数在返回前自行清理堆栈，所以生成的代码比cdecl小．</p>
<p>
<p>Pascal 调用规则：</p>
<p>Ｐascal调用规则主要用在案ＷＩＮ１６函数库中，现在基本不用．</p>
<p>１．参数在前的先进入堆栈；</p>
<p>２．不支持可变参数的函数调用．</p>
<img src ="http://www.cppblog.com/steven/aggbug/39685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-12-26 16:27 <a href="http://www.cppblog.com/steven/articles/39685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SelectObject() 装载字体 VC EVC</title><link>http://www.cppblog.com/steven/articles/39653.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 26 Dec 2007 02:17:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/39653.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/39653.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/39653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/39653.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/39653.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用API 在创建的窗口上写字的时候发现一个问题，FONT&nbsp;&nbsp;的句柄必须声明为全局变量，否则在选入字体的时候会返回失败。<br>VC 和EVC在创建字体的方法有点不大一样。VC版如下：<br><br>LRESULT CALLBACK&nbsp;&nbsp;&nbsp; WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)<br>{&nbsp;HDC hdc=NULL;<br>&nbsp;PAINTSTRUCT ps;<br>&nbsp;RECT rt;<br>&nbsp;HBRUSH&nbsp;hbrBkgnd;<br>&nbsp;<span style="COLOR: #ff0000">static </span>HPEN hpenDot;&nbsp;&nbsp;&nbsp;&nbsp; // handle of dotted pen <br>&nbsp;<span style="COLOR: #ff0000">static </span>HFONT hFont;<br>&nbsp;LOGFONT lf;</p>
<p>&nbsp;switch(message){<br>&nbsp;case WM_CREATE: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hpenDot = CreatePen(PS_DOT, 2, RGB(255, 0, 0)); //创建虚线画笔</p>
<p>&nbsp;&nbsp;hFont=CreateFont(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Create Font<br>&nbsp;&nbsp;&nbsp; 15,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nHeight<br>&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nWidth<br>&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nEscapement<br>&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nOrientation<br>&nbsp;&nbsp;&nbsp; FW_NORMAL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nWeight<br>&nbsp;&nbsp;&nbsp; FALSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bItalic<br>&nbsp;&nbsp;&nbsp; FALSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bUnderline<br>&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // cStrikeOut<br>&nbsp;&nbsp;&nbsp; ANSI_CHARSET,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nCharSet<br>&nbsp;&nbsp;&nbsp; OUT_DEFAULT_PRECIS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nOutPrecision<br>&nbsp;&nbsp;&nbsp; CLIP_DEFAULT_PRECIS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nClipPrecision<br>&nbsp;&nbsp;&nbsp; DEFAULT_QUALITY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // nQuality<br>&nbsp;&nbsp;&nbsp; DEFAULT_PITCH | FF_SWISS,&nbsp; // nPitchAndFamily<br>&nbsp;&nbsp;&nbsp; _T("Arial"));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // lpszFacename</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;case WM_COMMAND:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; // do nothing<br>&nbsp;case WM_PAINT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowText(hWnd,"Text test");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdc = BeginPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(NULL==SelectObject(hdc,hFont))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,"fail font","debug",0);&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(NULL==SelectObject(hdc,hpenDot))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,"fail pen","debug",0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetClientRect(hWnd, &amp;rt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_stprintf(szMsg,"((%d,%d),(%d,%d))",rt.left,rt.top,rt.right,rt.bottom);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SetBkColor(hdc,RGB(255,0,0));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;DrawText(hdc, szMsg, strlen(szMsg), &amp;rt, DT_CENTER);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOut(hdc,10,10,szMsg,strlen(szMsg));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle(hdc,100, 100, 550,250);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPaint(hWnd, &amp;ps);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(ghWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;case WM_CLOSE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return DefWindowProc(hWnd,message,wParam,lParam);<br>&nbsp;}<br>&nbsp;return DefWindowProc(hWnd,message,wParam,lParam);<br>}<br><br><br>EVC 版：<br><br>LRESULT CALLBACK DlgProc_Panel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)<br>{<br>&nbsp;static HDC&nbsp;&nbsp;&nbsp;&nbsp;hdc;<br>&nbsp;static PAINTSTRUCT&nbsp;&nbsp;ps;<br>&nbsp;&nbsp;&nbsp; static RECT&nbsp;&nbsp;&nbsp;&nbsp;rt;<br>&nbsp;&nbsp;&nbsp; static HBRUSH&nbsp;&nbsp;&nbsp;hBrush;<br>&nbsp;static COLORREF&nbsp;&nbsp;&nbsp;wColor=RGB(0,0,0);<br>&nbsp;static int&nbsp;&nbsp;&nbsp;&nbsp;nDrawTimes=0;<br>&nbsp;static HFONT&nbsp;&nbsp;&nbsp;hFont;<br>&nbsp;static LOGFONT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_logfnt;<br>&nbsp;TCHAR&nbsp; lfFaceName[32]=&nbsp;TEXT("Times New Roman");<br>&nbsp;m_logfnt.lfCharSet=DEFAULT_CHARSET;<br>&nbsp;m_logfnt.lfClipPrecision=CLIP_DEFAULT_PRECIS;<br>&nbsp;m_logfnt.lfEscapement=0;<br>&nbsp;m_logfnt.lfHeight=80;<br>&nbsp;m_logfnt.lfItalic=false;<br>&nbsp;m_logfnt.lfOrientation=0;<br>&nbsp;m_logfnt.lfPitchAndFamily=FF_SWISS;<br>&nbsp;m_logfnt.lfQuality=DEFAULT_QUALITY;<br>&nbsp;m_logfnt.lfStrikeOut=false;<br>&nbsp;m_logfnt.lfUnderline=true;<br>&nbsp;m_logfnt.lfWeight=800;<br>&nbsp;m_logfnt.lfWidth=20;<br>&nbsp;m_logfnt.lfOutPrecision=OUT_DEFAULT_PRECIS;</p>
<p>&nbsp;</p>
<p><br>&nbsp;switch (message)<br>&nbsp;{<br>&nbsp;case WM_INITDIALOG:<br>&nbsp;&nbsp;hFont=CreateFontIndirect(&amp;m_logfnt);<br>&nbsp;&nbsp;nDrawTimes=0;<br>&nbsp;&nbsp;wColor=RGB(255,0,0);<br>&nbsp;&nbsp;MoveWindowFullScreen(hDlg);<br>&nbsp;&nbsp;break;<br>&nbsp;case WM_PAINT:<br>&nbsp;&nbsp;hdc = BeginPaint(hDlg, &amp;ps);<br>&nbsp;&nbsp;GetClientRect(hDlg, &amp;rt);<br>&nbsp;&nbsp;hBrush=CreateSolidBrush(wColor);<br>&nbsp;&nbsp;FillRect(hdc,&amp;rt,hBrush);<br>&nbsp;&nbsp;//TextOut(hdc, rt.left+10, rt.top+100, "Test", 4);<br>&nbsp;&nbsp;SelectObject(hdc,hFont);<br>&nbsp;&nbsp;SetTextColor(hdc,RGB(0,0,255));<br>&nbsp;&nbsp;rt.top += rt.bottom/2;<br>&nbsp;&nbsp;DrawText(hdc,TEXT("Test\n"),-1,&amp;rt,DT_CENTER);<br>&nbsp;&nbsp;DeleteObject(hBrush);<br>&nbsp;&nbsp;EndPaint(hDlg, &amp;ps);<br>&nbsp;&nbsp;break;&nbsp;<br>&nbsp;case WM_LBUTTONDOWN:<br>&nbsp;case WM_KEYUP:<br>&nbsp;&nbsp;InvalidateRect(hDlg,&amp;rt,TRUE); <br>&nbsp;&nbsp;EndDialog(hDlg,TRUE);<br>&nbsp;&nbsp;break;<br>&nbsp;}<br>&nbsp;&nbsp;&nbsp; return FALSE;<br>}<br><br></p>
<img src ="http://www.cppblog.com/steven/aggbug/39653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-12-26 10:17 <a href="http://www.cppblog.com/steven/articles/39653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC 得到系统版本</title><link>http://www.cppblog.com/steven/articles/38422.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Thu, 13 Dec 2007 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/38422.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/38422.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/38422.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/38422.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/38422.html</trackback:ping><description><![CDATA[<p>Get your OS Version</p>
<p>enum&nbsp;&nbsp; Win32Type{&nbsp;&nbsp; <br>&nbsp; Win32s,&nbsp;&nbsp; <br>&nbsp; WinNT3,&nbsp;&nbsp; <br>&nbsp; Win95,&nbsp;&nbsp; <br>&nbsp; Win98,&nbsp;&nbsp; <br>&nbsp; WinME,&nbsp;&nbsp; <br>&nbsp; WinNT4,&nbsp;&nbsp; <br>&nbsp; Win2000,&nbsp;&nbsp; <br>&nbsp; WinXP&nbsp;&nbsp; <br>&nbsp; };&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp; Win32Type&nbsp;&nbsp; IsShellType()&nbsp;&nbsp; <br>&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp; Win32Type&nbsp;&nbsp;&nbsp;&nbsp; ShellType;&nbsp;&nbsp; <br>&nbsp;&nbsp; DWORD&nbsp;&nbsp; winVer;&nbsp;&nbsp; <br>&nbsp;&nbsp; OSVERSIONINFO&nbsp;&nbsp; *osvi;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; winVer=GetVersion();<br>&nbsp; dwMajorVersion=(DWORD)(LOBYTE(LOWORD(winVer)));<br>&nbsp; dwMinorVersion=(DWORD)(HIBYTE(LOWORD)(winVer)));&nbsp; <br>&nbsp;&nbsp; if(winVer&lt;0x80000000){/*NT&nbsp;&nbsp; */&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; ShellType=WinNT3;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; osvi=&nbsp;&nbsp; (OSVERSIONINFO&nbsp;&nbsp; *)malloc(sizeof(OSVERSIONINFO));&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (osvi!=NULL){&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;memset(osvi,0,sizeof(OSVERSIONINFO));&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;osvi-&gt;dwOSVersionInfoSize=sizeof(OSVERSIONINFO);&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;GetVersionEx(osvi);&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;if(osvi-&gt;dwMajorVersion==4L)ShellType=WinNT4;&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;else&nbsp;&nbsp; if(osvi-&gt;dwMajorVersion==5L&amp;&amp;osvi-&gt;dwMinorVersion==0L)ShellType=Win2000; //version 5.0&nbsp; <br>&nbsp; &nbsp;&nbsp;else&nbsp;&nbsp; if(osvi-&gt;dwMajorVersion==5L&amp;&amp;osvi-&gt;dwMinorVersion==1L)ShellType=WinXP;&nbsp;&nbsp; //version 5.1<br>&nbsp; &nbsp;&nbsp;free(osvi);&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp; &nbsp;else if (LOBYTE(LOWORD(winVer))&lt;4)&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;ShellType=Win32s;&nbsp;&nbsp; <br>&nbsp; &nbsp;else{&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;ShellType=Win95;&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;osvi=&nbsp;&nbsp; (OSVERSIONINFO&nbsp;&nbsp; *)malloc(sizeof(OSVERSIONINFO));&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;if&nbsp;&nbsp; (osvi!=NULL){&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp;memset(osvi,0,sizeof(OSVERSIONINFO));&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp;osvi-&gt;dwOSVersionInfoSize=sizeof(OSVERSIONINFO);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;GetVersionEx(osvi);&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp;if(osvi-&gt;dwMajorVersion==4L&amp;&amp;osvi-&gt;dwMinorVersion==10L)ShellType=Win98;&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp;else&nbsp;&nbsp; if(osvi-&gt;dwMajorVersion==4L&amp;&amp;osvi-&gt;dwMinorVersion==90L)ShellType=WinME;&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;&nbsp;free(osvi);&nbsp;&nbsp; <br>&nbsp; &nbsp;&nbsp;}&nbsp;&nbsp; <br>&nbsp;&nbsp;}&nbsp;&nbsp; <br>&nbsp;&nbsp; return&nbsp;&nbsp; ShellType;&nbsp;&nbsp; <br>&nbsp; }<br><br><br>VC6.0 Windows XP SP2 运行正常</p>
<img src ="http://www.cppblog.com/steven/aggbug/38422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-12-13 14:25 <a href="http://www.cppblog.com/steven/articles/38422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PostMessage and SendMessage</title><link>http://www.cppblog.com/steven/articles/37438.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 28 Nov 2007 07:28:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/37438.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/37438.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/37438.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/37438.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/37438.html</trackback:ping><description><![CDATA[在调试程序的时候发现，用PostMessage 传出去的值在我使用的时候已经发生了变化，百思不得其解。<br><br>用循环去找一个文件，找到的文件名称暂存在一个临时变量里面，找到之后把这个名称传到另外的函数处理，调试发现，处理的总是在我需要的文件后面找到的文件，原因是在我使用的时候那个暂存变量里面的值已经发生了变化（循环已经处理到了下一步了），<br><br>PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列，不管其他程序是否处理都返回，然后继续执行；而SendMessage必须等待其他程序处理消息后才返回，继续执行。这两个函数的返回值也不同，PostMessage的返回值表示PostMessage函数执行是否正确，而SendMessage的返回值表示其他程序处理消息后的返回值。<br><br>使用SendMessage()可以解决这个问题，只不过在时间效率上会有点下降。<br><br>函数原型：<br>&nbsp;&nbsp;&nbsp;LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);<br>&nbsp;&nbsp;&nbsp;BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);<br><br>LRESULT 返回消息被处理的结果，在消息被处理之后才会返回。BOOL 只是返回传送的结果，是不是已经送到消息队列。<br><br>从网络上找到一些资料：<br>&nbsp;&nbsp;&nbsp;<br>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage&nbsp;是异步的，SendMessage&nbsp;是同步的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage 只把消息放到队列，不管消息是不是被处理就返回，消息可能不被处理；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage等待消息被处理完了才返回，如果消息不被处理，发送消息的线程将一直处于阻塞状态，等待消息的返回。<br><br>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同一个线程内：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage 发送消息时，由USER32.DLL模块调用目标窗口的消息处理程序，并将结果返回，SendMessage 在同一个线程里面发送消息不进入线程消息队列；PostMessage 发送的消息要先放到消息队列，然后通过消息循环分派到目标窗口（DispatchMessage）。<br><br>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不同线程：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage 发送消息到目标窗口的消息队列，然后发送消息的线程在USER32。DLL模块内监视和等待消息的处理结果，直到目标窗口的才处理返回，SendMessage在返回之前还需要做许多工作，如响应别的线程向它发送的SendMessage().PostMessge()&nbsp;到别的线程的时候最好使用PostThreadMessage&nbsp;&nbsp;代替。PostMessage()的HWND 参数可以为NULL，相当于PostThreadMessage() + GetCrrentThreadId.<br><br>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统处理消息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统只处理（marshal)系统消息（0--WM_USER)，发送用户消息（用户自己定义）时需要用户自己处理。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用PostMessage,SendNotifyMessage,SendMessageCallback等异步函数发送系统消息时，参数不可以使用指针，因为发送者不等待消息的处理就返回，接收者还没有处理，指针就有可能被释放了，或则内容变化了。<br><br>5 在Windows&nbsp;2000/XP,每个消息队列最多只能存放一定数量的消息，超过的将不会被处理就丢掉。系统默认是10000；：[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows&nbsp;NT\CurrentVersion\Windows]&nbsp;USERPostMessageLimit<br>可以修改（我的系统下没有发现）。<br><br>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">在控制别的应用程序的时候，经常需要等待直到某个功能结束，例如</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">:<br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;打开一个窗口</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">--&gt;</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">等待直到窗口结束 ，</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">这个时候就可以用到</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">SendMessage<br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;如果在打开这个窗口后仍然需要对该窗口的界面进行设置，比如</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">Edit</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">value</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">等等</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">比如：</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打开一个窗口</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">--&gt;</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">控制窗口的</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">control</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的属性</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;这个时候就需要</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">PostMessage<br><br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">使用一个钩子程序截获消息后</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">使用</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">SendMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">把消息发送到主处理程序进行处理</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">但是在主处理程序还没有完成任务的时候</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">被设置钩子的程序进入了停止的状态</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">不可以处理 </span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">WM_PAINT, WM_MOVE, .......</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">等的基本信息</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,&nbsp;</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">必须要等</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">SendMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">发送出的消息完成后</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">才能继续运行</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">整个界面一片空白</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">把钩子消息设置成</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">PostMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的发送消息形式后</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">问题解决</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">!<br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥"><br></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">只是把消息放入队列，不管其他程序是否处理都返回，然后继续执行</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">;<br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;而</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">SendMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">必须等待其他程序处理消息后才返回，继续执行。</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><br><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的返回值表示</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">PostMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">函数执行是否正确</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">;<br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;而</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">SendMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">的返回值表示其他程序处理消息后的返回值。</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">&nbsp;<br></font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">&nbsp;&nbsp;&nbsp;使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,PostMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">会造成消息的滞后性</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">而</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">SendMessage</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">则不会</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Tahoma; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: ˎ̥">但如</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Tahoma"><font face="Times New Roman"><o:p></o:p></font></span>&nbsp;</p>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
<img src ="http://www.cppblog.com/steven/aggbug/37438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-28 15:28 <a href="http://www.cppblog.com/steven/articles/37438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc 画图原理</title><link>http://www.cppblog.com/steven/articles/37134.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Thu, 22 Nov 2007 07:54:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/37134.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/37134.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/37134.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/37134.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/37134.html</trackback:ping><description><![CDATA[绘图原理（转）<br><br>1、Windows 绘图原理<br><br>　　我们在 Windows 环境下看到各种元素，如菜单、按钮、窗口、图像，从根本上说，都是&#8220;画&#8221;出来的。这时的屏幕，就相当于一块黑板，而 Windows 下的各种 GDI 要素，如画笔、画刷等，就相当于彩色粉笔了。我们在黑板上手工画图时，是一笔一划的，电脑亦然。只不过电脑的速度比手工快的太多，所以在我们看起来好像所有的图形文字都是同时出现的。<br><br>2、普通绘图方式的局限<br><br>　　上述绘图方式我们暂且称之为普通绘图方式吧。虽然这种方式能满足相当一部分的绘图需要，但是当要绘制的对象太复杂，尤其是含有位图时，电脑便力不从心了。这时的画面会显示的很慢，对于运动的画面，会给人&#8220;卡&#8221;住了的感觉，总之一个字：不爽。<br><br>3、解决之道：双缓冲<br><br>　　双缓冲的原理可以这样形象的理解：把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个&#8220;虚拟&#8220;的黑板，然后在这块黑板上绘制复杂的图形，等图形全部绘制完毕的时候，再一次性的把内存中绘制好的图形&#8220;拷贝&#8221;到另一块黑板（屏幕）上。采取这种方法可以提高绘图速度，极大的改善绘图效果。下面是原理图：<br><br><img height=360 src="http://www.vckbase.com/document/journal/vckbase46/images/ddb1.jpg" width=408 border=0><br>图一 双缓冲原理示意图<br><br>4、相关的函数介绍<br><br>1)、为屏幕 DC 创建兼容的内存 DC：CreateCompatibleDC()
<pre>if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory;
{
::PostQuitMessage(0);
} </pre>
<p>2)、创建位图：CreateCompatibleBitmap()</p>
<pre>m_Bmp.CreateCompatibleBitmap(&amp;m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp;</pre>
<p>3)、把位图选入设备环境：SelectObject()，可以理解为选择画布</p>
<pre>::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp); </pre>
<p>4)、把绘制好的图形&#8220;拷贝&#8220;到屏幕上：BitBlt()</p>
<pre>pdcView-&gt;BitBlt(0, 0, rt.Width(), rt.Height(), &amp;m_dcMemory, 0, 0, SRCCOPY);</pre>
<p>函数的具体用法详见 MSDN。有一句话我重复了多遍，再说一遍也无妨：MSDN是最好的老师。<br></p>
<img src ="http://www.cppblog.com/steven/aggbug/37134.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-22 15:54 <a href="http://www.cppblog.com/steven/articles/37134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetSystemMetrics 的参数（转）</title><link>http://www.cppblog.com/steven/articles/36955.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 19 Nov 2007 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/36955.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/36955.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/36955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/36955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/36955.html</trackback:ping><description><![CDATA[下面是GetSystemMetrics函数参数nIndex的定义：
<p>1&nbsp;&nbsp;&nbsp;&nbsp;SM_ARRANGE Flags specifying how the system arranged minimized windows. For more information about minimized windows, see the following Remarks section.（说明系统如何处理窗口最小化)</p>
<p>2&nbsp;&nbsp;&nbsp;&nbsp;SM_CLEANBOOT 返回系统启动方式:</p>
<p>　　0 &nbsp;正常启动</p>
<p>　　1&nbsp; 安全模式启动</p>
<p>　　2&nbsp; 网络安全模式启动<br></p>
<p>3&nbsp;&nbsp;&nbsp;&nbsp;SM_CMONITORS CE系统显示模块的个数.(CE&gt;=4.0)<br><br>4　SM_CMOUSEBUTTONS 返回值为系统支持的鼠标键数，返回0，则系统中没有安装鼠标。</p>
<p>5　SM_CXBORDER,　SM_CYBORDER 返回以相素值为单位的Windows窗口边框的宽度和高度，如果Windows的为3D形态，则等同于SM_CXEDGE参数</p>
<p>6　SM_CXCURSOR,SM_CYCURSOR 返回以相素值为单位的标准光标的宽度和高度</p>
<p>7　SM_CXDLGFRAME,SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME</p>
<p>8　SM_CXDOUBLECLK,SM_CYDOUBLECLK 以相素值为单位的双击有效的矩形区域</p>
<p>9　SM_CXEDGE,SM_CYEDGE 以相素值为单位的3D边框的宽度和高度</p>
<p>10&nbsp; SM_CXFIXEDFRAME,SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口（通常是一些对话<br><br>框）的边框的厚度</p>
<p>11　SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME</p>
<p>12　SM_CXFULLSCREEN,SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度</p>
<p>13　SM_CXHSCROLL,SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度</p>
<p>14　SM_CXHTHUMB 以相素为单位的水平滚动条上的滑动块宽度</p>
<p>15　SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度（一般为32*32）</p>
<p>16　SM_CXICONSPACING,SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距，这个距离<br><br>总是大于等于SM_CXICON 和SM_CYICON.</p>
<p>17　SM_CXMAXIMIZED,SM_CYMAXIMIZED 处于顶层的最大化窗口的缺省尺寸</p>
<p>18　SM_CXMAXTRACK,SM_CYMAXTRACK 具有可改变尺寸边框和标题栏的窗口的缺省最大尺寸，如果窗<br><br>口大于这个尺寸，窗口是不可移动的。</p>
<p>19　SM_CXMENUCHECK,SM_CYMENUCHECK 以相素为单位计算的菜单选中标记位图的尺寸</p>
<p>20　SM_CXMENUSIZE,SM_CYMENUSIZE 以相素计算的菜单栏按钮的尺寸</p>
<p>20　SM_CXMIN,SM_CYMIN 窗口所能达到的最小尺寸</p>
<p>21　SM_CXMINIMIZED,SM_CYMINIMIZED 正常的最小化窗口的尺寸</p>
<p>22　SM_CXMINTRACK,SM_CYMINTRACK 最小跟踪距离，当使用者拖动窗口移动距离小于这个值，<br><br>窗口不会移动。</p>
<p>23　SM_CXSCREEN,SM_CYSCREEN 以相素为单位计算的屏幕尺寸。</p>
<p>24　SM_CXSIZE,SM_CYSIZE 以相素计算的标题栏按钮的尺寸</p>
<p>25　SM_CXSIZEFRAME,SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度</p>
<p>26　SM_CXSMICON,SM_CYSMICON 以相素计算的小图标的尺寸，小图标一般出现在窗口标题栏上。</p>
<p>27　M_CXVSCROLL,SM_CYVSCROLL 以相素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度</p>
<p>28　SM_CYCAPTION 以相素计算的普通窗口标题的高度</p>
<p>29　SM_CYMENU 以相素计算的单个菜单条的高度</p>
<p>30　SM_CYSMCAPTION 以相素计算的窗口小标题栏的高度</p>
<p>31　SM_CYVTHUMB 以相素计算的垂直滚动条中滚动块的高度</p>
<p>32　SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0<br><br>则不是。</p>
<p>33　SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。</p>
<p>34　SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。</p>
<p>35　SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标，否则没有安装。</p>
<p>36　SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标，否则没有安装。(Windows NT only)</p>
<p>37　SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换，否则没有。</p>
<img src ="http://www.cppblog.com/steven/aggbug/36955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-19 17:26 <a href="http://www.cppblog.com/steven/articles/36955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BUTTON 控件添加图片</title><link>http://www.cppblog.com/steven/articles/36940.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 19 Nov 2007 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/36940.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/36940.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/36940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/36940.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/36940.html</trackback:ping><description><![CDATA[按钮控件上使用自己的图片方法.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 使用LOADIMAGE() 加载自己的图片<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CButton MyButton;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBITMAP hBitmap= (HBITMAP)LoadImage(AfxGetInstanceHandle(),"D:\\yourImage.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyButton.Create(_T("MyButton"), WS_CHILD|WS_VISIBLE|BS_BITMAP,CRect(150,150,300,250), AfxGetMainWnd(), 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyButton.SetBitmap(hBitmapIn);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dialog BUTTON 控件设置属性为BITMAP,然后使用类函数也可以实现.<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 使用现成的类 CButtonST 的函数SetBitmaps().<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先建立或则链接你的BUTTON<br>CButtonST bstMybutton;<br>...<br>DDX_Control(pDX,IDB_MYBUTTON,bstMybutton);<br>...<br>bstMybutton.SetBitmaps(ID_BITMAP); 
<img src ="http://www.cppblog.com/steven/aggbug/36940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-19 14:08 <a href="http://www.cppblog.com/steven/articles/36940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 调用C 文件</title><link>http://www.cppblog.com/steven/articles/36930.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 19 Nov 2007 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/36930.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/36930.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/36930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/36930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/36930.html</trackback:ping><description><![CDATA[在程序中经常要用到其他程序用到的文件，但是使用的时候会遇到一些问题：<br>&nbsp;&nbsp;&nbsp;1 fatal error C1853: 'ARMV4IRel/Test.pch' is not a precompiled header file created with this compiler<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;2 fatal error C1010: unexpected end of file while looking for precompiled header directive<br><br>&nbsp;&nbsp;&nbsp;工程里面使用预编译头文件，但是C 或则 CPP文件里面没有调用头文件&#8220;StdAfx.h"，可以对整个工程不使用头文件编译，或则在某个单独文件里面选择不使用头文件。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A Project-&gt;Setting-&gt;C/C++-&gt;PreCompiled Headers-&gt;&nbsp;&nbsp; 选择不使用或则自动方式。VC默认使用头文件&#8221;StdAfx.h".<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单个文件时，先在工程里面选中这个文件，然后按照 A步骤操作。<br><br><br>&nbsp;&nbsp;&nbsp;另外,调用C文件的时候也可以直接把*.c文件更名为*.cpp文件,在文件头加入调用头文件的部分.<br><br>(使用VC6.0)<br><br><br>
<img src ="http://www.cppblog.com/steven/aggbug/36930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-19 11:41 <a href="http://www.cppblog.com/steven/articles/36930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册表编辑</title><link>http://www.cppblog.com/steven/articles/36139.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Thu, 08 Nov 2007 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/36139.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/36139.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/36139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/36139.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/36139.html</trackback:ping><description><![CDATA[&nbsp;HKEY&nbsp;hKey;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,<span style="COLOR: #000000">"</span><span style="COLOR: #000000">SOFTWARE\\ODBC\\ODBC.INI</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,KEY_READ,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">hKey);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwSubKeyCount,dwMaxSubKeyNameLength;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RegQueryInfoKey(hKey,NULL,NULL,NULL,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwSubKeyCount,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwMaxSubKeyNameLength,NULL,NULL,NULL,NULL,NULL,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;szSubKeyName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[dwMaxSubKeyNameLength</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwSubKeyName;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(index</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;index</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)dwSubKeyCount;index</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_396_474_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_396_474_Open_Text.style.display='none'; Codehighlighter1_396_474_Closed_Image.style.display='inline'; Codehighlighter1_396_474_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_396_474_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_396_474_Closed_Text.style.display='none'; Codehighlighter1_396_474_Open_Image.style.display='inline'; Codehighlighter1_396_474_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_396_474_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_396_474_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegEnumKeyEx(hKey,index,szSubKeyName,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwSubKeyName,NULL,NULL,NULL,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RegCloseKey(hKey);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RegOpenKeyEx(HKEY_LOCAL_MACHINE,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SOFTWARE\\ODBC\\ODBC.INI\\ODBC&nbsp;Data&nbsp;Sources</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,KEY_READ,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">hKey);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwValueCount,dwMaxValueNameLength;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwValueCount,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwMaxValueNameLength,NULL,NULL,NULL);&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;szValueName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[dwMaxValueNameLength</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwValueName;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(index</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;index</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)dwValueCount;index</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_878_954_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_878_954_Open_Text.style.display='none'; Codehighlighter1_878_954_Closed_Image.style.display='inline'; Codehighlighter1_878_954_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_878_954_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_878_954_Closed_Text.style.display='none'; Codehighlighter1_878_954_Open_Image.style.display='inline'; Codehighlighter1_878_954_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_878_954_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_878_954_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegEnumValue(hKey,index,szValueName,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">dwValueName,NULL,NULL,NULL,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RegCloseKey(hKey);</span><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"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hKey&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;当前打开键的句柄或下列预定义保留的句柄值:&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY_CLASSES_ROOT<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY_CURRENT_CONFIG<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY_CURRENT_USER<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY_LOCAL_MACHINE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY_USERS<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;samDesired&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;制定一个访问标记以描述访问新键的安全性<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;此参数可以是下列值的一个联合&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_ALL_ACCESS<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_QUERY_VALUE,&nbsp;KEY_ENUMERATE_SUB_KEYS,&nbsp;KEY_NOTIFY,&nbsp;KEY_CREATE_SUB_KEY,&nbsp;KEY_CREATE_LINK,&nbsp;和&nbsp;KEY_SET_VALUE&nbsp;访问的联合.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_CREATE_LINK<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许创建严格符号的链接.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_CREATE_SUB_KEY<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许创建子键.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_ENUMERATE_SUB_KEYS<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许枚举子键.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_EXECUTE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许读访问.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_NOTIFY<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许改变通知.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_QUERY_VALUE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许查询子键的数据.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_READ<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_QUERY_VALUE,&nbsp;KEY_ENUMERATE_SUB_KEYS,&nbsp;和&nbsp;KEY_NOTIFY&nbsp;访问的联合.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_SET_VALUE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;允许设置子键的数据.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_WRITE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;KEY_SET_VALUE&nbsp;和&nbsp;KEY_CREATE_SUB_KEY&nbsp;访问的联合.&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;RegOpenKeyEx(<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;待打开的键的句柄</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;lpSubKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;待打开的子键名称的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;ulOptions,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;保留的,必须为0.&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;REGSAM&nbsp;samDesired,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;安全访问标记</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PHKEY&nbsp;phkResult&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;待打开的键的句柄的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;RegQueryInfoKey(<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;待查询的键的句柄</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpClass,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;类字符串缓冲器地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbClass,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;类字符串缓冲器大小的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpReserved,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;保留的,必须为&nbsp;NULL.</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcSubKeys,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;子键数目缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbMaxSubKeyLen,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;最长的子键名称长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbMaxClassLen,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;最长的类字符串长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcValues,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;值项数目缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbMaxValueNameLen,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;最长的值名称长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbMaxValueLen,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;最长的值数据长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbSecurityDescriptor,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;安全描述符长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PFILETIME&nbsp;lpftLastWriteTime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;最近写入时间缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;RegEnumKeyEx(<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HKEY&nbsp;hKey,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;待枚举的键的句柄</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwIndex,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;待枚举的子键的索引</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;子键名称缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;子键缓冲器大小的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpReserved,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;保留的,必须为&nbsp;NULL.</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPTSTR&nbsp;lpClass,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;类字符串缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpcbClass,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;类缓冲器大小的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PFILETIME&nbsp;lpftLastWriteTime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;键的最近写入时间的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;);</span></div>
<img src ="http://www.cppblog.com/steven/aggbug/36139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-08 15:31 <a href="http://www.cppblog.com/steven/articles/36139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetFont() vc SendMessage(WM_FONT...)</title><link>http://www.cppblog.com/steven/articles/35886.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 05 Nov 2007 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/35886.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/35886.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/35886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/35886.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/35886.html</trackback:ping><description><![CDATA[<p>使用SendMessage() 方法时候发现程序字体总是不能达到想要的效果，尝试有Setfont() 去完成时候却可以实现：<br>// global define&nbsp;<br>CFont&nbsp;ResultFont;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;ResultFont.CreateFont( <br>&nbsp;&nbsp;&nbsp;50,<br>&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;FW_NORMAL,<br>&nbsp;&nbsp;&nbsp;FALSE,<br>&nbsp;&nbsp;&nbsp;FALSE,<br>&nbsp;&nbsp;&nbsp;0,<br>&nbsp;&nbsp;&nbsp;ANSI_CHARSET,<br>&nbsp;&nbsp;&nbsp;OUT_DEFAULT_PRECIS,<br>&nbsp;&nbsp;&nbsp;CLIP_DEFAULT_PRECIS,<br>&nbsp;&nbsp;&nbsp;DEFAULT_QUALITY,<br>&nbsp;&nbsp;&nbsp;DEFAULT_PITCH | FF_SWISS,<br>&nbsp;&nbsp;&nbsp;_T("Arial") );&nbsp;<br><br>(CStatic*)this-&gt;GetDlgItem(IDC_STATIC_FONT)-&gt;SetFont(&amp;ResultFont,TRUE); //正常工作</p>
&nbsp;&nbsp;//::SendMessage(::GetDlgItem(this-&gt;m_hWnd,IDC_STATIC_FONT),WM_SETFONT,(WPARAM)(&amp;ResultFont),MAKELPARAM(TRUE,0)); 不正常<br><br>SendDlgItemMessage(IDC_STATIC_FONT,WM_SETFONT,(WPARAM)(&amp;ResultFont)-&gt;GetSafeHandle(),MAKELPARAM(TRUE,0));&nbsp; 正常<br><br><br>
<pre class=syntax>SendMessage(
(HWND) <em>hWnd</em>,              // handle to destination window
WM_SETFONT,               // message to send
(WPARAM) <em><a class=synParam onclick=showTip(this) href=""><u><font color=#0000ff>wParam</font></u></a></em>,          // handle to font
(LPARAM) <em><a class=synParam onclick=showTip(this) href=""><u><font color=#0000ff>lParam</font></u></a></em>           // redraw option
);</pre>
MSDN 里面SendMessage() 里面使用WM_SETFONT参数 wParam 必须使用自己定义的FONT的句柄，而不是使用 FONT 定义的内容。所以错误发生在：<br>(WPARAM)(&amp;ResultFont) 而应该使用 (WPARAM)(&amp;ResultFont)-&gt;GetSafeHandle()。<br>
<img src ="http://www.cppblog.com/steven/aggbug/35886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-11-05 10:53 <a href="http://www.cppblog.com/steven/articles/35886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WM_SHOWWINDOW VS ShowWindow</title><link>http://www.cppblog.com/steven/articles/35619.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 31 Oct 2007 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/35619.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/35619.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/35619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/35619.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/35619.html</trackback:ping><description><![CDATA[<p>今天在遍一个程序的时候发现这个小问题：<br>&nbsp;&nbsp;&nbsp;使用SendDlgItemMessage(hWnd,WM_SHOWWINDOW,(WPARAM)(TRUE),(LPARAM)(0));并不能使窗口的控件从不可见到可见显示。<br>&nbsp;&nbsp;&nbsp;而使用ShowWindow(hWnd,SW_SHOW);则能正常显示。<br><br>事实应该是调用ShowWindow() 之后会发送WM_SHOWWINDOW的消息给系统。一个是消息，一个是应用。</p>
<img src ="http://www.cppblog.com/steven/aggbug/35619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-10-31 18:04 <a href="http://www.cppblog.com/steven/articles/35619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fopen() 与 CreateFile()  操作文件</title><link>http://www.cppblog.com/steven/articles/35043.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 24 Oct 2007 01:43:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/35043.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/35043.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/35043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/35043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/35043.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好长时间了,一直想搞明白fopen() 与 CreateFile() 对文件操作的异同,没有下决心去弄,忙忙就忘掉了,今天从网上找些东西,查查这个问题.<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我估计fopen()的底层实现就是通过CreateFile(),相似的,CFile 中的open() 成员函数也是一样通过 CreateFile实现.下面是问专家的回答.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题: 用fopen()函数生成一个文件和用CreateFile()函数生成一个文件,这两个文件有什么不同?c/c++中的标准库函数如fread() fwrite fseek() fslose()能否可用?是否有功能类似API的函数也可用?请专家赐教非常感谢!!!&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答案: 使用API和标准库函数都可以生成文本文件和二进制文件，在这点上没有区别。同fread()对应的是ReadFile，同fwrite()对应的是WriteFile，同fseek()对应的是SetFilePointer，同fclose对应的是CloseHandle。两套函数都可以使用，你熟悉哪个用哪个。不过API函数可以读写Windows的设备文件，功能更多一些。<br><br>打开文件的几种方式的比较:<br><br>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fopen(TEXT("test.txt"),TEXT("r"));&nbsp;&nbsp;&nbsp;&nbsp; //char&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_tfopen(TEXT("test.txt"),TEXT("r"));&nbsp;&nbsp;&nbsp;//TCHAR (unsigned long)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFile.open(TEXT("test.txt"),CFile::modeCreate , &amp;ex ) //CFile::modeCreate | CFile::modeWrite ,CFileException ex;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);<br><br>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fopen(TEXT("test.txt"),TEXT("w"));&nbsp;&nbsp;&nbsp;&nbsp; //char&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_tfopen(TEXT("test.txt"),TEXT("w"));&nbsp;&nbsp;&nbsp;//TCHAR (unsigned long)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFile.open(TEXT("test.txt"),CFile::modeCreate | CFile::modeWrite|<strong>CFile::modeCreate</strong>, &amp;ex )&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPEN_EXISTING|,FILE_ATTRIBUTE_NORMAL,NULL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果文件打开成功则返回文件句柄，否则返回INVALID_HANDLE_VALUE。通过GetLastError来获取错误信息,文件的关闭很简单，只需要用CloseHandle就可以关闭文件，当文件被关闭时所有缓存内数据都会被写入到磁盘。<br>
<img src ="http://www.cppblog.com/steven/aggbug/35043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-10-24 09:43 <a href="http://www.cppblog.com/steven/articles/35043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma 指令 </title><link>http://www.cppblog.com/steven/articles/34928.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Tue, 23 Oct 2007 08:39:00 GMT</pubDate><guid>http://www.cppblog.com/steven/articles/34928.html</guid><wfw:comment>http://www.cppblog.com/steven/comments/34928.html</wfw:comment><comments>http://www.cppblog.com/steven/articles/34928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/steven/comments/commentRss/34928.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/steven/services/trackbacks/34928.html</trackback:ping><description><![CDATA[<p>#pragma 指令学习<br><br>在所有预处理命令当中，#pragma 指令可能是最复杂的了，它的作用是设定编译器的状态或则指示编译<br>器完成一些特定的动作，#pragma 指令对每个编译器给出了一个方法，在保持与C 和C++语言完全兼容的<br>情况下，给出主机或操作系统专有的特征，依据定义，编译指示是机器或则操作系统专有的，且对每个<br>编译器都是不同的。</p>
<p>其格式一般是： #pragma paramenter&nbsp;<br>其中： paramenter 是参数</p>
<p>（1） message 参数： 它能够在编译信息输出窗口中输出相应的信息，<br>这对于源代码信息的控制是非常重要的，使用方法是：</p>
<p>#pragma message("消息文本")<br>当编译器遇到这条指令的时候就在编译信息输出窗口输出相应的信息,把消息文本打印出来.<br>当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确设置这些宏,<br>此时我们可以用这条指令在编译的时候就进行检查,假设我们希望判断自己有没有在源代码的什么地方定义了 _X86这个<br>宏可以使用下面的方法:<br>#ifdef _X86 <br>#pragma message("_X86 macro activited")<br>#endif</p>
<p>如果我们定义了_X86这个宏,应用程序在编译是就会在编译输出框显示:"_X86 macro activited",我们<br>就不会因为自己不记得是否定义而苦恼了.</p>
<p>(2) 另外一个使用得比较多的pragma&nbsp; 参数是code_seg 格式如:<br>#pragma code_seg ([[{push|pop},][identifier,]]["section-name"["sectin class"]])<br>它能够设置程序中函数代码存放的代码段(位置).(另注:该参数可以用来指定在*.obj 文件中存放的节,<br>观察 *.obj可以使用VC自带的dumpbin命令行程序,函数在*.obj文件中默认的存放字节是 .text节.<br>如果code_seg 没有带参数的话,则函数存放在 .text节<br>push [可选参数] 将一个记录放到内部编译器的堆栈中,可选参数 identifier可以是一个标识符或者节名.<br>pop [可选参数] 将一个记录从堆栈的顶端弹出,可选参数 identifier 可以为一个标识符或者节名.<br>可选参数 identifier,当使用PUSH指令时候,为压入堆栈的记录指派一个标识符,当该标识符被删除的时候和<br>其相关的堆栈中的记录将被弹出堆栈.<br>"segment-name" [可选参数] 表示函数存放的节名.<br>例如:<br>默认情况下,函数被存放在.text中,<br>void func1(){&nbsp;&nbsp; //stored in .text<br>}</p>
<p>将函数存放到节 .my data中<br>#pragma code_seg(".my data1")<br>void func2()[&nbsp;stored in my data<br>}</p>
<p>//r1为标志符,将函数放入.my data2节中 <br>#pragma code_seg (push,r1,".my data2")<br>void func3(){&nbsp;//stored in my data2<br>}</p>
<p>(3) #pragma once 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次.<br>这条指令在VC6里面就有,要考虑到兼容性.</p>
<p>(4) #pragma hdrstop 表示预编译到次为止,对后面的头文件不在进行预编译.<br>BCB可以预编译头文件加快链接的速度,但是如果所有头文件都进行预编译可能占有太多磁盘空间,所以使用<br>这个选项排除一些头文件.<br>有时候单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译. 可以用#pragma startup 指定编译优先级.<br>如果使用了#pragma package(smart_init),BCB就会根据优先级的大小先后编译.</p>
<p>(5) #pragma warning 指令<br>该指令允许有选择性的修改编译器的警告信息行为.<br>指令格式:<br>#pragma warning(warning)specifier;warning-number-list[;warning-specifier;warning-number-list..]<br>#pragma warning(push[n])<br>#pragma warning(pop)</p>
<p>主要用到的警告表示有如下几个:<br>once:只显示一次(警告/错误等)消息<br>default:重置编译器的警告行为到默认状态.<br>1,2,3,4:四个警告级别<br>disable:禁止指定的警告信息.<br>error:将指定的警告信息认为是错误.</p>
<p>#pragma warning(disable:4507 34;once: 4385;error:164) 等价于:<br>#pragma warning(disable:4507 34) //不显示4507 34 号警告信息.<br>#pragma warning(once:4385)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4385号信息只显示一次.<br>#pragma warning(error:164)&nbsp; // 把164号消息作为一个错误.<br>同时这个pragma warning也支持如下格式<br>#pragma warning (push[,n])<br>#pragma warning (pop)<br>#pragma warning (push) &nbsp;//保存所有警告消息的现有警告状态<br>#pragma warning (push,N)&nbsp;//保存所有警告消息的现有警告状态,并且把全局警告等级设定为n;<br>#pragma warning (pop)&nbsp;&nbsp; &nbsp;//向栈中弹出最后一个警告消息,在入栈和出栈之间做的一切改动取消.<br>#pragma warning( push )&nbsp; <br>#pragma warning( disable : 4705 )&nbsp; <br>#pragma warning( disable : 4706 )&nbsp; <br>#pragma warning( disable : 4707 )&nbsp; <br>#pragma warning( pop )<br>在这段代码的最后，重新保存所有的警告信息(包括4705，4706和4707)<br>在使用标准C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,<br>所以我们可以使用#pragma warning(disable:4786)来禁止该类型的警告<br>在vc中使用ADO的时候也会得到不必要的警告信息,这个时候我们可以通过<br>#pragma warning(disable:4146)来消除该类型的警告信息</p>
<p><br>(6)#pragma comment(...)<br>#pragma comment("comment-type"[,commentstring])<br>该指令将一个注释记录放入一个对象文件或可执行文件中 comment-type 类型 one of the five<br>compiler:将编译器的版本号和名称放入目标文件中，本条注释记录将被编译器忽略，如果你为该记录类型<br>提供了commentstring 参数，编译器将产生一个警告，<br>EX： #pragma comment (compiler)</p>
<p>exestr:将commentstring 参数放入目标文件中，在链接的时候这个字符串将被放入到可执行文件中，当操<br>作系统加载可执行文件时，该参数字符串不会被加载到内存中，但是，该参数字符串可以被dumpbin之类的的<br>程序查找并打印出来，你可以用这个标志符号将版本之类的信息潜入到可执行文件中。</p>
<p>lib:这是一个非常常用的关键字，可以帮我们连入一个库文件到目标文件。<br>ex:<br>&nbsp;#pragma comment(lib,"userlib.lib") </p>
<p>linker:<br>将一个链接选项放入目标文件中，你可以使用这个指令来代替命令行传入的或则在开发环境中设置的链接<br>选项，你可以指定/include 选项来强制包含某个对象<br>ex:<br>&nbsp;&nbsp;#pragma comment(linker,"/include:_mySymbol")<br>你可以在程序中设置下列链接选项：<br>&nbsp;/DEFAULTLIB<br>&nbsp;/EXPORT<br>&nbsp;/INCLUDE<br>&nbsp;/MERGE<br>&nbsp;/SECTION<br>详情请参考msdn</p>
<p>user: 将一般的注释信息放入目标文件中，commentstring 参数包含注释的文本信息，这个注释记录将被<br>链接器忽略。<br>ex:<br>&nbsp;#pragma comment(user,"compiled on " _DATE" at "_TIMER_") </p>
<p>&nbsp;</p>
<p>使用#pragma 导出 DLL 函数<br>传统的导出DLL函数的方法是使用模块定义文件(.def),Visual C++ 提供了更简洁方便的方法,那就<br>是"_declspec()" 关键字后面跟"dllexport",告诉链接去导出这个函数.<br>例如 :<br>&nbsp;_declspec(dllexport) int _stdcall MyExportFunction(int iTest);<br>把"__declspec(dllexport)"放在最前面声明,连接生成的DLL&nbsp;就会导出函数"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#77;&#121;&#69;&#120;&#112;&#111;&#114;&#116;&#70;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#64;&#52;">_MyExportFunction@4</a>".<br>上面导出的函数名称也许不是我们希望的,我们希望导出原版"的"MyExportFunction".&nbsp; 可以指定用VC<br>提供的"#pragma"指令来指定链接选项. <br>ex:<br>&nbsp;#pragma comment(linker,"/EXPORT:MyExportFunction=_MyExportFunction@4")</p>
<p>原形:&nbsp; /EXPORT:entryname[,@ordinal[,NONAME]][,DATA]<br>&nbsp;@ordinal 指定顺序;NONAME 指定只将函数导出为序号;DATA关键字指定导出项为数据项.<br></p>
<img src ="http://www.cppblog.com/steven/aggbug/34928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/steven/" target="_blank">steven</a> 2007-10-23 16:39 <a href="http://www.cppblog.com/steven/articles/34928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>