﻿<?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++博客-张志松-随笔分类-VC/MFC</title><link>http://www.cppblog.com/Zezese/category/15793.html</link><description>记录工作点滴，留下人生轨迹。(zezese@163.com)</description><language>zh-cn</language><lastBuildDate>Sun, 22 Dec 2013 17:32:28 GMT</lastBuildDate><pubDate>Sun, 22 Dec 2013 17:32:28 GMT</pubDate><ttl>60</ttl><item><title>获取父进程的ID</title><link>http://www.cppblog.com/Zezese/archive/2012/02/16/165760.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Thu, 16 Feb 2012 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2012/02/16/165760.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/165760.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2012/02/16/165760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/165760.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/165760.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体; ">NTDLL.DLL中有一个函数叫NtQueryInformationProcess，用它可以将指定类型的进程信息拷贝到某个缓冲。<br />其原型如下：</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">NTSYSAPI</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">NTSTATUS</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">NTAPI</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">NtQueryInformationProcess (</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">IN HANDLE ProcessHandle, // 进程句柄</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">IN PROCESSINFOCLASS InformationClass, // 信息类型</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">OUT PVOID ProcessInformation, // 缓冲指针</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">IN ULONG ProcessInformationLength, // 以字节为单位的缓冲大小</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">OUT PULONG ReturnLength OPTIONAL // 写入缓冲的字节数</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">);</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;第一个参数是希望操作的进程句柄，这个句柄必须以PROCESS_QUERY_INFORMATION模式存取。为了取得一个句柄，我们必须用OpenProcess函数：</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;第二个参数是请求信息的类型，这个参数可以有许多个值，本文例子中将用ProcessBasicInformation （值为0）。</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;因此，如果第二个参数是ProcessBasicInformation的话，则第三个参数必须为一个指针指向结构PROCESS_BASIC_INFORMATION：</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">typedef struct</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">{</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD ExitStatus; // 接收进程终止状态</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD PebBaseAddress; // 接收进程环境块地址</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD AffinityMask; // 接收进程关联掩码</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD BasePriority; // 接收进程的优先级类</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULONG UniqueProcessId; // 接收进程ID</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ULONG InheritedFromUniqueProcessId; //接收父进程ID</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">} PROCESS_BASIC_INFORMATION;</span><br style="font-family: 宋体; " /><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">&nbsp;&nbsp; 这个结构的最后一个参数是InheritedFromUniqueProcessId，它就是我们所要的东西。</span><br style="font-family: 宋体; " /><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">DWORD dwParentPID;</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">LONG status;</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">PROCESS_BASIC_INFORMATION pbi;</span><br style="font-family: 宋体; " /><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">status = NtQueryInformationProcess( hProcess,</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">ProcessBasicInformation,</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">(PVOID)&amp;pbi,</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">sizeof(PROCESS_BASIC_INFORMATION),</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">NULL );</span><br style="font-family: 宋体; " /><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">if (!status)</span><br style="font-family: 宋体; " /><span style="font-family: 宋体; ">dwParentPID = pbi.InheritedFromUniqueProcessId;<br /><br /></span><div><a href="http://www.vckbase.com/bbs/prime/viewprime.asp?id=337">http://www.vckbase.com/bbs/prime/viewprime.asp?id=337</a></div><img src ="http://www.cppblog.com/Zezese/aggbug/165760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2012-02-16 17:30 <a href="http://www.cppblog.com/Zezese/archive/2012/02/16/165760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随机数</title><link>http://www.cppblog.com/Zezese/archive/2012/02/07/165084.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Tue, 07 Feb 2012 03:08:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2012/02/07/165084.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/165084.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2012/02/07/165084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/165084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/165084.html</trackback:ping><description><![CDATA[<div>
<div></div>
<div>
<h2>C语言</h2>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　函数名:randomize</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　功 能:初始化随机数发生器</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　用 法:void randomize(void);</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　程序例:</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　#include &lt;stdlib.h&gt;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　int main(void)</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　{</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　int i;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　randomize();</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　printf("Ten random numbers from 0 to 99\n\n");</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　for(i=0; i&lt;10; i++)</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　printf("%d\n", rand() % 100);</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　return 0;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　}</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　注：可以在TC2.0中运行通过，在VC6.0不能运行。</span>
<div style="height: 30px; line-height: 30px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<h2><br />VC中的用法</h2>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　VC中使用srand()来初始化为随机数生成器。代码实例：</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　#include &lt;stdio.h&gt;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　#include &lt;stdlib.h&gt;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　#include &lt;time.h&gt;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　#define N 10</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　main()</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　{</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　int i;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　srand(time(0)); /*设置种子,并生成伪随机序列*/</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　for(i=0;i&lt;N;++i)</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　printf("%d\n",rand()%100);/*得到[0,99]伪随机数*/</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　system("pause");</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　}</span>
<div style="height: 30px; line-height: 30px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<h2>VB 中的用法</h2>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　Randomize 语句示例</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　本示例用 Randomize 语句初始化随机数生成器。由于忽略了数值参数， 所以 Randomize 用 Timer 函数的返回值作为新的随机数种子值。</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　Dim MyValue</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　Randomize ' 对随机数生成器做初始化的动作。</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　MyValue = Int((6 * Rnd) + 1) ' 生成 1 到 7 之间(不包括7)的随机整数。</span>
<div style="height: 30px; line-height: 30px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<h2>Delphi 中的用法</h2>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　以下事例将随机产生0到100的数字，如果不使用Randomize函数，得到的结果将有规律性。</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　procedure TForm1.btn1Click(Sender: TObject);</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　begin</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　randomize;</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　ShowMessage(IntToStr(Random(100)));</span>
<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; font-family: arial, 宋体, sans-serif; background-color: #ffffff; "></div>
<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; background-color: #ffffff; ">　　end;<br /><br /></span><div><a href="http://baike.baidu.com/view/1081216.htm">http://baike.baidu.com/view/1081216.htm<br /><br /><br /><br /></a></div></div>
<div></div>
</div><img src ="http://www.cppblog.com/Zezese/aggbug/165084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2012-02-07 11:08 <a href="http://www.cppblog.com/Zezese/archive/2012/02/07/165084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM应用---遍历网页中的元素(转)</title><link>http://www.cppblog.com/Zezese/archive/2011/12/28/162979.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Wed, 28 Dec 2011 06:08:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/12/28/162979.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/162979.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/12/28/162979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/162979.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/162979.html</trackback:ping><description><![CDATA[<a href="http://www.vckbase.com/document/viewdoc/?id=1446">http://www.vckbase.com/document/viewdoc/?id=1446</a><br /><br /><img src="http://www.vckbase.com/document/journal/vckbase41/images/EnumHtmlEnumimg.jpg"  alt="" /> <img src ="http://www.cppblog.com/Zezese/aggbug/162979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-12-28 14:08 <a href="http://www.cppblog.com/Zezese/archive/2011/12/28/162979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发基于svchost服务的DLL</title><link>http://www.cppblog.com/Zezese/archive/2011/11/07/158492.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Mon, 07 Nov 2011 14:04:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/11/07/158492.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/158492.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/11/07/158492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/158492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/158492.html</trackback:ping><description><![CDATA[<div>1.开发一个导出ServiceMain函数的DLL （假设名为MyService.dll）<br /><br />函数原型为void WINAPI ServiceMain(int argc, wchar_t* argv[])，其他的就和开发普通的EXE服务一样。<br /><br />2.在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下面建一个项 MyService，详细的子项如下图。<br /><br /><img style="width: 456px; height: 153px" height="153" alt="" src="http://www.cppblog.com/images/cppblog_com/zezese/svchost.JPG" width="456" border="0" longdesc="" /><br /><br />Parameters 下面有个可扩展字符串值(REG_EXPAND_SZ) ServiceDll，其值就是MyService.dll的完整路径。<br /><br />3.在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost下面新建一个多行字符串值(REG_MULTI_SZ)，<br />名为mysvcs，值为MyService。<br /><br />为什么名为mysvcs呢？看下上图ImagePath最后面的那个参数就明白了，不一定要叫这个名字，只要这两个一样就行了。<br /><br />在SvcHost下面的每一个多行字符串值，就代表一个SvcHost进程。<br /><br />4.重启电脑生效。<br /><br /></div><img src ="http://www.cppblog.com/Zezese/aggbug/158492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-11-07 22:04 <a href="http://www.cppblog.com/Zezese/archive/2011/11/07/158492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件模块化的思考</title><link>http://www.cppblog.com/Zezese/archive/2011/09/08/155332.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Thu, 08 Sep 2011 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/09/08/155332.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/155332.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/09/08/155332.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/155332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/155332.html</trackback:ping><description><![CDATA[1.模块接口尽量简单，但是可扩展性要强。<br />2.减少模块间的依赖，越少依赖越好管理。<br />3.实现模块自我管理，尽量自己搞定一切。<img src ="http://www.cppblog.com/Zezese/aggbug/155332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-09-08 10:19 <a href="http://www.cppblog.com/Zezese/archive/2011/09/08/155332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用MFC扩展动态库实现插件功能</title><link>http://www.cppblog.com/Zezese/archive/2011/08/21/154003.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sun, 21 Aug 2011 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/08/21/154003.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/154003.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/08/21/154003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/154003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/154003.html</trackback:ping><description><![CDATA[<div>http://www.codeproject.com/KB/library/piarchitecture.aspx</div><img src ="http://www.cppblog.com/Zezese/aggbug/154003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-08-21 10:31 <a href="http://www.cppblog.com/Zezese/archive/2011/08/21/154003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>接口函数参数的可扩展性</title><link>http://www.cppblog.com/Zezese/archive/2011/07/29/152050.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Fri, 29 Jul 2011 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/07/29/152050.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/152050.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/07/29/152050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/152050.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/152050.html</trackback:ping><description><![CDATA[<div>1.用结构体<br /><br />实现：函数根据传入结构体的大小来判断到底传递了哪些参数。<br />优点：程序运行效率高。<br /><div>缺点：不同的语言需要各自定义结构体，一旦需要扩展，每种语言都需要修改结构体的定义。<br />场合：同一个语言调用，频繁调用等。<br /><br /></div>2.用XML字符串<br /><br /><div>实现：函数根据解析传入XML字符串来判断递了哪些参数。<br />缺点：程序运行效率较低。</div><div>优点：不需要定义结构体，只要按照格式拼好字符串就行。<br /><div>场合：跨语言调用，调用次数很少等。</div></div></div><img src ="http://www.cppblog.com/Zezese/aggbug/152050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-07-29 16:31 <a href="http://www.cppblog.com/Zezese/archive/2011/07/29/152050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC程序轻量级模块化的实现</title><link>http://www.cppblog.com/Zezese/archive/2011/07/13/150880.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Wed, 13 Jul 2011 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/07/13/150880.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/150880.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/07/13/150880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/150880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/150880.html</trackback:ping><description><![CDATA[<div>
<p><span style="font-family: 宋体"></span></p>
<div>
<p><span style="font-family: 宋体; times: ">&nbsp;&nbsp;&nbsp;这里介绍一个办法来实现基于</span><span style="font-family: Verdana">MFC</span><span style="font-family: 宋体; times: ">应用程序的模块化，至于为什么要模块化，模块化有哪些优点哪些缺点这里不做讨论。</span></p>
<p><span style="font-family: 宋体; times: ">假设有这样一个工程，有主程序</span><span style="font-family: Verdana">Main.exe</span><span style="font-family: 宋体; times: ">和两个</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">模块</span><span style="font-family: Verdana">Module1.dll</span><span style="font-family: 宋体; times: ">以及</span><span style="font-family: Verdana">Module2.dll</span><span style="font-family: 宋体; times: ">组成，所有的模块都动态链接到</span><span style="font-family: Verdana">MFC</span><span style="font-family: 宋体; times: ">动态库（静态链接到</span><span style="font-family: Verdana">MFC</span><span style="font-family: 宋体; times: ">动态库的情况会有些区别）。</span></p>
<p><span><br /></span><span style="font-family: 宋体; times: ">一、首先要建立先定义好一组接口，用来实现主程序和</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">模块双向交换。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana">1</span><span style="font-family: 宋体; times: ">、主程序</span><span style="font-family: Verdana">Main.exe</span><span style="font-family: 宋体; times: ">要提供一个接口</span><span style="font-size: 12pt; font-family: 新宋体">IApp</span><span style="font-family: 宋体; times: ">给</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">模块，使得</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">模块可以使用主程序的一些功能，比如写日志等。</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">class&nbsp;<span style="color: black">IApp</span></span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">{</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">public:</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;<font color="#0000ff">virtual</font> Long GetVer() = 0;&nbsp; //接口版本号<br /><span style="color: blue">&nbsp;&nbsp;&nbsp;virtual</span>&nbsp;<span style="color: black">ILog</span>*&nbsp;<span style="color: black">GetLog</span>() = 0; //</span><span style="font-size: 12pt; font-family: 新宋体">返回日志接口指针</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; //</span><span style="font-size: 12pt; font-family: 新宋体">这里可以扩展其他的虚函数，但是新的虚函数定义一定要放在原有接口的最后面，这和虚函数表有关。</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; //</span><span style="font-size: 12pt; font-family: 新宋体">这样就达到了可扩展性。</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">};</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana">2</span><span style="font-family: 宋体; times: ">、模块</span><span style="font-family: Verdana">Module1.dll</span><span style="font-family: 宋体; times: ">以及</span><span style="font-family: Verdana">Module2.dll</span><span style="font-family: 宋体; times: ">也要分别提供一个或多个接口给主程序</span><span style="font-family: Verdana">Main.exe</span><span style="font-family: 宋体; times: ">调用。</span></p>
<p><span style="font-family: 宋体; times: ">分别为：</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">class&nbsp;<span style="color: black">IModule1</span></span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">{</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">public:</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">SetApp</span>(<span style="color: black">IApp</span>*&nbsp;<span style="color: black">lpApp</span>) = 0; //</span><span style="font-size: 12pt; font-family: 新宋体">把主程序的接口传给DLL</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">DoSomething</span>() = 0;//</span><span style="font-size: 12pt; font-family: 新宋体">做一些处理</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp; //</span><span style="font-size: 12pt; font-family: 新宋体">这里一样支持可扩展</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">};</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 新宋体">class&nbsp;<span style="color: black">IModule2</span></span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">{<br />public:</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">SetApp</span>(<span style="color: black">IApp</span>*&nbsp;<span style="color: black">lpApp</span>) = 0; //</span><span style="font-size: 12pt; font-family: 新宋体">把主程序的接口传给DLL</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">ShowDlg</span>() = 0;//</span><span style="font-size: 12pt; font-family: 新宋体">显示对话框</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">//</span><span style="font-size: 12pt; font-family: 新宋体">这里一样支持可扩展</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">};</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 新宋体">二、建立各自的MFC工程并实现相应的接口</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 新宋体">1</span><span style="font-size: 12pt; font-family: 新宋体">、建立主程序MFC工程Main.exe，动态链接到MFC动态库，然后实现IApp,ILog等接口。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 新宋体">2</span><span style="font-size: 12pt; font-family: 新宋体">、</span><span style="font-family: 宋体; times: ">建立</span><span style="font-size: 12pt; font-family: 新宋体">MFC</span><span style="font-size: 12pt; font-family: 新宋体">工程</span><span style="font-family: Verdana">Module1.dll</span><span style="font-family: 宋体; times: ">，可以是规则</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">，也可以是非规则</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">，但是要求</span><span style="font-size: 12pt; font-family: 新宋体">动态链接到MFC动态库。</span></p>
<p>&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体; times: ">规则</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">与非规则</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">在资源使用，窗口管理等方面有些区别，一般建议使用非规则</span><span style="font-family: Verdana">DLL</span><span style="font-family: 宋体; times: ">。</span></p>
<p><span style="font-family: Verdana">&nbsp;&nbsp;&nbsp;Module1.dll</span><span style="font-family: 宋体; times: ">不直接导出类，而是导出一些函数来创建对应的接口，比如导出函数</span><span style="font-family: Verdana">CreateModule1Instance()</span><span style="font-family: 宋体; times: ">用来创建</span><span style="font-size: 12pt; font-family: 新宋体">IModule1</span><span style="font-size: 12pt; font-family: 新宋体">实例，以此类推。这是为了把创建实例的代码放在DLL中，也是为了支持将来升级扩展。因为后续版本的</span><span style="font-family: Verdana">Module1.dll</span><span style="font-family: 宋体; times: ">所实例化的对象占用的内存大小可能不一样的，如果把实例化代码放在</span><span style="font-family: Verdana">Exe</span><span style="font-family: 宋体; times: ">中，则需要重新编译</span><span style="font-family: Verdana">Exe</span><span style="font-family: 宋体; times: ">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana">3</span><span style="font-family: 宋体; times: ">、</span><span style="font-family: Verdana">Module2.dll</span><span style="font-family: 宋体; times: ">实现同上。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; times: ">三、扩展升级</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana">1</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体; times: ">不修改接口的扩展</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体; times: ">比如要修改</span><span style="font-size: 12pt; font-family: 新宋体">IModule1</span><span style="font-size: 12pt; font-family: 新宋体">中<span style="background: silver">DoSomething</span>函数所实现的功能，那就只需要修改并升级</span><span style="font-family: Verdana">Module1.dll</span><span style="font-family: 宋体; times: ">即可。</span></p>
<p style="text-indent: 21pt">&nbsp;</p>
<p><span style="font-family: Verdana">2</span><span style="font-family: 宋体; times: ">、需要修改接口的扩展</span></p>
<p>&nbsp;</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体; times: ">修改</span><span style="font-size: 12pt; font-family: 新宋体">IModule2</span><span style="font-size: 12pt; font-family: 新宋体">接口(有可能也需要修改IApp接口)：</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">class&nbsp;<span style="color: black">IModule2</span></span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">{</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">public:</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">SetApp</span>(<span style="color: black">IApp</span>*&nbsp;<span style="color: black">lpApp</span>) = 0;</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">ShowDlg</span>() = 0;</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">virtual</span>&nbsp;<span style="color: blue">void</span>&nbsp;<span style="color: black">DoSomething</span>() = 0;//</span><span style="font-size: 12pt; font-family: 新宋体">增加的函数</span></p>
<p><span style="font-size: 12pt; font-family: 新宋体">};</span></p>
<p><span style="font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; times: ">这样需要修改</span><span style="font-family: Verdana">Module2.dll</span><span style="font-family: 宋体; times: ">和主程序</span><span style="font-family: Verdana">Main.exe</span><span style="font-family: 宋体; times: ">的代码来实现新功能。但是修改后</span><span style="font-family: Verdana">Module2.dll</span><span style="font-family: 宋体; times: ">一样支持老版本的</span><span style="font-family: Verdana">Main.exe</span><span style="font-family: 宋体; times: ">，因此也就只需要维护一个版本的</span><span style="font-family: Verdana">Module2.dll</span><span style="font-family: 宋体; times: ">即可。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; times: ">四、一些应用场合</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana">1</span><span style="font-family: 宋体">、</span>&nbsp;<span style="font-family: 宋体; times: ">不用的客户使用不同的模块，从而实现业务逻辑的不同。（比如使用不同的数据库。）</span></p>
<p>&nbsp;</p>
<p><span style="font-family: Verdana">2</span><span style="font-family: 宋体">、</span>&nbsp;<span style="font-family: 宋体; times: ">主程序需求相对稳定，但是某个模块功能经常需要升级。（需求特别紧急的情况下，其好处更是明显，目前笔者的产品就是这样的。）</span></p></div>
<p><br /></p></div><img src ="http://www.cppblog.com/Zezese/aggbug/150880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-07-13 18:00 <a href="http://www.cppblog.com/Zezese/archive/2011/07/13/150880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC简单调用ADO访问数据库</title><link>http://www.cppblog.com/Zezese/archive/2011/06/23/149283.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Thu, 23 Jun 2011 07:17:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/06/23/149283.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/149283.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/06/23/149283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/149283.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/149283.html</trackback:ping><description><![CDATA[<div><div><span style="white-space: pre; ">	&nbsp;&nbsp;&nbsp;#include &lt;msado15.h&gt;<br /><br /></span></div><div><div><span style="white-space:pre">	</span>CComPtr&lt;_ADOConnection&gt; pADOConnection;</div><div></div><div><span style="white-space:pre">	</span>//创建连接对象</div><div><span style="white-space:pre">	</span>HRESULT hr = pADOConnection.CoCreateInstance(L"ADODB.Connection");</div><div></div><div><span style="white-space:pre">	</span>if (FAILED(hr))</div><div><span style="white-space:pre">	</span>{ &nbsp;</div><div><span style="white-space:pre">		</span>MessageBox(_T("无法创建ADO对象!"));</div><div><span style="white-space:pre">		</span>return ;</div><div><span style="white-space:pre">	</span>}</div><div></div><div><span style="white-space:pre">	</span>//设置游标</div><div><span style="white-space:pre">	</span>pADOConnection-&gt;put_CursorLocation(adUseClientBatch);</div><div></div><div><span style="white-space:pre">	</span>CString strCon("DSN=netbar;");</div><div></div><div><span style="white-space:pre">	</span>//打开数据库连接</div><div><span style="white-space:pre">	</span>hr = pADOConnection-&gt;Open(strCon.AllocSysString());</div><div></div><div><span style="white-space:pre">	</span>CComVariant v;</div><div></div><div><span style="white-space:pre">	</span>CComPtr&lt;_ADORecordset&gt; pRst;</div><div></div><div><span style="white-space:pre">	</span>CString strSQL("SELECT * FROM activemember");</div><div></div><div><span style="white-space:pre">	</span>//查询返回记录集</div><div><span style="white-space:pre">	</span>hr = pADOConnection-&gt;Execute(strSQL.AllocSysString(), &amp;v, 0, &amp;pRst);</div><div></div><div><span style="white-space:pre">	</span>long count = 0;</div><div><span style="white-space:pre">	</span>pRst-&gt;get_RecordCount(&amp;count);</div><div></div><div><span style="white-space:pre">	</span>//移到第一个跳记录</div><div><span style="white-space:pre">	</span>pRst-&gt;MoveFirst();</div><div></div><div><span style="white-space:pre">	</span>CComPtr&lt;ADOFields&gt; pADOFields;</div><div></div><div><span style="white-space:pre">	</span>//读取所有的字段</div><div><span style="white-space:pre">	</span>pRst-&gt;get_Fields(&amp;pADOFields);</div><div></div><div><span style="white-space:pre">	</span></div><div><span style="white-space:pre">	</span>CComVariant vFieldsName("memberId"); //可以是字段名称也可以是编号</div><div></div><div><span style="white-space:pre">	</span>CComPtr&lt;ADOField&gt; pADOField;</div><div></div><div><span style="white-space:pre">	</span>//获取指定的字段</div><div><span style="white-space:pre">	</span>pADOFields-&gt;get_Item(vFieldsName, &amp;pADOField);</div><div></div><div><span style="white-space:pre">	</span>pADOField-&gt;get_Value(&amp;v);</div><div></div><div><span style="white-space:pre">	</span>pRst-&gt;Close();</div><div></div><div><span style="white-space:pre">	</span>//关闭数据库连接</div><div><span style="white-space:pre">	</span>pADOConnection-&gt;Close();</div></div><div></div></div><img src ="http://www.cppblog.com/Zezese/aggbug/149283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-06-23 15:17 <a href="http://www.cppblog.com/Zezese/archive/2011/06/23/149283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC简单调用MSXML</title><link>http://www.cppblog.com/Zezese/archive/2011/06/22/149212.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Wed, 22 Jun 2011 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/06/22/149212.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/149212.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/06/22/149212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/149212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/149212.html</trackback:ping><description><![CDATA[<div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1、包含头文件<br />#include &lt;MsXml2.h&gt;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#include &lt;comutil.h&gt;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">#pragma comment(lib, "comsuppw.lib")<br /><br />2、例子代码<br /><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>CComPtr&lt;IXMLDOMDocument&gt; pDoc;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>HRESULT hr = pDoc.CoCreateInstance(__uuidof(DOMDocument30));</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>if (FAILED(hr))</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>{ &nbsp;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>MessageBox(_T("无法创建DOMDocument对象！"));</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>return ;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>}</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>CString strXML;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>strXML = "&lt;t publishid=\"14\" gender=\"2\" starttime=\"2011-06-22 16:50:42\" endtime=\"2011-06-30 16:50:42\" tipsshowtype=\"0\" onlineminites=\"0\" hideseconds=\"5\" url=\"http://192.168.10.93:8080/dodonew/front/resource/hometemplate/showtips3.htm?publishId=14\" /&gt;";</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>VARIANT_BOOL bRet = VARIANT_FALSE;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>//加载文件或XML文本</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>//pDoc-&gt;load()</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>pDoc-&gt;loadXML(strXML.AllocSysString(), &amp;bRet);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>if (!bRet)</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>{</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>return;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>}</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>CString strNode(_T("//t"));</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>IXMLDOMNode* pNode = NULL;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>pDoc-&gt;selectSingleNode(strNode.AllocSysString(), &amp;pNode);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>long count = 0;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>//节点属性,放在链表中</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>IXMLDOMNamedNodeMap* pAttrMap = NULL;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>pNode-&gt;get_attributes(&amp;pAttrMap);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>pAttrMap-&gt;get_length(&amp;count);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>for (long i = 0; i &lt; count; i++)</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>{</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>IXMLDOMNode* pAttrItem = NULL;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>pAttrMap-&gt;get_item(i, &amp;pAttrItem);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>//取得节点的值</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>_variant_t variantValue;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>pAttrItem-&gt;get_nodeTypedValue(&amp;variantValue);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>_bstr_t bstrValue = variantValue;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>CString strValue = bstrValue;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>TRACE("%s\n", strValue);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>}</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>//子节点, 放在链表中</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>IXMLDOMNodeList* pNodeList = NULL;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>pNode-&gt;get_childNodes(&amp;pNodeList);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>pNodeList-&gt;get_length(&amp;count);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>for (long i = 0; i &lt; count; i++)</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>{</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>IXMLDOMNode* pChildNode = NULL;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>pNodeList-&gt;get_item(i, &amp;pChildNode);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>_variant_t variantValue;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>pChildNode-&gt;get_nodeTypedValue(&amp;variantValue);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>_bstr_t bstrValue = variantValue;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>CString strValue = bstrValue;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">		</span>TRACE("%s\n", strValue);</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="white-space: pre; ">	</span>}</div><div></div></div></div></div><img src ="http://www.cppblog.com/Zezese/aggbug/149212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-06-22 22:48 <a href="http://www.cppblog.com/Zezese/archive/2011/06/22/149212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>选用map还是hash_map</title><link>http://www.cppblog.com/Zezese/archive/2011/03/31/143101.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Thu, 31 Mar 2011 05:20:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/03/31/143101.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/143101.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/03/31/143101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/143101.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/143101.html</trackback:ping><description><![CDATA[选用map还是hash_map，关键是看关键字查询操作次数，以及你所需要保证的是查询总体时间还是单个查询的时间。如果是要很多次操作，要求其整体效率，那么使用hash_map，平均处理时间短。如果是少数次的操作，使用 hash_map可能造成不确定的O(N)，那么使用平均处理时间相对较慢、单次处理时间恒定的map，考虑整体稳定性应该要高于整体效率，因为前提在操作次数较少。如果在一次流程中，使用hash_map的少数操作产生一个最坏情况O(N)，那么hash_map的优势也因此丧尽了。
<img src ="http://www.cppblog.com/Zezese/aggbug/143101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-03-31 13:20 <a href="http://www.cppblog.com/Zezese/archive/2011/03/31/143101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC多语言资源</title><link>http://www.cppblog.com/Zezese/archive/2011/03/22/142476.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Tue, 22 Mar 2011 06:26:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/03/22/142476.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/142476.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/03/22/142476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/142476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/142476.html</trackback:ping><description><![CDATA[<p><br>实现MFC编译时多语言方案<br><br><a href="http://blog.csdn.net/John_Yang/archive/2010/05/02/5549400.aspx">http://blog.csdn.net/John_Yang/archive/2010/05/02/5549400.aspx</a>&nbsp;<br><br><br>关键是定义 AFX_RESOURCE_DLL 和 &nbsp;AFX_TARG_GNU （具体语言不同）</p>
<img src ="http://www.cppblog.com/Zezese/aggbug/142476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-03-22 14:26 <a href="http://www.cppblog.com/Zezese/archive/2011/03/22/142476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多次调用 LeaveCriticalSection 导致死锁</title><link>http://www.cppblog.com/Zezese/archive/2011/02/14/140020.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Mon, 14 Feb 2011 05:47:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/02/14/140020.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/140020.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/02/14/140020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/140020.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/140020.html</trackback:ping><description><![CDATA[MSDN:<br>
<p>If a thread calls <a><strong>LeaveCriticalSection</strong></a> when it does not have ownership of the specified critical section object, an error occurs that may cause another thread using <a><strong>EnterCriticalSection</strong></a> to wait indefinitely.</p>
<br>比如在MFC中使用<br><br>CCriticalSection m_MyCriticalSection; // 模块级变量<br><br><br>在某个函数中：<br><br>CSingleLock lock(&amp;m_MyCriticalSection, TRUE);<br><br>//使用下面这行代码提前解除锁定，将会导致死锁，<br>//因为CSingleLock 的虚构函数还会调用一次m_MyCriticalSection.Unlock()<br><br>//m_MyCriticalSection.Unlock();<br><br>//要使用下面这行代码代替，因为这样CSingleLock 的虚构函数不会再调用m_MyCriticalSection.Unlock()<br>lock.Unlock();<br>
<img src ="http://www.cppblog.com/Zezese/aggbug/140020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-02-14 13:47 <a href="http://www.cppblog.com/Zezese/archive/2011/02/14/140020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建没有焦点的窗口</title><link>http://www.cppblog.com/Zezese/archive/2011/02/11/139895.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Fri, 11 Feb 2011 07:17:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/02/11/139895.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/139895.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/02/11/139895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/139895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/139895.html</trackback:ping><description><![CDATA[<p>WS_EX_NOACTIVATE<br><br><br>BOOL CNoActiveWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT&amp; rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)<br>{<br><br>//可以创建时直接使用标志WS_EX_NOACTIVATE<br><br>&nbsp;if (!CreateEx(WS_EX_APPWINDOW | WS_EX_NOACTIVATE, lpszClassName, NULL, WS_POPUP | WS_VISIBLE,<br>&nbsp;&nbsp;10, 10, 100, 100, NULL, NULL, NULL))<br>&nbsp;{<br>&nbsp;&nbsp;return FALSE;<br>&nbsp;}</p>
<p><br>//也可以创建后修改<br>&nbsp;//ModifyStyleEx(0, WS_EX_NOACTIVATE);<br>}</p>
<img src ="http://www.cppblog.com/Zezese/aggbug/139895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-02-11 15:17 <a href="http://www.cppblog.com/Zezese/archive/2011/02/11/139895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>像写本地线程函数一样写远程线程函数</title><link>http://www.cppblog.com/Zezese/archive/2011/01/28/139520.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Fri, 28 Jan 2011 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/01/28/139520.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/139520.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/01/28/139520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/139520.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/139520.html</trackback:ping><description><![CDATA[<p>由于每个WIN32进程拥有独立的地址空间，所以写远程线程函数不像写本地线程函数那样简单。<br><br>这里提供一个办法，像写本地线程函数一样写远程线程函数。（<a href="http://www.cppblog.com/Files/Zezese/RemoteThreadLib.rar">下载头文件和LIB文件</a>）<br><br>/**<br>*创建远程线程<br>*/<br>HANDLE CreateRemoteThreadEx(<br>&nbsp;&nbsp;&nbsp;HANDLE hProcess,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//目标进程句柄，拥有PROCESS_ALL_ACCESS访问权限。<br>&nbsp;&nbsp;&nbsp;HMODULE hModule,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//线程函数所在的模块，可以是EXE（直接传NULL）也可以是DLL。<br>&nbsp;&nbsp;&nbsp;LPTHREAD_START_ROUTINE lpStartAddress,&nbsp;//线程函数地址。<br>&nbsp;&nbsp;&nbsp;LPVOID lpParameter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//线程函数参数，可以为NULL。<br>&nbsp;&nbsp;&nbsp;);<br><br><br>例子：<br><br>#include "stdafx.h"<br>#include &lt;Windows.h&gt;<br>#include "RemoteThreadLib.h"</p>
<p>//修改默认基址<br>#pragma comment(linker, "/BASE:0x13150000")</p>
<p><br>//远程线程函数</p>
<p>static DWORD WINAPI ThreadFunc(LPVOID pData) <br>{<br>&nbsp;while (TRUE)<br>&nbsp;{<br>&nbsp;&nbsp;//这里可以调用WINDOWS API以及你自己在这个模块里实现的函数和类等。</p>
<p>&nbsp;&nbsp;OutputDebugString("ThreadFunc");</p>
<p>&nbsp;&nbsp;MessageBox(NULL, "My Remote Thread Message!", "RemoteThreadLib", MB_OK);</p>
<p>&nbsp;&nbsp;Sleep(5 * 1000);<br>&nbsp;}</p>
<p>&nbsp;return 0;<br>}</p>
<p>int _tmain(int argc, _TCHAR* argv[])<br>{<br>&nbsp;EnableDebugPrivilege(TRUE); //提权</p>
<p>&nbsp;HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 4000); //从任务管理器找一个进程ID，比如记事本<br>&nbsp;<br>&nbsp;if (hProcess != NULL)<br>&nbsp;{<br>&nbsp;&nbsp;HANDLE hThread = CreateRemoteThreadEx(hProcess, GetModuleHandle(NULL), ThreadFunc, NULL);</p>
<p>&nbsp;&nbsp;if (hThread != NULL)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;//成功<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;CloseHandle(hProcess);<br>&nbsp;}</p>
<p>&nbsp;return 0;<br>}<br><br>VS2003+XP下调试通过！</p>
<img src ="http://www.cppblog.com/Zezese/aggbug/139520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-01-28 11:56 <a href="http://www.cppblog.com/Zezese/archive/2011/01/28/139520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模拟鼠标点击精确位置</title><link>http://www.cppblog.com/Zezese/archive/2011/01/27/139428.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Thu, 27 Jan 2011 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/01/27/139428.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/139428.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/01/27/139428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/139428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/139428.html</trackback:ping><description><![CDATA[<p>&nbsp;//首先获取当前鼠标的位置<br>CPoint point;<br>&nbsp;GetCursorPos(&amp;point);</p>
<p>//计算要点击的位置，将像素坐标转换鼠标能认识的坐标</p>
<p>&nbsp;DWORD dx = 200 * 65536 / GetSystemMetrics(SM_CXSCREEN);<br>&nbsp;DWORD dy =&nbsp;200 * 65536 / GetSystemMetrics(SM_CYSCREEN);<br>&nbsp;<br>//移动鼠标，模拟点击鼠标左键<br>&nbsp;mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,<br>&nbsp;&nbsp;dx, dy, 0, GetMessageExtraInfo());</p>
<p>&nbsp;//恢复鼠标到原来的位置<br>SetCursorPos(point.x, point.y);</p>
<img src ="http://www.cppblog.com/Zezese/aggbug/139428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-01-27 13:17 <a href="http://www.cppblog.com/Zezese/archive/2011/01/27/139428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调用VBScript的正则表达式功能</title><link>http://www.cppblog.com/Zezese/archive/2011/01/09/138192.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sun, 09 Jan 2011 06:04:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/01/09/138192.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/138192.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/01/09/138192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/138192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/138192.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red"><strong>头文件：<br></strong></span><br>#pragma once</p>
<p>namespace VBScript_RegExp_55<br>{</p>
<p>class CMatch2 : protected COleDispatchDriver<br>{<br>&nbsp;friend class CMatchCollection2;</p>
<p>&nbsp;CMatch2(LPDISPATCH pDispatch);</p>
<p>public:</p>
<p>&nbsp;CString GetValue();</p>
<p>&nbsp;LONG GetFirstIndex();</p>
<p>&nbsp;LONG GetLength();<br>};</p>
<p>class CMatchCollection2 : protected COleDispatchDriver<br>{<br>&nbsp;friend class CRegExp2;</p>
<p>&nbsp;CMatchCollection2(LPDISPATCH pDispatch);</p>
<p>public:</p>
<p>&nbsp;CMatch2 GetItem(LONG index);<br>&nbsp;<br>&nbsp;LONG GetCount();<br>};</p>
<p>// CRegExp2 包装类</p>
<p>class&nbsp; CRegExp2 : public COleDispatchDriver<br>{<br>public:</p>
<p>&nbsp;CRegExp2(); // 调用 COleDispatchDriver 默认构造函数<br>&nbsp;<br>&nbsp;~CRegExp2();</p>
<p>&nbsp;BOOL CreateByReg();</p>
<p>private:</p>
<p>&nbsp;CRegExp2(const CRegExp2 &amp;rhs);<br>&nbsp;CRegExp2 &amp;operator=(const CRegExp2 &amp;rhs);</p>
<p>&nbsp;// IRegExp2 方法<br>public:</p>
<p>&nbsp;CString GetPattern();<br>&nbsp;void SetPattern(LPCTSTR newValue);</p>
<p>&nbsp;BOOL IsIgnoreCase();<br>&nbsp;void SetIgnoreCase(BOOL newValue = TRUE);</p>
<p>&nbsp;BOOL IsGlobal();<br>&nbsp;void SetGlobal(BOOL newValue = TRUE);</p>
<p>&nbsp;BOOL IsMultiline();<br>&nbsp;void SetMultiline(BOOL newValue = TRUE);</p>
<p>&nbsp;CMatchCollection2 Execute(LPCTSTR sourceString);<br>&nbsp;<br>&nbsp;BOOL Test(LPCTSTR sourceString);</p>
<p>&nbsp;CString Replace(LPCTSTR sourceString, LPCTSTR replaceString);<br>};</p>
<p>}<br><br><strong><span style="COLOR: red">实现文件：</span></strong><br><br>#include "stdafx.h"<br>#include "RegExp.h"</p>
<p>using namespace VBScript_RegExp_55;</p>
<p>//******************************************************************************</p>
<p>CMatch2::CMatch2(LPDISPATCH pDispatch) <br>: COleDispatchDriver(pDispatch)<br>{</p>
<p>}</p>
<p>CString CMatch2::GetValue()<br>{<br>&nbsp;CString result;<br>&nbsp;InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>LONG CMatch2::GetFirstIndex()<br>{<br>&nbsp;LONG result;<br>&nbsp;InvokeHelper(0x2711, DISPATCH_PROPERTYGET, VT_I4, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>LONG CMatch2::GetLength()<br>{<br>&nbsp;LONG result;<br>&nbsp;InvokeHelper(0x2712, DISPATCH_PROPERTYGET, VT_I4, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>//******************************************************************************</p>
<p>CMatchCollection2::CMatchCollection2(LPDISPATCH pDispatch) <br>: COleDispatchDriver(pDispatch)<br>{<br>&nbsp;TRACE("CMatchCollection2::CMatchCollection2\r\n");<br>}</p>
<p><br>CMatch2 CMatchCollection2::GetItem(LONG index)<br>{<br>&nbsp;LPDISPATCH result = NULL;<br>&nbsp;static BYTE parms[] = VTS_I4 ;<br>&nbsp;InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&amp;result, parms, index);<br>&nbsp;<br>&nbsp;return CMatch2(result);<br>}</p>
<p>LONG CMatchCollection2::GetCount()<br>{<br>&nbsp;LONG result = 0;<br>&nbsp;InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_I4, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>//******************************************************************************</p>
<p>CRegExp2::CRegExp2()<br>{</p>
<p>}</p>
<p>CRegExp2::~CRegExp2()<br>{<br>&nbsp;ReleaseDispatch();<br>}</p>
<p>BOOL CRegExp2::CreateByReg()<br>{<br>&nbsp;return CreateDispatch(_T("VBScript.RegExp"));<br>}</p>
<p>CString CRegExp2::GetPattern()<br>{<br>&nbsp;CString result;<br>&nbsp;InvokeHelper(0x2711, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>void CRegExp2::SetPattern(LPCTSTR newValue)<br>{<br>&nbsp;static BYTE parms[] = VTS_BSTR ;<br>&nbsp;InvokeHelper(0x2711, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);<br>}</p>
<p>BOOL CRegExp2::IsIgnoreCase()<br>{<br>&nbsp;BOOL result = FALSE;<br>&nbsp;InvokeHelper(0x2712, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>void CRegExp2::SetIgnoreCase(BOOL newValue)<br>{<br>&nbsp;static BYTE parms[] = VTS_BOOL ;<br>&nbsp;InvokeHelper(0x2712, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);<br>}</p>
<p>BOOL CRegExp2::IsGlobal()<br>{<br>&nbsp;BOOL result = FALSE;<br>&nbsp;InvokeHelper(0x2713, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>void CRegExp2::SetGlobal(BOOL newValue)<br>{<br>&nbsp;static BYTE parms[] = VTS_BOOL ;<br>&nbsp;InvokeHelper(0x2713, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);<br>}</p>
<p>BOOL CRegExp2::IsMultiline()<br>{<br>&nbsp;BOOL result = FALSE;<br>&nbsp;InvokeHelper(0x2717, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&amp;result, NULL);<br>&nbsp;return result;<br>}</p>
<p>void CRegExp2::SetMultiline(BOOL newValue)<br>{<br>&nbsp;static BYTE parms[] = VTS_BOOL ;<br>&nbsp;InvokeHelper(0x2717, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);<br>}</p>
<p>CMatchCollection2 CRegExp2::Execute(LPCTSTR sourceString)<br>{<br>&nbsp;LPDISPATCH result = NULL;<br>&nbsp;static BYTE parms[] = VTS_BSTR ;<br>&nbsp;InvokeHelper(0x2714, DISPATCH_METHOD, VT_DISPATCH, (void*)&amp;result, parms, sourceString);</p>
<p>&nbsp;return CMatchCollection2(result);<br>}</p>
<p>BOOL CRegExp2::Test(LPCTSTR sourceString)<br>{<br>&nbsp;BOOL result = FALSE;<br>&nbsp;static BYTE parms[] = VTS_BSTR ;<br>&nbsp;InvokeHelper(0x2715, DISPATCH_METHOD, VT_BOOL, (void*)&amp;result, parms, sourceString);<br>&nbsp;return result;<br>}</p>
<p>CString CRegExp2::Replace(LPCTSTR sourceString, LPCTSTR replaceString)<br>{<br>&nbsp;CString result;<br>&nbsp;static BYTE parms[] = VTS_BSTR VTS_BSTR ;<br>&nbsp;InvokeHelper(0x2716, DISPATCH_METHOD, VT_BSTR, (void*)&amp;result, parms, sourceString, replaceString);<br>&nbsp;return result;<br>}<br><br><span style="COLOR: red"><strong>具体使用：</strong></span><br><br>记得 CoInitialize(NULL);<br><br>&nbsp;VBScript_RegExp_55::CRegExp2 RegExp;</p>
<p>&nbsp;RegExp.CreateByReg();</p>
<p>&nbsp;RegExp.SetPattern("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");//IP地址</p>
<p>&nbsp;VBScript_RegExp_55::CMatchCollection2 myc = RegExp.Execute("sdffdgfd192.168.101.23w2r4tfghtyj");</p>
<p>&nbsp;AfxMessageBox(myc.GetItem(0).GetValue());<br></p>
<img src ="http://www.cppblog.com/Zezese/aggbug/138192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-01-09 14:04 <a href="http://www.cppblog.com/Zezese/archive/2011/01/09/138192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>像VB一样响应ActiveX控件事件</title><link>http://www.cppblog.com/Zezese/archive/2011/01/09/138190.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sun, 09 Jan 2011 05:50:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/01/09/138190.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/138190.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/01/09/138190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/138190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/138190.html</trackback:ping><description><![CDATA[<p><strong><span style="COLOR: red">头文件：</span><br></strong><br>#pragma once</p>
<p>//事件回调接口，可以是接口也可以是类</p>
<p>//如果是接口就要在调用者类里面实现所有的事件<br>//有时我们只需要实现一两个事件，所以这里用类来实现事件回调接口</p>
<p>//把所有的事件都放在这个里面</p>
<p>class CWebBrowserEventHandler<br>{<br>protected:</p>
<p>&nbsp;friend class CWebBrowser;&nbsp; //让事件源可以调用事件回调函数<br>&nbsp;<br>&nbsp;CWebBrowserEventHandler(){}; //保护构造函数，只能继承，不能实例化</p>
<p>&nbsp;//具体的事件回调函数<br>&nbsp;<br>&nbsp;//第一个参数为事件源，只要是为了区分具体的事件源</p>
<p>&nbsp;virtual void WebBrowser_TitleChange(CWebBrowser&amp; Sender, LPCTSTR lpszText){}<br>&nbsp;virtual void WebBrowser_DocumentComplete(CWebBrowser&amp; Sender, LPCTSTR lpszURL){}<br>};</p>
<p>class CWebBrowser : public CHtmlView<br>{<br>&nbsp;DECLARE_DYNCREATE(CWebBrowser)<br>&nbsp;DECLARE_MESSAGE_MAP()</p>
<p>public:</p>
<p>&nbsp;CWebBrowser();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;virtual ~CWebBrowser();</p>
<p>&nbsp;//设置或者取消事件回调接口<br>&nbsp;void SetEventHandler(CWebBrowserEventHandler* lpEventHandler = NULL);</p>
<p>&nbsp;BOOL IsContextMenuEnabled() const { return m_bContextMenuEnabled; }<br>&nbsp;void EnableContextMenu(BOOL newVal = TRUE) { m_bContextMenuEnabled = newVal; }</p>
<p>protected:</p>
<p>&nbsp;virtual void PostNcDestroy();<br>&nbsp;virtual BOOL PreTranslateMessage(MSG* pMsg);</p>
<p>&nbsp;afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);<br>&nbsp;afx_msg void OnDestroy();</p>
<p>protected:</p>
<p>&nbsp;//CHtmlView已经用虚函数实现事件的响应<br>&nbsp;<br>&nbsp;//具体是如何实现事件的响应可以查看CHtmlView的源码</p>
<p>&nbsp;//作为例子，这里实现两个简单的事件</p>
<p>&nbsp;virtual void OnTitleChange(LPCTSTR lpszText);<br>&nbsp;virtual void OnDocumentComplete(LPCTSTR lpszURL);</p>
<p>protected:</p>
<p>&nbsp;BOOL m_bContextMenuEnabled;</p>
<p>&nbsp;//这里只有一个事件回调接口（其实可以用数组或链表来保存多个事件回调接口）<br>&nbsp;//但大都情况下一个事件回调接口就已经足够了</p>
<p>&nbsp;CWebBrowserEventHandler* m_lpEventHandler;<br>};</p>
<p><strong style="COLOR: red">实现文件:</strong><br><br>// WebBrowser.cpp : 实现文件<br>//</p>
<p>#include "stdafx.h"<br>#include ".\WebBrowser.h"</p>
<p>// CWebBrowser</p>
<p>IMPLEMENT_DYNCREATE(CWebBrowser, CHtmlView)</p>
<p>CWebBrowser::CWebBrowser()<br>: m_lpEventHandler(NULL)<br>, m_bContextMenuEnabled(TRUE)<br>{<br>}</p>
<p>CWebBrowser::~CWebBrowser()<br>{<br>}</p>
<p>BEGIN_MESSAGE_MAP(CWebBrowser, CHtmlView)<br>&nbsp;ON_WM_DESTROY()<br>&nbsp;ON_WM_MOUSEACTIVATE()<br>END_MESSAGE_MAP()</p>
<p><br>void CWebBrowser::SetEventHandler(CWebBrowserEventHandler* lpEventHandler /*= NULL*/)<br>{<br>&nbsp;m_lpEventHandler = lpEventHandler;<br>}</p>
<p>// CWebBrowser 消息处理程序</p>
<p>void CWebBrowser::OnTitleChange(LPCTSTR lpszText)<br>{<br>&nbsp;if (m_lpEventHandler != NULL)<br>&nbsp;{<br>&nbsp;&nbsp;m_lpEventHandler-&gt;WebBrowser_TitleChange(*this, lpszText);<br>&nbsp;}</p>
<p>&nbsp;CHtmlView::OnTitleChange(lpszText);<br>}</p>
<p>void CWebBrowser::OnDocumentComplete(LPCTSTR lpszURL)<br>{<br>&nbsp;if (m_lpEventHandler != NULL)<br>&nbsp;{<br>&nbsp;&nbsp;m_lpEventHandler-&gt;WebBrowser_DocumentComplete(*this, lpszURL);<br>&nbsp;}</p>
<p>&nbsp;CHtmlView::OnDocumentComplete(lpszURL);<br>}</p>
<p><br>void CWebBrowser::OnDestroy()<br>{<br>&nbsp;m_pBrowserApp.Release();</p>
<p>&nbsp;m_wndBrowser.DestroyWindow();</p>
<p>&nbsp;CWnd::OnDestroy();<br>}</p>
<p>int CWebBrowser::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)<br>{<br>&nbsp;return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);<br>}</p>
<p>void CWebBrowser::PostNcDestroy()<br>{<br>&nbsp;//防止自删除</p>
<p>&nbsp;//CHtmlView::PostNcDestroy();<br>}</p>
<p>BOOL CWebBrowser::PreTranslateMessage(MSG* pMsg)<br>{<br>&nbsp;if (WM_RBUTTONUP == pMsg-&gt;message || WM_CONTEXTMENU == pMsg-&gt;message)<br>&nbsp;{<br>&nbsp;&nbsp;if (!IsContextMenuEnabled()) //屏蔽右键菜单和键盘菜单键<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return TRUE;<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;return CHtmlView::PreTranslateMessage(pMsg);<br>}</p>
<p><br><strong><span style="COLOR: #ff0000">具体使用：</span><br></strong><br>1.让调用者实现事件回调接口。<br><br>class CTestWebBrowserDlg : public CDialog, <span style="COLOR: red">public CWebBrowserEventHandler</span><br><br>2.设置事件回调接口。<br><br>m_WebBrowser.SetEventHandler(this);<br><br>3.重写响应的事件回调函数。<br><br>void CTestWebBrowserDlg::WebBrowser_TitleChange(CWebBrowser&amp; Sender, LPCTSTR lpszText)<br>{<br>&nbsp;SetWindowText(lpszText);<br>}<br><br><span style="COLOR: #ff0000"><strong>在VS2003+XP下测试通过。</strong></span></p>
<img src ="http://www.cppblog.com/Zezese/aggbug/138190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-01-09 13:50 <a href="http://www.cppblog.com/Zezese/archive/2011/01/09/138190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lzma(7-zip)和zlib</title><link>http://www.cppblog.com/Zezese/archive/2011/01/02/137883.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sun, 02 Jan 2011 07:12:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2011/01/02/137883.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/137883.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2011/01/02/137883.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/137883.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/137883.html</trackback:ping><description><![CDATA[<p><strong style="FONT-SIZE: 14pt">Lzma(7-zip) 使用：</strong><br><br>在C目录中有算法文件，进入Util\LzmaLib目录，编译生成LIB库，导出了以下两函数，LzmaCompress 为压缩函数，LzmaUncompress 为解压缩函数。<br><br>MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen,<br>&nbsp; unsigned char *outProps, size_t *outPropsSize,<br>&nbsp; int level,&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; unsigned dictSize, <br>&nbsp; int lc,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; int lp,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; int pb,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; int fb,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; int numThreads<br>&nbsp; );<br></p>
<p>MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen,<br>&nbsp; const unsigned char *props, size_t propsSize);</p>
<p>导入Types.h 和 Lzmalib.h 到工程中。</p>
<p>代码如下：<br><br>#include "stdafx.h"<br>#include "LzmaLib.h"</p>
<p>#pragma comment(lib,"lzma.lib")</p>
<p>int _tmain(int argc, _TCHAR* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; FILE* pFile = _tfopen(_T("file.dat"), _T("rb"));</p>
<p>&nbsp;&nbsp;&nbsp; if (pFile == NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ftprintf(stderr, _T("Error to Open the file!"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; - 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; fseek(pFile, 0, SEEK_END);<br>&nbsp;&nbsp;&nbsp; size_t srcLen = ftell(pFile);<br>&nbsp;&nbsp;&nbsp; rewind(pFile);<br>&nbsp;&nbsp;&nbsp; size_t destLen = srcLen * 2;<br>&nbsp;&nbsp;&nbsp; unsigned char* psrcRead = new unsigned char[srcLen]; //原始文件数据<br>&nbsp;&nbsp;&nbsp; unsigned char* pDecomress = new unsigned char[srcLen]; //存放解压缩数据<br>&nbsp;&nbsp;&nbsp; unsigned char* pLzma = new unsigned char[destLen]; //存放压缩数据</p>
<p>&nbsp;&nbsp;&nbsp; fread(psrcRead, sizeof(char), srcLen, pFile);</p>
<p>&nbsp;&nbsp;&nbsp; unsigned char prop[5] = <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp; size_t sizeProp = 5;</p>
<p>&nbsp;&nbsp;&nbsp; if (SZ_OK != LzmaCompress(pLzma, &amp;destLen, psrcRead, srcLen, prop,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;sizeProp, 9, (1 &lt;&lt; 24), 3, 0, 2, 32, 2))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //出错了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ftprintf(stderr, _T("压缩时出错！"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] psrcRead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pDecomress;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pLzma;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; - 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; FILE* pCompressFile = _tfopen(_T("compress.dat"), _T("wb")); <br>&nbsp;&nbsp;&nbsp; //写入压缩后的数据<br>&nbsp;&nbsp;&nbsp; if (pCompressFile == NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ftprintf(stderr, _T("创建文件出错!"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] psrcRead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pDecomress;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pLzma;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; - 1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; fwrite(pLzma, sizeof(char), destLen, pCompressFile);<br>&nbsp;&nbsp;&nbsp; fclose(pCompressFile);</p>
<p>&nbsp;&nbsp;&nbsp; FILE* pDecompressFile = _tfopen(_T("decompress.dat"), _T("wb")); <br>&nbsp;&nbsp;&nbsp; //写入解压缩数据<br>&nbsp;&nbsp;&nbsp; if (pDecompressFile == NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ftprintf(stderr, _T("写入数据出错！"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] psrcRead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pDecomress;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pLzma;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; - 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //注意：解压缩时props参数要使用压缩时生成的outProps，这样才能正常解压缩<br>&nbsp;&nbsp;&nbsp; if (SZ_OK != LzmaUncompress(pDecomress, &amp;srcLen, pLzma, &amp;destLen, prop, 5))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] psrcRead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pDecomress;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete [] pLzma;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(pDecompressFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose(pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; - 1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; fwrite(pDecomress, sizeof(char), srcLen, pDecompressFile);</p>
<p>&nbsp;&nbsp;&nbsp; delete [] psrcRead;<br>&nbsp;&nbsp;&nbsp; delete [] pDecomress;<br>&nbsp;&nbsp;&nbsp; delete [] pLzma;</p>
<p>&nbsp;&nbsp;&nbsp; fclose(pDecompressFile);<br>&nbsp;&nbsp;&nbsp; fclose(pFile);</p>
<p>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p><br><strong style="FONT-SIZE: 14pt">zlib使用：<br></strong><br>zlib 是通用的压缩库，提供了一套 in-memory 压缩和解压函数，并能检测解压出来的数据的完整性(integrity)。下面介绍两个最有用的函数——compress 和 uncompress。</p>
<p>int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);</p>
<p>compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时，destLen表示 dest 缓冲区的大小，destLen &gt; (sourceLen + 12)*100.1%。当函数退出后，destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。</p>
<p>compress 若成功，则返回 Z_OK；若没有足够内存，则返回 Z_MEM_ERROR；若输出缓冲区不够大，则返回 Z_BUF_ERROR。</p>
<p>int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);</p>
<p>uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen 是 source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时，destLen 表示 dest 缓冲区的大小， dest 缓冲区要足以容下解压后的数据。在进行解压缩时，需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前，保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能，需要我们做额外的工作。当函数退出后， destLen 是解压出来的数据的实际大小。</p>
<p>uncompress 若成功，则返回 Z_OK ；若没有足够内存，则返回 Z_MEM_ERROR；若输出缓冲区不够大，则返回 Z_BUF_ERROR。若输入数据有误，则返回 Z_DATA_ERROR。<br><br>代码如下：</p>
<p>#include "stdafx.h"<br>#include &lt;cstring&gt;<br>#include &lt;cstdlib&gt;<br>#include &lt;iostream&gt;<br>#include "zlib.h"<br>using namespace std;</p>
<p>int _tmain(int argc, _TCHAR* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; int err = 0;<br>&nbsp;Byte compr[200] = {0}, uncompr[200] = {0}; // big enough<br>&nbsp;&nbsp;&nbsp; uLong comprLen = 0, uncomprLen = 0;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;const char* hello = "12345678901234567890123456789012345678901234567890";<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;uLong len = strlen(hello) + 1;<br>&nbsp;&nbsp;&nbsp; comprLen = sizeof(compr) / sizeof(compr[0]);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;err = compress(compr, &amp;comprLen, (const Bytef*)hello, len);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;if (err != Z_OK)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "compess error: " &lt;&lt; err &lt;&lt; '\n';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;cout &lt;&lt; "orignal size: " &lt;&lt; len <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; " , compressed size : " &lt;&lt; comprLen &lt;&lt; '\n';<br>&nbsp;&nbsp; <br>&nbsp;strcpy((char*)uncompr, "garbage");<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;err = uncompress(uncompr, &amp;uncomprLen, compr, comprLen);<br>&nbsp;&nbsp; <br>&nbsp;if (err != Z_OK)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "uncompess error: " &lt;&lt; err &lt;&lt; '\n';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;cout &lt;&lt; "orignal size: " &lt;&lt; len <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; " , uncompressed size : " &lt;&lt; uncomprLen &lt;&lt; '\n';<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;if (strcmp((char*)uncompr, hello))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cerr &lt;&lt; "BAD uncompress!!!\n";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "uncompress() succeed: \n" &lt;&lt; (char*)uncompr;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<img src ="http://www.cppblog.com/Zezese/aggbug/137883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2011-01-02 15:12 <a href="http://www.cppblog.com/Zezese/archive/2011/01/02/137883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复制文本到剪贴板</title><link>http://www.cppblog.com/Zezese/archive/2010/12/28/137599.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Tue, 28 Dec 2010 05:02:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/12/28/137599.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/137599.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/12/28/137599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/137599.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/137599.html</trackback:ping><description><![CDATA[<p>BOOL PutTextToClipboard(LPCTSTR pTxtData)<br>{<br>&nbsp;BOOL bRet = FALSE;</p>
<p>&nbsp;if (OpenClipboard(AfxGetMainWnd()-&gt;GetSafeHwnd()))<br>&nbsp;{<br>&nbsp;&nbsp;EmptyClipboard();<br>&nbsp;&nbsp;HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (lstrlen(pTxtData) + 1) * sizeof(TCHAR));<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if (hData != NULL)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;LPTSTR pszData = (LPTSTR)::GlobalLock(hData);<br>&nbsp;&nbsp;&nbsp;lstrcpy(pszData, pTxtData);<br>&nbsp;&nbsp;&nbsp;GlobalUnlock(hData);<br>&nbsp;&nbsp;&nbsp;<br>#ifdef _UNICODE<br>&nbsp;&nbsp;&nbsp;bRet = (SetClipboardData(CF_UNICODETEXT, hData) != NULL);<br>#else<br>&nbsp;&nbsp;&nbsp;bRet = (SetClipboardData(CF_TEXT, hData) != NULL);<br>#endif // _UNICODE&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;CloseClipboard();<br>&nbsp;}</p>
<p>&nbsp;return bRet; <br>}</p>
<img src ="http://www.cppblog.com/Zezese/aggbug/137599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-12-28 13:02 <a href="http://www.cppblog.com/Zezese/archive/2010/12/28/137599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE控件包装类（CWebBrowser，继承自CHtmlView）</title><link>http://www.cppblog.com/Zezese/archive/2010/12/28/137598.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Tue, 28 Dec 2010 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/12/28/137598.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/137598.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/12/28/137598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/137598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/137598.html</trackback:ping><description><![CDATA[<p>VS2003<br><br>头文件<br><br>#pragma once</p>
<p>#include &lt;afxhtml.h&gt;</p>
<p>class CWebBrowser : public CHtmlView<br>{<br>&nbsp;DECLARE_DYNCREATE(CWebBrowser)<br>&nbsp;DECLARE_MESSAGE_MAP()</p>
<p>public:</p>
<p>&nbsp;CWebBrowser();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;virtual ~CWebBrowser();</p>
<p>&nbsp;BOOL IsContextMenuEnabled() const { return m_bContextMenuEnabled; }<br>&nbsp;void EnableContextMenu(BOOL newVal = TRUE) { m_bContextMenuEnabled = newVal; }</p>
<p>protected:</p>
<p>&nbsp;virtual void PostNcDestroy();<br>&nbsp;virtual BOOL PreTranslateMessage(MSG* pMsg);</p>
<p>&nbsp;afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);<br>&nbsp;afx_msg void OnDestroy();</p>
<p>protected:<br>&nbsp;virtual void OnTitleChange(LPCTSTR lpszText);<br>&nbsp;virtual void OnDocumentComplete(LPCTSTR lpszURL);</p>
<p>protected:</p>
<p>&nbsp;BOOL m_bContextMenuEnabled;</p>
<p>};<br><br>实现文件<br><br><br>#include "stdafx.h"<br>#include ".\WebBrowser.h"</p>
<p><br>// CWebBrowser</p>
<p>IMPLEMENT_DYNCREATE(CWebBrowser, CHtmlView)</p>
<p>CWebBrowser::CWebBrowser()<br>: m_bContextMenuEnabled(TRUE)<br>{<br>}</p>
<p>CWebBrowser::~CWebBrowser()<br>{<br>}</p>
<p>BEGIN_MESSAGE_MAP(CWebBrowser, CHtmlView)<br>&nbsp;ON_WM_DESTROY()<br>&nbsp;ON_WM_MOUSEACTIVATE()<br>END_MESSAGE_MAP()</p>
<p><br>// CWebBrowser 消息处理程序</p>
<p>void CWebBrowser::OnTitleChange(LPCTSTR lpszText)<br>{<br>&nbsp;// TODO: 在此添加专用代码和/或调用基类</p>
<p>&nbsp;CHtmlView::OnTitleChange(lpszText);<br>}</p>
<p>void CWebBrowser::OnDocumentComplete(LPCTSTR lpszURL)<br>{<br>&nbsp;// TODO: 在此添加专用代码和/或调用基类</p>
<p>&nbsp;CHtmlView::OnDocumentComplete(lpszURL);<br>}</p>
<p><br>void CWebBrowser::OnDestroy()<br>{<br>&nbsp;m_pBrowserApp.Release();</p>
<p>&nbsp;m_wndBrowser.DestroyWindow();</p>
<p>&nbsp;CWnd::OnDestroy();<br>}</p>
<p>int CWebBrowser::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)<br>{<br>&nbsp;return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);<br>}</p>
<p>void CWebBrowser::PostNcDestroy()<br>{<br>//防止自删除<br>&nbsp;//CHtmlView::PostNcDestroy();<br>}</p>
<p>BOOL CWebBrowser::PreTranslateMessage(MSG* pMsg)<br>{<br>&nbsp;if (WM_RBUTTONUP == pMsg-&gt;message || WM_CONTEXTMENU == pMsg-&gt;message)<br>&nbsp;{<br>&nbsp;&nbsp;if (!IsContextMenuEnabled()) //屏蔽右键菜单和键盘菜单键<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return TRUE;<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;return CHtmlView::PreTranslateMessage(pMsg);<br>}<br></p>
<img src ="http://www.cppblog.com/Zezese/aggbug/137598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-12-28 12:59 <a href="http://www.cppblog.com/Zezese/archive/2010/12/28/137598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetOwner和GetParent</title><link>http://www.cppblog.com/Zezese/archive/2010/12/24/137360.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Fri, 24 Dec 2010 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/12/24/137360.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/137360.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/12/24/137360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/137360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/137360.html</trackback:ping><description><![CDATA[<p>CWnd::GetOwner 这个函数获得窗口的拥有者的指针。如果窗口没有拥有者，则缺省地返回父窗口对象的指针。注意在拥有者和被拥有者之间的关系与父子关系在几个重要方面的差别。例如，具有父窗口的窗口被限制在父窗口的客户区内，但是被拥有的窗口可以被画在桌面上的任何位置。 CWnd::GetParent 如果这个成员函数执行成功，则返回父窗口指针；否则返回值为NULL，表明发生了错误或没有父窗口。调用这个函数以获得子窗口的父窗口（如果有）的指针。GetParent函数返回直接父窗口的指针。 要知道一个窗口有一个父窗口（他是父窗口的child），就是用GetParent得到，一个child窗口只能在父窗口的客户区移动。 而对于对话框来说，他的父窗口永远是最顶层的窗口，但是可以用GetOwner得到他的逻辑意义上的&#8220;父窗口&#8221;（因为对话框可以在屏幕中到处移动，而child不是的。）<br></p>
<img src ="http://www.cppblog.com/Zezese/aggbug/137360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-12-24 10:50 <a href="http://www.cppblog.com/Zezese/archive/2010/12/24/137360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断全屏模式</title><link>http://www.cppblog.com/Zezese/archive/2010/11/26/134757.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Fri, 26 Nov 2010 13:57:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/11/26/134757.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/134757.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/11/26/134757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/134757.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/134757.html</trackback:ping><description><![CDATA[<p>BOOL IsFullScreenMode()<br />{<br />&nbsp;BOOL bRet = FALSE;</p>
<p>&nbsp;HWND hDesktopWindow = GetDesktopWindow();<br />&nbsp;HWND hShellWindow = GetShellWindow();</p>
<p>&nbsp;DWORD dwDesktopWindow = 0, dwShellWindow = 0;</p>
<p>&nbsp;GetWindowThreadProcessId(hDesktopWindow, &amp;dwDesktopWindow);<br />&nbsp;GetWindowThreadProcessId(hShellWindow, &amp;dwShellWindow);</p>
<p>&nbsp;const INT nWidth = GetSystemMetrics(SM_CXSCREEN);<br />&nbsp;const INT nHeight = GetSystemMetrics(SM_CYSCREEN);</p>
<p>&nbsp;DWORD dwTmp = 0;</p>
<p>&nbsp;HWND hTmp = FindWindowEx(NULL, NULL, NULL, NULL);</p>
<p>&nbsp;while (hTmp != NULL)<br />&nbsp;{<br />&nbsp;&nbsp;CRect rect;</p>
<p>&nbsp;&nbsp;GetWindowRect(hTmp, &amp;rect);</p>
<p>&nbsp;&nbsp;if (nWidth == rect.Width() &amp;&amp; nHeight == rect.Height())<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;GetWindowThreadProcessId(hTmp, &amp;dwTmp);</p>
<p>&nbsp;&nbsp;&nbsp;if (dwTmp != dwShellWindow &amp;&amp; dwTmp != dwDesktopWindow)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;bRet = TRUE;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;TRACE("FullScreen:%d\n", dwTmp);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;hTmp = FindWindowEx(NULL, hTmp, NULL, NULL);<br />&nbsp;}</p>
<p>&nbsp;return bRet;<br />}</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/Zezese/aggbug/134757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-11-26 21:57 <a href="http://www.cppblog.com/Zezese/archive/2010/11/26/134757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC调用JMail发邮件（无需注册JMail.dll）</title><link>http://www.cppblog.com/Zezese/archive/2010/10/09/129187.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sat, 09 Oct 2010 05:44:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/10/09/129187.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/129187.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/10/09/129187.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/129187.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/129187.html</trackback:ping><description><![CDATA[<p>首先要导入jmail.dll&nbsp;<br /><br />#import "jmail.dll"<br /><br />还要初始化COM套间<br /><br />CoInitialize(NULL); <br /><br />调用代码如下<br /><br />&nbsp;typedef HRESULT (__stdcall* pfnDllGetClassObject)(REFCLSID, REFIID, void**); </p>
<p>&nbsp;HINSTANCE hDllInst = LoadLibrary(_T("jmail.dll")); </p>
<p>&nbsp;pfnDllGetClassObject fnDllGetClassObject = (pfnDllGetClassObject)GetProcAddress(hDllInst, "DllGetClassObject"); </p>
<p>&nbsp;if (fnDllGetClassObject != NULL) <br />&nbsp;{ <br />&nbsp;&nbsp;IClassFactory* lpClassFactory = NULL; </p>
<p>&nbsp;&nbsp;HRESULT hr = (fnDllGetClassObject)(__uuidof(jmail::Message), IID_IClassFactory, (void**)&amp;lpClassFactory); </p>
<p>&nbsp;&nbsp;if (SUCCEEDED(hr) &amp;&amp; (lpClassFactory != NULL)) <br />&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;IUnknown* lpUnknown = NULL; </p>
<p>&nbsp;&nbsp;&nbsp;hr = lpClassFactory-&gt;CreateInstance(NULL, __uuidof(jmail::IMessage), (void**)&amp;lpUnknown); </p>
<p>&nbsp;&nbsp;&nbsp;if (SUCCEEDED(hr) &amp;&amp; (lpUnknown != NULL)) <br />&nbsp;&nbsp;&nbsp;{ <br />&nbsp;&nbsp;&nbsp;&nbsp;jmail::IMessagePtr MyMessage(lpUnknown);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//不抛出错误<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutSilent(VARIANT_TRUE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutISOEncodeHeaders(VARIANT_TRUE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//字符集，缺省为"US-ASCII"<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutCharset(_T("GB2312"));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//发件人姓名<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutFromName(_T("test"));<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//发件人邮箱<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutFrom(_T("***@***.com"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//发件人邮件用户名<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutMailServerUserName(_T("***"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//发件人邮件密码<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutMailServerPassWord(_T("***"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//设置邮件标题<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutSubject(_T("邮件标题"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//邮件内容<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;PutBody(_T("邮件内容"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//发送对象&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;AddRecipient(_T("***@***.com"), _T(""), _T(""));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;//Jmail发送的方法<br />&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;Send(_T("smtp.***.com"), VARIANT_FALSE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;MyMessage-&gt;Close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;MyMessage.Release();<br />&nbsp;&nbsp;&nbsp;} </p>
<p>&nbsp;&nbsp;&nbsp;lpClassFactory-&gt;Release(); <br />&nbsp;&nbsp;} <br />&nbsp;} </p>
<p>&nbsp;FreeLibrary(hDllInst); </p><img src ="http://www.cppblog.com/Zezese/aggbug/129187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-10-09 13:44 <a href="http://www.cppblog.com/Zezese/archive/2010/10/09/129187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows未公开的MD5函数</title><link>http://www.cppblog.com/Zezese/archive/2010/07/25/121249.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sun, 25 Jul 2010 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/07/25/121249.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/121249.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/07/25/121249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/121249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/121249.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用Dependency Walker 打开系统目录下的ADVAPI32.DLL，可以发现ADVAPI32.DLL导出了MD5的三个函数：MD5Init，MD5Update，MD5Final。如下图所示：<br /><br /><img height="392" src="http://www.cppblog.com/images/cppblog_com/zezese/MD5.JPG" width="490" border="0"  alt="" /><br /><br />这个三个函数的原型如下：<br /><br />void WINAPI MD5Init(MD5_CTX* lpCtx);<br />void WINAPI MD5Update(MD5_CTX* lpCtx, const void * lpBuf, unsigned int nLen);<br />void WINAPI MD5Final(MD5_CTX* lpCtx);<br /><br />其中MD5_CTX结构体为：<br /><br />struct MD5_CTX<br />{<br />&nbsp;ULONG num[2];&nbsp;&nbsp;&nbsp;/* number of _bits_ handled mod 2^64 */<br />&nbsp;ULONG buf[4];&nbsp;&nbsp;&nbsp;/* scratch buffer */<br />&nbsp;BYTE&nbsp; input[64];&nbsp;&nbsp;/* input buffer */<br />&nbsp;BYTE&nbsp; digest[16];&nbsp;&nbsp;/* actual digest after MD5Final call */<br />};<br /><br />现在我们用这个三个函数来计算字符串的MD5：<br /><br />CString CalcStringMD5(CString strSrc)<br />{<br />&nbsp;MD5_CTX ctx = {0};</p>
<p>&nbsp;MD5Init(&amp;ctx);</p>
<p>&nbsp;MD5Update(&amp;ctx, strSrc.GetBuffer(), strSrc.GetLength());</p>
<p>&nbsp;MD5Final(&amp;ctx);</p>
<p>&nbsp;strSrc.ReleaseBuffer();</p>
<p>&nbsp;TCHAR szTmp[33] = {0};</p>
<p>&nbsp;for (UINT i = 0; i &lt; 16; i++)<br />&nbsp;{<br />&nbsp;&nbsp;wsprintf(szTmp + i * 2, _T("%02x"), ctx.digest[i]);<br />&nbsp;}</p>
<p>&nbsp;CString strMD5 = szTmp;</p>
<p>&nbsp;return strMD5;<br />}</p>
<p><br />该函数只支持多字节编码，UNICODE编码请自行转换，编译需要<a href="http://www.cppblog.com/Files/Zezese/MD5.rar"><u><font color="#0000ff">MD5.lib</font></u></a>链接库。以上代码在VS2003+XP下测试成功。</p><img src ="http://www.cppblog.com/Zezese/aggbug/121249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-07-25 16:01 <a href="http://www.cppblog.com/Zezese/archive/2010/07/25/121249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让MFC对话框程序一开始就隐藏</title><link>http://www.cppblog.com/Zezese/archive/2010/07/10/119996.html</link><dc:creator>张志松</dc:creator><author>张志松</author><pubDate>Sat, 10 Jul 2010 10:43:00 GMT</pubDate><guid>http://www.cppblog.com/Zezese/archive/2010/07/10/119996.html</guid><wfw:comment>http://www.cppblog.com/Zezese/comments/119996.html</wfw:comment><comments>http://www.cppblog.com/Zezese/archive/2010/07/10/119996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Zezese/comments/commentRss/119996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Zezese/services/trackbacks/119996.html</trackback:ping><description><![CDATA[<p>有时候我们的需要MFC对话框程序一开始就隐藏窗口，在后台运行。</p>
<p>1、修改对话框资源的Visible属性的值为False.</p>
<p>2、修改CXXXApp::InitInstance()中的代码。</p>
<p>CXXXDlg dlg;<br />m_pMainWnd = &amp;dlg;<br />INT_PTR nResponse = dlg.DoModal();<br />if (nResponse == IDOK)<br />{</p>
<p>}<br />else if (nResponse == IDCANCEL)<br />{</p>
<p>}</p>
<p>return FALSE;</p>
<p>把上面的代码改为：</p>
<p>CXXXDlg* pDlg = new CXXXDlg;<br />pDlg-&gt;Create(CXXXDlg::IDD);<br />pDlg-&gt;ShowWindow(SW_HIDE);</p>
<p>m_pMainWnd = pDlg;</p>
<p>return TRUE;</p>
<p><br />3、为了不让程序运行时抢焦点，CXXXDlg::OnInitDialog() 应该返回FALSE;</p>
<p><br />4、在 CXXXDlg::OnNcDestroy() 中加入 delete this;<br /></p><img src ="http://www.cppblog.com/Zezese/aggbug/119996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Zezese/" target="_blank">张志松</a> 2010-07-10 18:43 <a href="http://www.cppblog.com/Zezese/archive/2010/07/10/119996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>