﻿<?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++博客-万星星-随笔分类-MFC</title><link>http://www.cppblog.com/wlwlxj/category/2266.html</link><description>&lt;div&gt;一个吃软饭的男人!!!!!我只想写程序####&lt;br&gt;师夷之技以制夷   吾尝终日而思矣,不如须臾之所学也&lt;br&gt;喝碗孟婆汤,踏过奈何桥,涅槃&lt;/div&gt;
I've been programming since I was 21. Started with C++, looked at Java, keen on Visual Basic and Visual C++, thinking about .NET and C#.^_^,very ridiculous.</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 12:08:04 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 12:08:04 GMT</pubDate><ttl>60</ttl><item><title>VC8中MFC集成ATL组件注册时注意的一个问题</title><link>http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 26 Feb 2008 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/43247.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/43247.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/43247.html</trackback:ping><description><![CDATA[<br>由于VC8生成MFC程序时候如果选择创建solution，exe不在本目录的debug目录下，而是在solution的debug目录下。当加入atl支持时候，生成的tlb却在本目录的debug下。此时类型库注册需要手工执行：%exe路径% -RegServer。此时，如果tlb不在exe统一目录，注册是失败的。所以一定要拷贝到当前目录再注册。
<img src ="http://www.cppblog.com/wlwlxj/aggbug/43247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2008-02-26 11:49 <a href="http://www.cppblog.com/wlwlxj/archive/2008/02/26/43247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>未来界面应该是这样的</title><link>http://www.cppblog.com/wlwlxj/archive/2007/10/05/33531.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 05 Oct 2007 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/10/05/33531.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/33531.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/10/05/33531.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/33531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/33531.html</trackback:ping><description><![CDATA[<br>随着Web技术的发展，web界面更加系统，有了大量的UI库。反观桌面开发却显得处处束手束脚，大把的UI开发问题。<br><br>借助JS技术＋WebBrowser＋COM，可以很简单的集成HTML与Flash，界面开发即简单又漂亮。其中重要的是对于WebBrowser的站点的控制以及事件的捕获，通过查看MFC的CDhtmlDlg代码可以很容易做到。这其中最重要的一点就是技术上的平衡，对于UI的控制可以通过JS代码，也可以通过Web事件，其中的归一点就是DOM模型。ICQ中大量使用了此技术，界面煞是漂亮，就是吃点内存，随着硬件的发展估计这个不是太大问题。<br><br>下面是YUI的JS集成到Dlg中：<br><img height=431 alt="" src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_JS_MFC.PNG" width=676 border=0>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/33531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-10-05 20:38 <a href="http://www.cppblog.com/wlwlxj/archive/2007/10/05/33531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>纯技术讨论com控件创建过程</title><link>http://www.cppblog.com/wlwlxj/archive/2007/07/07/27645.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 06 Jul 2007 16:59:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/07/07/27645.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/27645.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/07/07/27645.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/27645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/27645.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用一个没有任何意义的例子来看看com控件的创建过程&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/07/07/27645.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/27645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-07-07 00:59 <a href="http://www.cppblog.com/wlwlxj/archive/2007/07/07/27645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>界面终于出来一点拉</title><link>http://www.cppblog.com/wlwlxj/archive/2007/04/20/22393.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 20 Apr 2007 09:40:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/04/20/22393.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/22393.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/04/20/22393.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/22393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/22393.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/04/20/22393.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/22393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-04-20 17:40 <a href="http://www.cppblog.com/wlwlxj/archive/2007/04/20/22393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己画的好友列表</title><link>http://www.cppblog.com/wlwlxj/archive/2007/04/16/22027.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 16 Apr 2007 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/04/16/22027.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/22027.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/04/16/22027.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/22027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/22027.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 好累呀，有好的请给我一份&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/04/16/22027.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/22027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-04-16 16:59 <a href="http://www.cppblog.com/wlwlxj/archive/2007/04/16/22027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用WLWUI库描述kugoo界面</title><link>http://www.cppblog.com/wlwlxj/archive/2007/04/04/21211.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 04 Apr 2007 01:41:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/04/04/21211.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/21211.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/04/04/21211.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/21211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/21211.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 继续偶的UI库&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/04/04/21211.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/21211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-04-04 09:41 <a href="http://www.cppblog.com/wlwlxj/archive/2007/04/04/21211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上班半个月的总结</title><link>http://www.cppblog.com/wlwlxj/archive/2007/04/03/21178.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 03 Apr 2007 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2007/04/03/21178.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/21178.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2007/04/03/21178.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/21178.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/21178.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 继续偶的UI库&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2007/04/03/21178.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/21178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2007-04-03 16:36 <a href="http://www.cppblog.com/wlwlxj/archive/2007/04/03/21178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用MFC实现WebGUI－－(CDHtmlDialog)</title><link>http://www.cppblog.com/wlwlxj/archive/2006/12/15/16495.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 15 Dec 2006 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/12/15/16495.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/16495.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/12/15/16495.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/16495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/16495.html</trackback:ping><description><![CDATA[自从去年年底一次棘手的界面，开始研究用web做界面到现在大约1年，这一年间不是局限在实现层面，也并非一直研究这一个问题，有很多问题其实不是问题，只是自己没有想清楚或者思想没放开。对于一个界面开发人员，想必拉的对话框不少于100个，腻味不必说，光是对话框大小改变导致控件跟着变化都需要一番功夫，加上界面美观，界面的风格统一，界面的灵活多变......，头痛。在对话框里面加载位图，加载gif，超链接......，啊，没法控制了吧！在考虑远点，现在.net3.0技术已经完全打破应用和桌面的界限，我们的界面html资源完全可以放在一个web站点上，这样界面是完全动态的。<br /><br />其间写过2篇这方面的文章，基于vc6实现，绕弯很大。在vc7.1、vc8里面要简单很多，主要是把几个以前为公开的类公开了，最重要的是在CWnd里面加入了一个虚函数CreateControlSite使得有机会改变控件站点以修改控件行为。在mfc类层次上，CHTMLView和CDHtmlDialog为开发者提供了创建webgui的一系列基础设施，包括事件机制、窗口行为、以及对html文档操纵接口。我们在此基础上实现webgui很简单，然而仍然困惑我很久，经理也催过我几次我一直未肯决定最终方案。在我脑袋里一直琢磨是要应用程序完全操纵html文档，还是html访问应用获取信息，其实就是它们之间的通信模式。一直到昨天我才定下方案，应用通过IWebBrowser2接口操纵html元素，html通过vbscript、javascript脚本响应本身事件，访问应用。主要是考虑通信自然畅通，而以前我一味想通过应用指令完全控制html元素，导致去解析html文档，费力不讨好。下面开始我的想法：<br /><br />写一个dll，封装CDHtmlDialog，提供一个类似html容器的对话框，功能就是加载html网页，以及创建与html呼应的com组件。它本身不包含与应用功能有关代码，应用有关的部分是html页面和对于的com功能组件。这里需要对CDHtmlDialog进行了适当的改造以适合自己的目标：<br /><br />首先从CDHtmlDialog派生一个类CHTMLContainerDlg，默认情况下会生成一个网页资源，这个网页是这个对话框创建时加载的，我们需要的其实是一个容器而不是一个具体的对话框，所以删除网页资源，修改对话框头文件：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">enum { IDD = IDD_HTMLCONTAINERDLG, IDH = 0 };</span></div>这里把IDH修改为0，因为我们删除了网页资源。然而在对话框创建后会加载该资源，在CDHtmlDialog的OnInitDialog函数里面我们可以看到：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">if (m_nHtmlResID)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        LoadFromResource(m_nHtmlResID);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    else if (m_szHtmlResID)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        LoadFromResource(m_szHtmlResID);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    else if (m_strCurrentUrl)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        Navigate(m_strCurrentUrl);</span></div>结果就是对话框一出现就会出现加载一个无效地址的页面，出现无法打开链接的页面，为了避免这个问题，需要重载OnInitDialog函数。其实就是拷贝mfc代码然后去掉上面那段代码就ok，强制不加载页面。那么为了加载指定页面，需要一个函数：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">void CHTMLContainerDlg::SetHtmlAndCom(CString strURL, CString strProg)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    HRESULT        hr        = NOERROR;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    m_strURL = strURL;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    hr = m_spComDisp.CoCreateInstance(strProg);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    if(FAILED(hr))<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    {<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />        TRACE(_T("Some error when create com object<img src="http://www.cppblog.com/images/dot.gif" />\n"));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    SetExternalDispatch(m_spComDisp);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}</span></div>指定html的url和对应功能组件的progid，这样在网页里面可以通过脚本window.external访问该com组件。<br />这样就可以加载html网页，但是html页面里面的元素风格却是2k风格(至少在ie7以下版本是如此)，这个怕是没起到一点美观作用，为之我考虑了半天，问过做web的人是否有办法，最终还是灵感光临，误撞上了。重载GetHostInfo函数：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">STDMETHODIMP CHTMLContainerDlg::GetHostInfo(DOCHOSTUIINFO* pInfo)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    pInfo-&gt;dwFlags = DOCHOSTUIFLAG_THEME;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    return S_OK;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />}</span></div>这个多得不说，^_^。<br />下面就可以演示了，在vs2005里面找个向导来show一下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">CHTMLContainerDlg    dlg;<br /><img id="Codehighlighter1_70_74_Open_Image" onclick="this.style.display='none'; Codehighlighter1_70_74_Open_Text.style.display='none'; Codehighlighter1_70_74_Closed_Image.style.display='inline'; Codehighlighter1_70_74_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_70_74_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_74_Closed_Text.style.display='none'; Codehighlighter1_70_74_Open_Image.style.display='inline'; Codehighlighter1_70_74_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />    TCHAR                szPath[MAX_PATH] </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_70_74_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_70_74_Open_Text"><span style="COLOR: #000000">{ </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> }</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    CString                strPath;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    GetCurrentDirectory(MAX_PATH, szPath);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    strPath </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> szPath;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    strPath </span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000"> _T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\\Default.htm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    dlg.SetHtmlAndCom(strPath, _T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestWebCom.WebComCtrl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    dlg.DoModal();</span></div><br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_dhtmldlg.JPG" /><br />对话框标题其实可以通过解析html文档获取title标题设置，目前还未处理。下面看看html与应用交互的组件。<br />生成一个atl工程，TestWebCom，添加一个com组件WebComCtrl，添加方法处理上面那个带...的按钮(文件夹浏览按钮)：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">STDMETHODIMP CWebComCtrl::ShowFolderBrowser(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_50_209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_209_Open_Text.style.display='none'; Codehighlighter1_50_209_Closed_Image.style.display='inline'; Codehighlighter1_50_209_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_50_209_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_209_Closed_Text.style.display='none'; Codehighlighter1_50_209_Open_Image.style.display='inline'; Codehighlighter1_50_209_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_50_209_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_50_209_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    AFX_MANAGE_STATE(AfxGetStaticModuleState());<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> TODO: 在此添加实现代码</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    AfxMessageBox(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">In Com, you can show folder select dialog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> S_OK;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />这里不作具体处理，只是象征性弹出一个对话框。好了，上面我们在对话框里面已经设置了com组件的progid，这里可以把html和组件关联上了，通过脚本可以访问com组件方法：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">BUTTON </span><span style="COLOR: #ff0000">CLASS</span><span style="COLOR: #0000ff">="buttonClass3Custom"</span><span style="COLOR: #ff0000"> ID</span><span style="COLOR: #0000ff">="BrowseBtn"</span><span style="COLOR: #ff0000"> TYPE</span><span style="COLOR: #0000ff">="BUTTON"</span><span style="COLOR: #ff0000"> TITLE</span><span style="COLOR: #0000ff">="浏览头文件。"</span><span style="COLOR: #ff0000"> onClick</span><span style="COLOR: #0000ff">="OnBrowseHeaderFile();"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/dot.gif" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">BUTTON</span><span style="COLOR: #0000ff">&gt;</span></div>脚本如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> OnBrowseHeaderFile()<br /><img id="Codehighlighter1_30_73_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_73_Open_Text.style.display='none'; Codehighlighter1_30_73_Closed_Image.style.display='inline'; Codehighlighter1_30_73_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_30_73_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_73_Closed_Text.style.display='none'; Codehighlighter1_30_73_Open_Image.style.display='inline'; Codehighlighter1_30_73_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_30_73_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_30_73_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    window.external.ShowFolderBrowser();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>下面运行试一试，按下选择文件夹按钮会出现如下询问组件是否安全的对话框：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_dhtmldlg2.JPG" /><br />这个很恼人，用户可没有耐心忍受每次多弹出这个对话框询问组件是否安全。我开始打算将组件实现安全接口解决掉此问题，不过不知道缘何，没有成功，网上搜索一下好像说在ie7里面无效，没办法还是看mfc源码来解决问题。<br />CDHtmlDialog类获取external代码如下：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">STDMETHODIMP CDHtmlDialog::GetExternal(IDispatch </span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">ppDispatch)<br /><img id="Codehighlighter1_63_289_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_289_Open_Text.style.display='none'; Codehighlighter1_63_289_Closed_Image.style.display='inline'; Codehighlighter1_63_289_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_63_289_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_289_Closed_Text.style.display='none'; Codehighlighter1_63_289_Open_Image.style.display='inline'; Codehighlighter1_63_289_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_63_289_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_63_289_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(ppDispatch </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> NULL)<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> E_POINTER;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ppDispatch </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (m_spExternalDisp.p </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> CanAccessExternal())<br /><img id="Codehighlighter1_182_268_Open_Image" onclick="this.style.display='none'; Codehighlighter1_182_268_Open_Text.style.display='none'; Codehighlighter1_182_268_Closed_Image.style.display='inline'; Codehighlighter1_182_268_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_182_268_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_182_268_Closed_Text.style.display='none'; Codehighlighter1_182_268_Open_Image.style.display='inline'; Codehighlighter1_182_268_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_182_268_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_182_268_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        m_spExternalDisp.p</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AddRef();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ppDispatch </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> m_spExternalDisp.p;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> S_OK;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> E_NOTIMPL;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>看到CanAccessExternal函数，肯定就是验证安全性的代码，找到函数声明，幸好是虚函数，重载直接返回TRUE：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">BOOL CHTMLContainerDlg::CanAccessExternal()<br /><img id="Codehighlighter1_44_115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_115_Open_Text.style.display='none'; Codehighlighter1_44_115_Closed_Image.style.display='inline'; Codehighlighter1_44_115_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_44_115_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_44_115_Closed_Text.style.display='none'; Codehighlighter1_44_115_Open_Image.style.display='inline'; Codehighlighter1_44_115_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_44_115_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_44_115_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> we trust all com object (haha, you can make virus)</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> TRUE;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>有兴趣的朋友可以看下内部实现。<br />这下就好了，按下网页选择文件夹按钮，弹出对话框：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_dhtmldlg3.JPG" /><br />一套流程完备，方案个人觉得不错，各司其职，通信自然畅通，一个html配对一个com功能组件，功能组件化不仅使代码封装性好，而且可以用于多种语言。<br /><br />由于此技术不用于公司开发，今整理提供<a href="/files/wlwlxj/WebGUI.rar">下载</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/16495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-12-15 21:11 <a href="http://www.cppblog.com/wlwlxj/archive/2006/12/15/16495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>闲暇时间做的几个界面</title><link>http://www.cppblog.com/wlwlxj/archive/2006/12/03/15930.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 03 Dec 2006 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/12/03/15930.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/15930.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/12/03/15930.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/15930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/15930.html</trackback:ping><description><![CDATA[
		<p>最近比较忙，为mapgis二次开发封装控件，虽然不费脑袋，但是总缠在那里，很难有大块时间做自己喜欢的事情。为了充实自己的小片时间片断，决定看看一些窗口技巧，所以模仿做了几个界面完善了以前我的一个skin例子（主要解决2k和xp下的不一致）。<br />截图：<br />对话框skin：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UI_1.JPG" /><br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UI_2.JPG" /><br />窗口控件skin：<br />skin前：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UI_3.JPG" /><br />Skin后：<br /><img src="http://www.cppblog.com/images/cppblog_com/wlwlxj/730/o_UI_4.JPG" /><br /><br /><br />对话框skin基于贴图，窗口控件基于gdi，各自有自己优势。对话框上面位图上的小部件没有处理，可能需要rgn操作描述部件位置信息。gdi skin比较完善，只是示例不全面，风格只有java的。有时间慢慢做，自娱自乐。<br /><br /><a href="/files/wlwlxj/SkinUIdemo.rar">demo下载</a></p>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/15930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-12-03 17:10 <a href="http://www.cppblog.com/wlwlxj/archive/2006/12/03/15930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转孙辉老师《十年MFC经历认识的Microsoft技术》</title><link>http://www.cppblog.com/wlwlxj/archive/2006/11/18/15399.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 18 Nov 2006 14:26:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/11/18/15399.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/15399.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/11/18/15399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/15399.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/15399.html</trackback:ping><description><![CDATA[
		<p>记得2005年在csdn上看到这篇文章，当时可能由于这篇文章很热闹，文章我实在没有精读。我在后面留下了一句话“向微软敬礼”，这个连我自己都忘记了，还是1年后回到帖子去才发现。<br />在2006年3月（大概），我在公司内网上看到这篇文章，没有注明作者是谁。我大致看了一下，只是觉得作者很有见识，非常厉害。当我产生去北京的念头的时候，我发了一个求职贴。第二天，我受到msn消息，一个叫孙辉的加我。我当时不知道是谁，在msn里面简单谈论一下，觉得对方对编程的概念比我高几个境界。末尾，对方留下一句话：“看看《十年MFC经历认识的Microsoft技术》”。当我搜索到这篇帖子的时候，我发现那就是公司的内网上面那篇文章，立马，我想到刚刚那个人就是孙辉老师。我马上回复信息答应了要去北京。<br />在我细致看望这篇文章后，我有一种荡气回肠的感觉，尤其是microsoft和borland编译器大战，让我联想到战国群雄，此起彼弱，一招不慎，全盘皆束。此后该篇文章成为我的励志篇，每当我浮躁不安的时候，我总爱翻出来看看。<br />在北京与孙辉老师共事4个多月，感受到的是执着、深邃，学到了技术和做人的道理。再次转载这篇文章，为了记住这段师情友谊，有时候感慨人生唏嘘，回头来以经看不清脚印了。人间路区区折折，唯有开阔的心胸才能历经万难，阔步前进。其中的大多故事，孙老师亲自给我讲过，很怀念一起的日子。<br /><br /><br /><span class="postbody">孙辉老师《十年MFC经历认识的Microsoft技术》 <br />自从2005年3月8日下午16时“十年MFC经历认识的Microsoft技术”以帖子的方式发表于CSDN论坛后，引起了许多网友得好评，使得笔者诚惶诚恐，考虑到该贴过长(人气指数为5000)，因此转移到Blog上，许多网友对此帖的评语只好省略，在此鄙人谢过了！为感谢网友的支持，本人希望今后能发出新的帖子以回报网友对我的鼓励，再一次谢谢！ <br /><br /><br /><br /><br /><br />初识MFC <br />我最初知道MFC大概是在1993年，那个时候Visual C++还没面世，当时Microsoft的C++编译器还很弱，官方的名字是Microsoft C/C++ 7.0，MFC的版本是1.0，几乎没有引起什么反响，那个时期最好的C++开发环境是Borland C++ 3.1，其实，大概是1992年11月份，一个偶然的机会，我领略到Borland公司的厉害，记不得在什么地方，我看到一个绝妙的集成开发环境，即Turbo C++ 3.0 for Windows，这是我记忆中第一个真正的Windows环境下的C++集成开发环境，那种激动的感觉至今仍记忆犹新，不客气的说，当时至少在C++方面，Microsoft与Borland不是一个水平的，Borland明显的要高于Microsoft ，Borland的产品在技术上给我留下深刻的印象。那个时候Microsoft最好的开发平台是Visual Basic 3.0，而Borland的Delphi正处于开发阶段（Delphi 的代码名称是：“VB Killer”）……，想起这些十几年前的往事，我不禁感慨万千。 <br />十几年来，我用过许多开发环境，关于Visual Basic，我用过最早的DOS版本，Windows版的Visual Basic我基本上全都用过，至今我还记得每个版本的VB安装盘磁盘的盘数。同样，我用过各个版本的Delphi，特别是Delphi 2.0，给我留下极好的印象。Delphi提供真正编译的可视化开发环境，那个时候（1994年左右），Delphi就可以开发带有GUI的动态链接库，你可以想象，在Microsoft Access 2.0的应用程序中可以加载一个Delphi Form并进行程序交互，那种感觉真是棒极了。 <br />Borland C++是我心中无法抹掉的遗憾，从Turbo C到C++ Builder，我深刻的体验到Borland的辉煌和无奈，Delphi从VB Killer走到为VB护航（你可以想象Delphi一步到位的ActiveX 控件开发技术有多牛，早期的VB有多土，早期的VB不能开发动态链接库，因此无法开发ActiveX 控件，想起来真令人嘘唏不已），Borland C++的命运也是不济。Borland C++ 3.1的辉煌永远不再了，十几年的开发工作中，我在C++上投入了大量的精力，Borland C++曾经给我带来无数的激动，然而这个经典的名字却在与Microsoft的竞争中渐渐的流逝了……。 <br />MFC4.0的出现，使得人们感觉Microsoft在C++方面赶上来了，这一版的MFC是Win95推出后出现在Visual C++ 4中（Microsoft没有VC 3，VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0）。也许是对Borland C++的潜意识的失望，我不知不觉的接受了MFC，VC 4.2推出时，我通过正常渠道购买了这个编译器的企业版。 <br /><br /><br /><br /><br /><br />关于Microsoft <br />关于Microsoft，有无数的人要对这个名字叙说感觉，这个令人讨厌的名字！不知道是喜欢还是憎恶，你是程序员，你的心思可能就要因Microsoft的存在而动，即使你用Linux，你可能也是因为Microsoft技术因素。多少年来，这个名字每天都出现在你、我、他的面前，因为你不得不面对Windows的存在，可是你憎恨这个名字吗？你讨厌这个名字吗？我不知道是否已经对这个名字麻木了。1998年我个人订了Microsoft MSDN Universal 版，我开始比较全面接触这个公司的开发技术，你可以想象，1998年当你面对上百张技术光盘的时候，你就知道什么叫做“厚度”，当我们有时说出“赶上”或 “达到”Microsoft某些产品的水平的时候，可能我们缺乏对这个公司“厚度”的真实了解。进入MSDN，我感觉Microsoft简直不是一个“公司”，而是（或者正在形成）一个“社会”。当时著名的技术网站http://www.codeguru.com全部的技术资料是可下载的（那个时候http://www.codeguru.com提供整个网站内容下载服务，大约3M左右），大名鼎鼎的www.codeproject.com还不存在。一开始，我始终潜意识在技术上对比Microsoft与Borland，应当说技术上Borland不比Microsoft弱，即使现在也有人持有这个看法，可是为什么Borland走到今天这个地步？而Microsoft却如日中天？若干年前，这两个公司竞争何等激烈，而现在却是另一番“合作”的景象？可能很多人想过，如果Borland不存在，对Microsoft不是更有力吗？其实Microsoft可能精通中国历史，读过《三国》、十分了解战国时期的中国，其实Borland形式上的存在，对Microsoft是十分有利的，至少形式上还有竞争对手，而事实上Borland已经受控于Microsoft（Microsoft是Borland的大股东）。你可以看到一些微妙的现象：Borland为Microsoft提供了大量的人才，其中包括Delphi总设计师以及Borland C++编译器的核心成员；同时也为Microsoft .NET提供强有力的护航服务（看看C# Builder、Delphi .NET）。1998年Microsoft 的COM技术基本已经成熟，这个技术使人感到震撼，当时Microsoft的对手们提出“OpenDoc”用于对抗“COM”，你看看“OpenDoc”阵营的几个成员：IBM、Apple、Borland、Novell，你会感到这个阵营十分豪华、强大。但结果却差强人意，“OpenDoc”无疾而终，而“COM”依然生机勃勃。 <br />有人说“COM”没落了，那么就太不了解Microsoft了。在与“OpenDoc”的竞争中，“COM”是个彻底的胜利者，在与“Java”的竞争中，“COM”成功的进化了，在这个过程中Microsoft体现了强大的吸收能力、以及无法想象的韧劲。.NET只不过是COM的“别名”而已。对于一个经验丰富的C++程序员而言，.NET就是COM的进化，而Microsoft内部.NET就是“COM 3.0”（OLE2就是COM 2.0），而“CLR”就是一个不择不扣的COM对象。曾经有人问我，既然牛顿时代就奠定了基础（想想著名的牛顿-莱布尼茨公式），几百年后的今天，数学还研究“微积分”吗？回答当然是依然在研究！“微积分”早期是针对函数的，现代“微积分”是针对“流形（Manifold）、纤维丛（Fiber Bundle）”的，概念深奥了，可是基本思想不变，只是“微积分”的思想得到合理的延拓与进化，你了解Microsoft吗？Microsoft Research有一批超一流的数学家在为Microsoft工作，其中一些是斐尔兹奖的得主，Microsoft正在实现如同“微积分”进化到“微分流形”一样将“COM”进化到“.NET”。从科学概念角度上分析COM与Java，可能COM更全面、精确，从实现的成熟度上Java可能更成熟，可是你看到，Microsoft正在不紧不慢的追赶。Microsoft令人联想起战国时期的强秦。 <br />战国时期的秦国，采取“远交近攻”“抚弱掠强”等措施傲视六国，今天的Microsoft也是这样，VB1.0时，Microsoft推出“VBX”控件技术，众多的小公司得以生存，Microsoft自己不开发“VBX”组件，同样“VBX”进化为“OCX”时，Microsoft并不十分强大，可是这种试探得到众多小公司的响应。1997年Microsoft Office 97、1998年Microsoft推出Visual Studio 6.0，给众多中、小公司提供了生存、发展的机会，例如Microsoft Office 97中集成了Visual Basic for Application 5.0，这项技术使得几百家软件开发商与Microsoft签署了VBA技术许可协议，即使AutoDesk这样的公司都与Microsoft签署了这个协议，这个协议使得每个集成VBA的产品的给个用户许可为Microsoft付40$的许可费，如果你了解VSIP（Visual Studio Integration Protocol）协议，以及有多少公司签订了VSIP协议，你就真正感觉到Microsoft的可怕；Microsoft Office 97、Visual Studio 6.0的用户界面十分漂亮，为什么Microsoft自己的开发工具不提供类似的软件组件？你看到众多第三方的Microsoft盟友纷纷推出自己的界面库以模仿Microsoft，他们不会反对Microsoft，因为他们已经形成了使得Microsoft以及这些公司得以生存的生态圈。 <br />Microsoft的技术储备有多少，Microsoft之外的人很难说清楚，Microsoft中国公司也未必了解多少，1999年WTL类库刚刚出现的时候，人们就希望WTL能得到官方的支持，或授权给一个Microsoft之外的一个公司（你能想象出Borland C++ 5.0内置的ActiveX开发机制是基于Microsoft ATL类库吗？），直到今天，WTL依然如故，我们完全相信，如果Microsoft强力推广WTL，WTL完全可以流行，可是Microsoft不缺类似的技术，类似的类库还有BCL(Base Control Library，一个用于开发轻量级ActiveX控件的类库)，Microsoft还有一个基于ATL的类库，这个类库用于开发ActiveX Designer，ActiveX Designer是绝大多数程序员不了解得一类对象，如果你熟悉Office开发，你知道Office VBA 中有一类对象，即Form2，此外VB6.0 中的报表设计器（以及著名的Active Reporter），都属于此类对象，用这个类库，你可以为VB6.0以及集成VBA的系统提供定制化的可视化设计机制等等，如今ActiveX Designer已经演化为集成于Visual Studio .NET中的设计器。 <br /><br /><br /><br /><br /><br />向Microsoft学习 <br />无论从什么角度评价Microsoft，我觉得Microsoft是值得我们学习的，如果说生活在这个时代有Microsoft存在是一场灾难，你就应该痛恨这个家伙，但你首先要向这个家伙学习！我无意为Microsoft歌功颂德，我只是想说出十几年我对Microsoft技术的感受。 <br />Microsoft在研究式的开发中受益极大，如果你有兴趣，你可以访问http://research.microsoft.com/，虽然部分中国公司也有研究院，但与Microsoft相比，真有“米粒之珠，也放光华？”的感觉。2003年，我在北京的一个地方现场体验了Microsoft亚洲研究院的招聘会，我看到中国的精英们进入Microsoft的渴望，事实上，在中国大陆，Microsoft亚洲研究院的人力资源已经延伸到各著名高校的相关专业的核心层，我感到，Microsoft几乎不需要“求贤”，因为，只要Microsoft需要，精英们会“蜂拥而至”，每个人都有“可以理解”的理由而向往那个地方，如果为搞数学研究蜂拥到加州大学，我觉得可以理解，因为那里有数学土壤，出了成果国人也会感到自豪，因为“科学无国界”。技术是否有国界？不知道是否有定论？！想想DVD等技术专利给国内业界带来的灾难，不知道应不应该痛定思痛，在Microsoft校园招聘现场的气氛中，我似乎明白了为什么国人“原创技术”少得可怜。我读过几本Microsoft亚洲研究院的高手写的书，明显可以看出，Bill gate 是他们的精神领袖以及他们对Microsoft的虔诚，国内的研究机构应当研究一下Microsoft的用人之道，Microsoft好像是三国里的人物，不知是刘备还是曹操，或者二者的混合物。我经常路过西格玛大厦，第一次西格玛大厦进入真有“朝圣”的感觉，也与Microsoft中国的几个层次的人打过交道，各中滋味实在一言难尽。 <br />在Office大战中，国产软件的确在一些方面与Microsoft进行较量，其实给人的感觉很勉强，界面上的似是而非，或用户习惯方面的接近并不能解决根本的问题，一个好的软件开发人员必须是一个软件使用的高手，很难想象一个软件操作水平很拙劣的开发人员能开发出高水平的软件，我最早使用的软件之一就是Microsoft Word，当时的版本是2.0，大概是1992年的事情，给我留下深刻印象的是集成于Word中的Word Basic，后来，我接触到Excel 3.0，不出所料，Excel中集成的是Excel Basic，后来使用的Access中自然内置Access Basic 1.0，在这些软件集成捆绑成Office之前，我就感觉这些产品的构思十分了不起，很具有Microsoft的风格，因为你知道，即使是一个DOS，Microsoft都要提供一个内置的QBasic或GW Basic。虽然关于Microsoft的产品评论很多，作为一个技术人员，我认为Microsoft的产品构思绝对是第一流的，从1994年早期的Office系列到1997年形成的Office 4.2，我认为，技术构思上均领先于我国2002年以后的Office产品，你听说过如下说法吗？“Dos 作为操作系统的时代，Windows是应用软件；Windows是操作系统时，Office成为Dos时代的Windows；那么如果按此规律，Office会不会替代Windows而成为操作系统？”，现在在开发领域Visual Studio( .NET)正在成为另一个Office，你注意到了吗？控制Visual Studio( .NET)集成开发环境的仍然是一个Basic语言引擎（Visual Basic .NET）。 <br />与许多公司不同的是，在技术体系上，Microsoft几乎所有的产品是息息相关的，Windows、Office、Visual Studio .NET虽然各不相同，但公共的核心即将形成，我们已经看到，核心组件方面，Office与Visual Studio .NET日渐趋于一致，例如Microsoft正在将Office 2003的核心组件VBA 6.X逐步用新的Visual Studio Tools for Office替代，而我们依然在一些似是而非的现象上与Microsoft的产品比较差距，国家采购或政府采购支持的公司，不去钻研核心技术，只是急功近利的采用短期行为急于与Microsoft相争，不知是否有蚍蜉撼树的感觉，个人的体验是，先学习Microsoft，踏踏实实的学，了解Microsoft，深入的了解，然后再喊口号。 <br /><br /><br /><br /><br /><br />为什么用MFC？ <br />经过若干年的竞争，Borland 的OWL几乎消失了，这个OWL是个非常漂亮的C++类库，在Borland C++ 3.1风光无限的年代，OWL真正的做到了独领风骚。然而，Borland C++ 4.0错过了进入32位程序的最佳时机，BC 4.0推出后不久，迎来了Win95，Borland仓促上阵，以一个小的“Pack”使得BC4可以编译基于Win4的程序，当时的Visual C++是2.0版，支持Window16的版本为Visual C++1.51，有意思的是Borland可以用同一个编译器同时支持Win16、Win32，而Microsoft却不得不为Win16、Win32提供不同的编译器。然而，非正式版本的Visual C++ 2.1与Visual C++ 2.2却悄悄地支持了Win95的最新特征，即Win95新提供的一组公共控件，在我的印象中，Borland对Win95新特征的支持不利使得MFC与OWL的距离极大的缩短了。稍后到来的Borland C++ 4.5没有改变这个状况，尽管Borland C++ 5.0同时支持OWL与MFC，可是败象已经显露，Borland C++非常遗憾的只走到了5.5版。C++ Builder虽然形式上引入了Delphi的VCL库，可是许多C++程序员并不买账，因为许多以C++为乐的人更喜欢以编辑的模式进行编码。Visual C++ 4.0的出现，在C++这个战场上，Borland开始落败了。 <br />MFC发展到今天，已经十多年了，尽管褒贬不一，但可以肯定，十几年的技术积累已经奠定了MFC的生存基础，即使Microsoft的长角发布，MFC也不能推出Windows的舞台，事实上，长角（Longhorn）之后的Visual Studio .NET仍将MFC作为一个重要的组成部分，在今年的Visual Studio .NET 2005中，MFC在C++中的位置依然如故。MFC的未来，应该不必担心，只要你深入考察.NET类库，你会发现，MFC的许多思想机制正悄然进入.NET，与此同时，Microsoft的第三方盟友十多年来已为MFC开发了大量的扩展库，如果Microsoft是船，第三方盟友就是载舟之水。许多人认为MFC不发展了，其实是一种错觉，Visual C++ 6的界面十分经典，特别是其中的Docking控制条机制，其实Visual C++ 6的IDE完全就是MFC写的，可是MFC类库中控制条相关的类功能很弱，为什么？你会看到许多与Microsoft友好的公司，他们很快的在MFC基础上实现了Visual C++ 6 的Docking机制，这就是Microsoft的高明之处，Microsoft很会给盟友提供机会，其一贯的做法就是在自己的商品化产品中预先提供一些有趣的特征，使得其他一些公司进行模仿以带动用户群体。Borland不具备这样的储备。MFC第三方市场的繁荣，得益于Microsoft的策略与明智。MFC可否跨平台？理论上完全可以，Microsoft不做，也是策略，但是有许多重要的产品Microsoft却默许MFC移植到其他平台，事实上，Microsoft的合作伙伴之一Mainsoft公司（Windows源码就是从这家公司流失的），几年来就是负责移植MFC程序移植到UINIX、Linux、AIX等操作系统之上。 <br />新版的Visual C++中MFC已经支持.NET开发了，MFC与ATL的协作更好了。根据我的经验，MFC、ATL与.NET库三者完全可以融合在一起综合应用到实际的开发工作中去，如果你是MFC行家，我希望ATL与.NET库能成为你的忠实的左右手。那么有没有同时支持MFC、ATL与.NET库的程序？当然有，Visual Studio .NET IDE就是！而且Visual Studio .NET IDE还支持用ATL与.NET库扩展的Addin。 <br /><br /><br /><br /><br /><br />认识Application对象 <br />如果你熟悉Microsoft Office，你应该进一步的剖析这个大型软件，Microsoft Office中几乎每个程序都是可二次开发的，这一点得益于Microsoft Office内置的二次开发机制，一个是基于COM机制的VBA模型，另一个是基于.NET框架的托管模型：Visual Studio Tools for Office。作为一名程序员，你应当在技术角度解析Office的技术结构。Microsoft的大多数软件的对象结构可以通过Visual Studio提供的工具OLE/COM Object Viewer考察其类型库得到，通过引用类型库，你甚至可以得到描述对象信息的C++头文件。这样做真是好处多多。一个典型的Office通常都有一个Application对象（或其他一个与之相当的对象），这个对象相当于软件枢纽，在这里，我们不讨论Office，借此话题说说Application对象。大多数支持扩展（Addin、Plugin）的软件都存在类似的构造。通常，一个系统得Application对象或者是一个COM对象，或者是一个.NET对象，如果你的系统存在这类对象，你的系统就基本具备支持Addin、Plugin的机制了。一个理想的做法就是在一个MFC系统中，内置一个ATL对象或.NET对象，稍后我们给出方案如何做到这一点。设计Application对象的关键是如何规划这个对象的属性、方法、事件。如果你希望系统具备良好的扩展性，Application对象是十分关键的，这也是构架艺术的体现。所谓Addin(Plugin)，是系统运行时根据需要加载的对象库，Addin(Plugin)之所以可以扩展系统，关键的因素就是系统加载Addin(Plugin)时，将Application对象传递给Addin(Plugin)库，设想一下，如果Application恰到好处的触发了系统事件，而Addin(Plugin)库如愿的解释了事件，一个Addin(Plugin)库的任务不就OK了吗！因此Application对象是系统设计的关键。 <br />如果你精通ATL对象，在你的MFC系统中添加一个ATL对象，这个任务可以用VC Wizard完成。你已经接受了一个事实，就是MFC程序中存在一个CXXXApp对象（CWinApp的派生类），现在你要做的是增加一个对应得ATL对象。这个对象可以在CXXXApp::InitInstance()中创建，如果ATL对象的类是CXXXAppObject，建议你在CXXXApp对象对象中增加一个成员变量，例如：CComObject &lt;CXXXAppObject &gt;* m_pAppObj，然后可以入下初始化m_pAppObj： <br />m_pAppObj = new CComObject &lt;CXXXAppObject &gt;； <br />注意程序结束时在CXXXApp::ExitInstance()中释放m_pAppObj，语句如下： <br />delete m_pAppObj； <br />你可以将系统得关键属性设置成CXXXAppObject的属性，例如系统得标题、是否为多文档等等。系统希望外部调用的功能可以实现为CXXXAppObject的方法，这一点取决于你的需要。系统需要外部扩展的功能，表现为CXXXAppObject的事件，关键是在恰当的位置触发事件以及提供的事件参数。例如，你可以在CXXXApp::InitInstance()触发应用程序开始的事件OnStartUp，Plugin捕获事件后，可以进行特定的初始化（身份确认、初始信息查询等等）； <br />你可以在CXXXApp::ExitInstance()触发应用程序结束事件，Plugin捕获事件后，处理用户需要的系统退出工作。所有的设计取决于具体设计。 <br />如何加载Plugin，是一个有趣的问题，如果Plugin实现为一个COM范畴（Category），可以运用COM技术枚举这个Category；可以将Plugin安装到一个特定目录，也可以通过注册表。Plugin的实现可以用COM技术、也可以用.NET框架。适当的机会我会提供例子…… <br /><br /><br /><br /><br /><br />一些感想 <br /><br /><br /><br /><br /><br />一时心血来潮，就发了这个帖子，很难说是有心，还是无意。几天前我在新浪网上看应氏杯围棋决赛，我觉得该赢了吧，作为一个围棋迷，我们等了十几年，等到了属于国人的应氏杯。记得7、8年前在还在大学工作的时候，有一次，一位同事兴致冲冲的走道我面前对我说：“嗨，昨天马XX赢了李昌镐！”，当时我在系办公室正在看报纸，那位仁兄见我头都没抬，非常不满的抢下报纸，对我吼道：“喂！马XX赢了李昌镐！！你听到没有！！！”，我对他说：“你大惊小怪个啥？！马XX输了李昌镐多少盘，你知道吗？”，马XX几乎一直在输给李昌镐，人们已经不奇怪了，偶尔赢一次，国人就把他捧得北都找不到了，李昌镐弱冠17的时候就傲视这个世界了，可至今面孔不变，几天前的农心杯，中日联军5个人，被他打个落花流水，李昌镐是公认的世界第一，以至于有的高手知道下一个对手如果是他，就会去订回程机票。这次应氏杯，国人竟然感谢崔哲瀚，何也？因为这个弱冠19的小子，挡住了他的大哥李昌镐才使得应氏杯有了悬念。当国人媒体在说韩国仅李昌镐一人厉害的时候，不知道是出何居心还是自欺欺人，李昌镐年方30，不知道要力压中、日多少年！面对这个名字，真有点麻木了，这个太极虎！软件界又来了我们一向不齿的印度虎，2001年我们的软件出口额仅是印度的四十分之一，我们震惊了，怎么可能呢？这个四十分之一水分很大，很可能更可怜！当时我在大连参加一个关于“大连软件出口国内第一”的官方会议，那位大人在会上说：“据说，我们大连软件出口国内排名第一，市有关领导希望今天的会议给出这个第一的数字依据，希望你们把数据报上来，去年的数据也可申报，注意，我们要的只是数据，你们仔细体会，我们根据数据，有奖励，机会难得呀！”……。某一天，几个朋友在我家看央视的对话节目，对话一方为国内的软件大鳄们（用友、阿尔派等公司的老总们），另一方为印度软件的一个代表团。当问及中、印软件差距的时候，我们的刘老总（代表阿尔派）不以为然的说，据他的看法，我们已经快赶上（印度）了，……，言下之意颇有印度的水平不过如此的感觉，印度方的话我至今记忆犹新：“是否赶上，国际市场说的算！在中国看来，印度程序员的个性不足，技术也不怎么样，其实是个错觉，印度软件首先注重个性，许多重要的美国商品化软件都是在印度本土开发的……”，我们的舆论总是将印度程序员的水平描述的平庸至极，可是差距日渐拉开，……，围棋、足球（不好意思谈，谈不出口！）、软件，我们被近邻严酷的封锁了，乐坏了记者们、给媒体带来了生机…… <br />日本江户时代的围棋，如果一个人要想世袭一个称号（例如：本因坊），他必须战胜所有的师兄弟，然后，住进师父家的内室，你知道以后的事情吗？以后，这个棋手，就得为师父一家做饭、带孩子、搞卫生……，其余的门人则一心一意的下棋，这样的人、方式，造就了一代一代的本因坊，他们的棋谱大多数都流芳至今，这就是早期日本围棋的悟道模式。软件总共有多少语句？我最早接触的计算机软件教材是一本英文版的（影印的D版），不同于我们，那本书的作者构造了“X-语言”，他们不讲什么C、Pascal、Basic，一旦缺了什么机制，就给“X-语言”添加些成分。什么C、Pascal、Basic，你感觉差不多，但现在却分出了等级！我们驾驭语言的能力弱得很，可是我们在语言的细微之处却很讲究，不知道对不对，许多程序员也许是出于虚荣而用C++，事实上，地球人都知道，做数据库，Delphi、VB远比C++胜任，铺天盖地的C++的书，写的东西几乎雷同，因为，有用的或者作者不写、或者作者不懂。有时我在想，如果国内没有内需，会怎样？也许软件内需的存在，造就了中国软件的特色，我认为国内业界并没有充分利用中国软件内需的存在，也许中国软件内需的存在是软件落后的硬伤。 <br />我记得一部电影《神辫》，那个英雄的大辫子被洋人炸掉了，最终他成了神枪手，战胜洋人用大刀、秘籍是不行的，用洋的东西战胜洋的技术才是正道。我觉得，一个好的程序员必须了解软件的历史，学习历史，你知道你为什么弱，别人是如何强大的。我们正在另一个战场上抗美（可笑的是我们却要赶超印度！），无论Microsoft、Borland如何争斗，无论他们谁统治谁，他们不影响美国的强大，朋友们，学习Microsoft，开发出让国人感到牛的软件！ <br />这个帖子出乎本人的意料，愿意与大家共勉，希望这个帖子常在，与大家敞开心扉的交流！ <br /><br /><br /><br /><br /><br />FireFox与Microsoft <br />FireFox在一片赞扬、欢呼声中激情登场了，也许人们真的期待已久，平静的水面终于被扔进一块石头。我是IE的最早期的用户了，1996年首次Microsoft的TED（技术教育大会），IE4还没有发布时候，我们有机会目睹了内部版本的IE4（当时内部名称是：纳什维尔，英文名称忘记了），那真是一次令人激动的预览，当时IE3与Navigator 3激战正酣。当你第一次看到想象中的“Active Desktop”，如果你没有身临其境，你不会激动。IE4本质上是一个Shell，其SDK是免费的，Navigator是基于Mozilla的浏览器，虽然是开源的，由于要照顾更大的共性（与操作系统无关），因此Mozilla不能充分的利用Windows的优势，Mozilla不能为广大的程序员带来所谓开发人员的“快感”，顶尖程序员可以驾驭Mozilla，以实现技术深度带来的乐趣，最早的Navigator同时提供17个版本（注意：不是17种自然语言，而是17种操作系统），从数学角度分析，Mozilla就像一组公理，你可以以此为基础开发不同操作系统上的浏览器，Navigator就是基于Mozilla的一个漂亮的结果，你能欣赏到代码结构的优美，然而失去的却是功能强大的个性（要知道，Windows用户在数量上远大于其他操作系统用户的总和）。普通用户不可能读懂Mozilla的代码，即使懂了也不能很好的运用，这也许是Mozilla（以及大多数开源代码）失败的致命原因之一。IE内核聪明的抓住了开发者，你想想：对数以万计的中、初级开发者而言，容易驾驭是首选的选择，也是明智的。我读过Mozilla，但我不会在开发过程中为一个具体的项目应用它。只要是浏览器，就不可能绝对的安全，无论是Mozilla，还是IE。当我了解到FireFox是基于Mozilla的一个新的浏览器，我基本上对其失去了信心，我有一个奇怪的观点：FireFox的推出，最大的受益者绝对是Microsoft，即使Microsoft失去20%的份额，但是会导致Microsoft强化IE，Microsoft正不知道如何促使IE进化的时候，FireFox的出现无疑为Microsoft提供了机会，物种进化的原则就是竞争，FireFox就是促进IE进一步强大的催化剂。FireFox的扩展机制的确十分灵活，如果对手不是Microsoft，就很难掀起波澜，而且当高级的开发者逐渐了解FireFox的时候，FireFox的漏洞就会渐渐暴露，试想想，如果某种Linux取代了Windows，那么，它的漏洞也会与Windows一样多，因为那个时候，会有与研究Windows漏洞一样多的人去研究对应得Linux的漏洞！从个人的角度上看，Microsoft也许有点“冤”，因为窥视Microsoft弱点的人实在太多了。从理论上看，计算机安全性是个永远的话题，就像任何社会都需要警察一样，没有了小偷、贼、犯罪，警察也就消失了，你想想，文明是什么？野蛮能消失吗？野蛮消失了，文明也就不存在了，高度文明就是更不存在了。人类克服了癌症，下一个疾病会比癌症更致命，但这并不意味着不必克服了癌症，进步真是一种挑战…… <br />IE的技术构思肯定是个卓越的构思，IE可扩展的机制，会给Windows开发者带来许许多多的益处。我正在计划一片文章，介绍如何将你的对象模型与MSHTML库实现对接，这样，在HTML文件中可以将你的指令系统与HTML对象模型融合在一起。 <br /><br /><br /><br /><br /><br />话说“Hook” <br />在CSDN上时常看到关于“hook”，的问题，令我想起另一个话题，那就是游戏“外挂”。Hook提供一种改变一个Windows窗口消息处理的一种手段，通常的开发根本用不到，因此，谈不上“常用”，早期的Windows，由于不能很好的支持远东（当然包含汉字）地区的文字，因此出现了许多外挂的软件补充Windows的不足，中文之星是一个典型的、令国人自豪的软件，监控软件也许要运用hook技术，此外，很难想象什么软件会用到hook。有人问我，能不能改变一个进程的数据处理行为，我曾经告诉他：能，也不能！感觉告诉我，hook绝大多数场合下是一种“不礼貌”的行为。曾有一段时间，我的服务器，经常有人悄悄地近来，给我增加许多超级用户，肆意修改我的管理权限，我找到托管商，解决了这个问题，那时，我也买了几本服务器监听、安全方面的书，看了几天，我就放弃了，为什么？担心学坏（正、邪仅在一念之差），其实，每个服务器都很脆弱，对有经验的系统程序员而言，安全性与道德准则是联系在一起的，软件技术上走邪路很容易，有时我会想，如果我去设计病毒或者当黑客，会怎样？基础数学出身的我，数论、组合学、密码理论统统不是问题，Windows虚拟驱动程序开发，也不是问题！为什么那么多的人关心hook？国人的正道软件寥寥无几，可破解术却出神入化，可惜，可惜！hook是一种底层的编成机制，能理解好hook的人，完全具备掌握一流技术的底蕴，真希望回头…… <br /><br /><br /><br /><br /><br />MFC的批判 <br />记得梁羽生先生笔下有一位正邪兼修的高手，名曰“乔北溟”（好像是这个名字），一次此人与大侠张丹枫在一个庙中相遇，乔北溟随手操起香案上的香炉，张丹枫问他：“你的家伙称手吗?” ，乔北溟笑答：“以吾辈之见识，还在意手中之物是否为剑？”，张丹枫一愣，心中暗念，此人果然不同凡响…… <br />说起MFC，许多人都会撇撇嘴，高手们会对其提出许多尖锐的批评，例如，刻板的Document-View机制，繁复的框架结构，怪异的COM实现以及令人莫名其妙的宏，等等。MFC的大而全，不仅捆住了MFC开发组的手脚，也为全面掌握MFC的愿望设置了障碍。高手们批评之余，可能忽略了一个基本的事实，这个事实就是，你的批评来自于你对MFC的深入理解，当许多人指出MFC的种种弱点时，他们或许不愿意承认：他们的技高一筹、见识超人一等是MFC带来的，不止一次有人与我谈及：“MFC的COM实现，实在差劲，看看ATL（不容否认，ATL至今仍然是开发COM的最佳C++类库），你就会感觉MFC的臃肿……”，我们中的许多人潜意识里不知不觉的在作一件事：“当我们借助一部梯子登上一层楼的时候，我们会评价这个梯子是如何如何之糟糕。”1999年，我的一个项目中需要一个描述引擎，VBS（Visual Basic Script），是个免费的语言引擎，但功能局限极大，我联系了美国的Summit公司，他们很快寄来了Microsoft的Visual Basic for Application SDK 6.0，当时我的团队可谓很强，其中的几位研究生C++修养很好，拿到VBA SDK时，他们对我说：“应当没问题，我们很快就会搞定VBA SDK”，可是几天过去了，连个例子都没出来，原来，虽然VBA SDK提供了MFC扩展类库（基于模版机制的MFC/ATL合成类库），可实现得极其别扭，我接手后的当天晚上，VBA 的IDE就集成到系统中，第二天可编程对象顺利出现在VBA 的IDE中，其余人觉得很奇怪，一看代码，原来我绕过Microsoft的例子，完全是另外的实现途径，那个时候，我感觉到，Microsoft这个家伙真的可恶，本来清晰的集成途径，却人为的让你绕来绕去增加技术难度，过后想想，也可以理解，不这样，第三方的Summit何以作技术支持？我经常想，如果没有商业利益，许多技术应当十分简洁、高效，这一点，Microsoft以及其他大公司都十分明白，如果一切都是最佳的实现模式，可能就另外一种局面了，复变函数论中有一个著名的定理：“复平面上处处解析的函数一定是常值函数。”， 学生们很难理解，当时我说，如果把一个省几十个县的最好学生组成一个班会怎样？结果是一定有一个较差的学生（除非这个班只有一个学生！），这是个无法抗拒的定则，你想想，用天下最好的20个菜形成的酒席是什么味道？那一定是最差的！ <br />Microsoft的MFC是值得你学习和使用的，如果你讨厌这个东西或者你认为这是个邪恶的东西，你学学乔北溟，实现正邪归一…… <br /><br /><br /><br /><br /><br />有感于“鸡兔同笼” <br />小女初到北京时，对北京的教育颇为不适，铺天盖地的数学奥赛培训班向她压过来，孩子真是辛苦。她四年级时，就的对初等数论的基本内容进行强迫性的熟悉，还好，经过一段时间的努力，掌握了“鸡兔同笼”、“韩信点兵”等中国经典，马马虎虎的能证明费马小定理，有一天，她问我：“爸爸，大学数学什么样？还有‘鸡兔同笼’吗？”，我说，有，我特意找了本老外写的《Basic Algebra》，找到其中的“中国剩余定理”，小孩子接着问道：“这本书中还有中国人的数学内容吗？”，我在习题中给她找到华罗庚老先生的“反同构定理”，小孩子又接着问：“还有吗？”，我感到很没面子，因为真的找不到了…… <br />曾经的一个梦，就是当一个数学家！为此，研究生时期买了大量的数学书，当时我们系的资料室是联合国教科文组织的藏书室，可以说，里面就是一个装满武功秘籍的宝库。有一天我们打扫资料室的一个仓库，仓库里全是鼓鼓囊囊的麻袋包，上面落满灰尘，手触摸一下，能粘出几毫米厚的灰尘，可以想象有几年没有打扫了。同学无意中揭开一个麻袋，我们惊呆了，里面是美国60年代各大学的数学杂志，每个杂志的名字都是响当当的，那真叫浩如烟海！当时我们就想，我们的论文能发表到其中吗？如果侥幸发了几篇，可想而知，我们就可以当博导了，这些比国内所谓核心期刊有分量得多的杂志，就像CSDN上的帖子一样，很快就会被淹没了，也许很久都不会有人参考、访问……，有一天，我也当了老师，面临着种种考核，于是，我们就成了论文机器，不论是否有价值，只要是核心的，你就高人一等。那个时候，我经常想起那些麻袋里的文献…… <br />我们整体水平的落后，导致整体的浮躁，数量上上去了，质量却下来了。若干年后，也许我成熟了，我们这些曾经站在大学讲坛上的人，没什么好的东西讲（谈不上 ‘教’）给年轻的学生，记得当年我校的计算中心计划招个培训班，几天过去，仅有7人报名，第8人来时，前7人就退了3人，主任感到奇怪，问学生，学生不语，其中原委并不复杂。我发此帖并没有精心策划，的确如某些网友所言是随感而发，“鸡兔同笼”、“勾股定理”已经有了历史地位，如果仅仅够用，我们住草房子一样保暖，为何建大厦呢？为什么放弃传统的长袍、马褂而去穿西装革履？病毒软件大战几乎是自杀性的内战，没有撼动国外产品的分毫，我们许多人喜欢对自己人说三道四，是不是很少想一致对外？人家卖我们打折的产品，条件是附加一份“忏悔书”，而执行者却是我们国人，为什么？因为我们的东西匮乏！当年别人用钢铁武器掠夺了我们的财富，他们强大了，地痞无赖换上了绅士面孔，讲起了法律，当你用D版时，人家文明的指责你，你的人力、财力、物力统统为人所用，取之于你用之于你，而我们却依然陶醉在“鸡兔同笼”、“勾股定理”的历史成就之中，我们依然喜欢争论“勾股定理”谁发现得更早，π是谁最先精确计算的，就像谈论C++谁的水平更高一样。 <br /><br />后记： <br /><br /><br /><br /><br /><br />为感谢CSDN网友的支持,本人拟定陆续增加几个新的帖子: <br />一、十年MFC经历认识的Microsoft开发技术-多文档界面开发技术：此贴讨论一类多文档界面，主窗口是一个单文档界面，如果你愿意，你可以将多文档窗口作为主窗口的一个视图（CView）显示，这类多文档界面支持无限多个文档类型（即可以加载任意多个文档模板），支持（基于COM、.NET）二次开发技术以及VBA集成； <br />二、十年MFC经历认识的Microsoft开发技术-可视化文档界面设计技术：此贴讨论MFC Document/View 机制的可视化实现，将给出一种所见即所得的Document/View 设计机制；其中包含如何集成ActiveX Ctrl、.NET User Control、MFC CView类对象以形成一个MFC窗体； <br />三、在MFC程序中如何有效的使用HTML、flash，例如，可以实现flash动画作为一个程序的Splash以增强程序的感染力，使用HTML、flash动画作为MDI程序的MDI用户区的背景等等……； <br />四、十年MFC经历认识的Microsoft开发技术-MFC .NET组件开发技术：介绍如何使用MFC类库开发.NET组件，例如可以用MFC开发WinForm对象，然后用于VB.NET、C#等等。 <br /><br />如果大家有好的建议，请与我联系（sunhui@mail.apptemplate.com、sunhuizlz@yeah.net）,如果有北京的朋友肯帮忙协助，在下不胜感激，希望得到大家的支持！</span></p>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/15399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-11-18 22:26 <a href="http://www.cppblog.com/wlwlxj/archive/2006/11/18/15399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用MFC做VS起始页界面</title><link>http://www.cppblog.com/wlwlxj/archive/2006/11/16/15259.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 16 Nov 2006 12:39:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/11/16/15259.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/15259.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/11/16/15259.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/15259.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/15259.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 好的软件有好的开始，微软VS IDE的起始界面做的实在不错，色调和布局都是很舒服，这里我动手实现了一个&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/11/16/15259.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/15259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-11-16 20:39 <a href="http://www.cppblog.com/wlwlxj/archive/2006/11/16/15259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC的容器站点控件模型</title><link>http://www.cppblog.com/wlwlxj/archive/2006/09/03/11998.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sun, 03 Sep 2006 10:54:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/09/03/11998.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11998.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/09/03/11998.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11998.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 了解ActiveX控件创建机制，了解应用与ActiveX控件之间的模型，了解MFC背后为我们做了什么!&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/09/03/11998.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-09-03 18:54 <a href="http://www.cppblog.com/wlwlxj/archive/2006/09/03/11998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6的MFC应用中集成COM的一个小问题</title><link>http://www.cppblog.com/wlwlxj/archive/2006/09/01/11906.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Fri, 01 Sep 2006 00:18:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/09/01/11906.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11906.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/09/01/11906.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11906.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 是VC6的失误吧!MFC加入ATL对象，直接创建对象不成功。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/09/01/11906.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-09-01 08:18 <a href="http://www.cppblog.com/wlwlxj/archive/2006/09/01/11906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC应用集成老技术自动化(Automation)</title><link>http://www.cppblog.com/wlwlxj/archive/2006/08/31/11896.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 31 Aug 2006 12:33:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/08/31/11896.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11896.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/08/31/11896.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11896.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11896.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一直喜欢讲体系，学习技术，总是想把握住整个体系，有利有弊。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/08/31/11896.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-08-31 20:33 <a href="http://www.cppblog.com/wlwlxj/archive/2006/08/31/11896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC应用集成VBA二次开发</title><link>http://www.cppblog.com/wlwlxj/archive/2006/08/30/11871.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 30 Aug 2006 15:55:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/08/30/11871.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11871.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/08/30/11871.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11871.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: VBA集成开发技术是一种软件系统扩展机制，很多国外大型软件都支持VBA二次开发&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/08/30/11871.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-08-30 23:55 <a href="http://www.cppblog.com/wlwlxj/archive/2006/08/30/11871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BCG Skin插件机制研究过程</title><link>http://www.cppblog.com/wlwlxj/archive/2006/08/25/11674.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 24 Aug 2006 16:25:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/08/25/11674.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11674.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/08/25/11674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11674.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11674.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 研究BCG Skin技术的思考过程&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/08/25/11674.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-08-25 00:25 <a href="http://www.cppblog.com/wlwlxj/archive/2006/08/25/11674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TangramLite第二弹－－网页作MDI背景实现程序交互</title><link>http://www.cppblog.com/wlwlxj/archive/2006/08/22/11572.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Tue, 22 Aug 2006 06:41:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/08/22/11572.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11572.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/08/22/11572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何充分利用软件空间进行宣传&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/08/22/11572.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-08-22 14:41 <a href="http://www.cppblog.com/wlwlxj/archive/2006/08/22/11572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC框架推荐－－Tangramlite</title><link>http://www.cppblog.com/wlwlxj/archive/2006/08/21/11542.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 21 Aug 2006 14:09:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/08/21/11542.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/11542.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/08/21/11542.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/11542.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/11542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 基于MFC的开发框架&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/08/21/11542.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/11542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-08-21 22:09 <a href="http://www.cppblog.com/wlwlxj/archive/2006/08/21/11542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使MFC变漂亮二：MFC与HTML交互示例</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 22 Jul 2006 08:51:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/10343.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/10343.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/10343.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 多一种方法，多一种表现手段&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/10343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-22 16:51 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使MFC变漂亮一：MFC与Flash交互示例</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/19/10240.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Wed, 19 Jul 2006 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/19/10240.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/10240.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/19/10240.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/10240.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/10240.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 多一种方法，多一种表现手段。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/19/10240.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/10240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-19 22:47 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/19/10240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>庖丁解MFC－－（二）应用与框架的剥离</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/08/9575.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 08 Jul 2006 06:42:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/08/9575.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/9575.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/08/9575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/9575.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/9575.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以无厚入有间，恢恢乎其于游刃必有余地矣。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/08/9575.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/9575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-08 14:42 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/08/9575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>庖丁解MFC－－（一）文档视图与应用框架剥离</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/06/9476.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Thu, 06 Jul 2006 02:06:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/06/9476.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/9476.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/06/9476.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/9476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/9476.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以无厚入有间，恢恢乎其于游刃必有余地矣。&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/06/9476.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/9476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-06 10:06 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/06/9476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC与ATL的男女关系</title><link>http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 03 Jul 2006 00:21:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/9297.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/9297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/9297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MFC是一个男人,ATL是一个女人&nbsp;&nbsp;<a href='http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html'>阅读全文</a><img src ="http://www.cppblog.com/wlwlxj/aggbug/9297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-07-03 08:21 <a href="http://www.cppblog.com/wlwlxj/archive/2006/07/03/9297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC集合类使用备忘录</title><link>http://www.cppblog.com/wlwlxj/archive/2006/03/04/3721.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Sat, 04 Mar 2006 12:14:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/03/04/3721.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/3721.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/03/04/3721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/3721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/3721.html</trackback:ping><description><![CDATA[老是记不住，没有本本，所以放这里。<br /><a href="/files/wlwlxj/MFCCollection.rar">几个例子</a><br />msdn：<font size="3"><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vccore/html/_core_collections.3a_.choosing_a_collection_class.asp">有关选择集合类的建议</a></font><img src ="http://www.cppblog.com/wlwlxj/aggbug/3721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-03-04 20:14 <a href="http://www.cppblog.com/wlwlxj/archive/2006/03/04/3721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC DLL实战</title><link>http://www.cppblog.com/wlwlxj/archive/2006/02/13/3243.html</link><dc:creator>万连文</dc:creator><author>万连文</author><pubDate>Mon, 13 Feb 2006 15:32:00 GMT</pubDate><guid>http://www.cppblog.com/wlwlxj/archive/2006/02/13/3243.html</guid><wfw:comment>http://www.cppblog.com/wlwlxj/comments/3243.html</wfw:comment><comments>http://www.cppblog.com/wlwlxj/archive/2006/02/13/3243.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/wlwlxj/comments/commentRss/3243.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wlwlxj/services/trackbacks/3243.html</trackback:ping><description><![CDATA[
		<p>每次都为dll书写烦恼，书写模式其实是固定的，下面就一步一步完全实现一个动态库。<br />1、选择MFC AppWizard(dll)，项目名Demo，默认完成<br />2、新建一h文件DemoExp.h，导出模块所有接口，新建一cpp实现接口<br />3、在DemoExp.h中：<br />// 下面两行防止重复包含<br />#ifndef _DEMOEXP_H   (注:可以是任意的)<br />#define _DEMOEXP_H<br /><br />// 下面一行预定义,在编译的时候定义_DEMOEXP把函数导出,调用的时候没有定义则导出函数<br />#ifdef _DEMOEXP   (注:可以是任意的)<br />#define DEMOEXPAPI __declspec(dllexport)<br />#else<br />#define DEMOEXPAPI __declspec(dllimport)<br />#endif<br /><br />// 导出函数接口<br />DEMOEXPAPI int ShowDlg();<br /><br />// 调用的时候没有定义则自动连接<br />#ifndef _DEMOEXP   (注:和上面一样)<br /> #pragma comment(lib, "Demo.lib")<br />#endif</p>
		<p>#endif</p>
		<p>4、在DemoExp.cpp中先空实现：<br />#include "StdAfx.h"<br />#include "DemoExp.h"</p>
		<p>DEMOEXPAPI int ShowDlg()<br />{<br /> return 0;<br />}<br />5、添加一对话框,并生产类CDemoDlg类<br />6、在DemoExp.cpp中：<br />#include "DemoDlg.h"<br />修改函数如下：<br />DEMOEXPAPI int ShowDlg()<br />{<br /> // 切换资源模块<br /> AFX_MANAGE_STATE(AfxGetStaticModuleState());</p>
		<p> CDemoDlg dlg;<br /> dlg.DoModal();<br /> return 0;<br />}<br />7、设置Setting-&gt;c/c++-&gt;Preprocessor definitions:添加,_DEMOEXP;stdafx.h中添加#include "Resource.h"<br />8、编译即生产dll<br />9、添加一对话框程序测试,具体见<a href="/files/wlwlxj/demo.rar">示例代码。</a></p>
<img src ="http://www.cppblog.com/wlwlxj/aggbug/3243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wlwlxj/" target="_blank">万连文</a> 2006-02-13 23:32 <a href="http://www.cppblog.com/wlwlxj/archive/2006/02/13/3243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>