﻿<?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++博客-Michael's Space-文章分类-SDK/MFC</title><link>http://www.cppblog.com/MichaelLiu/category/1441.html</link><description>Technology changes the world, serves the people.</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 02:08:26 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 02:08:26 GMT</pubDate><ttl>60</ttl><item><title>如何实现模式对话框程序启动时的系统栏显示</title><link>http://www.cppblog.com/MichaelLiu/articles/16376.html</link><dc:creator>奔跑的阿甘</dc:creator><author>奔跑的阿甘</author><pubDate>Wed, 13 Dec 2006 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/MichaelLiu/articles/16376.html</guid><wfw:comment>http://www.cppblog.com/MichaelLiu/comments/16376.html</wfw:comment><comments>http://www.cppblog.com/MichaelLiu/articles/16376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MichaelLiu/comments/commentRss/16376.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MichaelLiu/services/trackbacks/16376.html</trackback:ping><description><![CDATA[如何实现模式对话框程序启动时的系统栏显示<br /><font size="2">Michael Wednesday, December 13, 2006<br /><br />在实际工作中,需要用到一些类似状态监控的程序,它们往往在一启动时就要最小化到系统栏上.<br />这里涉及到两个问题:1)如何在启动时隐藏主窗口; 2)用托盘实现系统栏显示.<br />模式对话框和非模式对话框的区别在于是否自身拥有一个消息循环,对于模式对话框程序,要实现程序启动时的隐藏,一个比较完美(无闪烁地隐藏)的做法如下<br /></font><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"><font size="2"><span style="COLOR: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></font><font size="2"><span style="COLOR: #000000">BOOL CMyApp::InitInstance()<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_28_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_220_Open_Text.style.display='none'; Codehighlighter1_28_220_Closed_Image.style.display='inline'; Codehighlighter1_28_220_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_28_220_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_220_Closed_Text.style.display='none'; Codehighlighter1_28_220_Open_Image.style.display='inline'; Codehighlighter1_28_220_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_28_220_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></font><span id="Codehighlighter1_28_220_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> <img src="http://www.cppblog.com/images/dot.gif" /></span></font><span style="COLOR: #008000"><br /></span><font size="2"><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span></font><span style="COLOR: #000000"><br /></span><font size="2"><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  CMyDlg</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pDlg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span></font><font size="2"><span style="COLOR: #000000"> CMyDlg;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_104_202_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_202_Open_Text.style.display='none'; Codehighlighter1_104_202_Closed_Image.style.display='inline'; Codehighlighter1_104_202_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_104_202_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_104_202_Closed_Text.style.display='none'; Codehighlighter1_104_202_Open_Image.style.display='inline'; Codehighlighter1_104_202_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (pDlg</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">Create(IDD_MY_DIALOG)) </span><span id="Codehighlighter1_104_202_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></font><span id="Codehighlighter1_104_202_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    m_pMainWnd </span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000"> pDlg;<br /></span><span style="COLOR: #008080"> 8</span></font><font size="2"><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    Run();<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_154_198_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_198_Open_Text.style.display='none'; Codehighlighter1_154_198_Closed_Image.style.display='inline'; Codehighlighter1_154_198_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_154_198_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_198_Closed_Text.style.display='none'; Codehighlighter1_154_198_Open_Image.style.display='inline'; Codehighlighter1_154_198_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (pDlg) </span><span id="Codehighlighter1_154_198_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></font><span id="Codehighlighter1_154_198_Open_Text"><font size="2"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span></font><font size="2"><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      delete pDlg;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />      pDlg </span><span style="COLOR: #000000">=</span></font><font size="2"><span style="COLOR: #000000"> NULL;<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></font></span><span style="COLOR: #000000"><br /></span><font size="2"><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></font></span><span style="COLOR: #000000"><br /></span><font size="2"><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">return</span></font><font size="2"><span style="COLOR: #000000"> FALSE;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></font></span></div><font size="2"><br />这里使用CWnd::Create()函数来创建一非模式对话框,同时添加了消息循环的处理Run(). 因为pDlg(属性为非visible)并没有调用ShowWindow(),所以创建后为隐藏状态. <br /><br />关于托盘的显示只要调用WINDOWS的SHELL API即可.<br />以下代码用于添加一托盘:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">        NOTIFYICONDATA nc;<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.cbSize</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(NOTIFYICONDATA);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.hIcon</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">AfxGetApp()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">LoadIcon(IDR_MAINFRAME);<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.hWnd</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">m_hWnd;<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    lstrcpy(nc.szTip,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hi!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.uCallbackMessage</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">WM_NC;<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.uFlags</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NIF_ICON </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> NIF_MESSAGE </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> NIF_TIP;<br /></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.uID</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">IDC_NC;<br /></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    Shell_NotifyIcon(NIM_ADD,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nc);</span></div></font><br /><font size="2">以下代码用于删除一托盘:<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">        NOTIFYICONDATA nc;<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.cbSize</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(NOTIFYICONDATA);<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.hWnd</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">m_hWnd;<br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.uCallbackMessage</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">WM_NC;<br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.uFlags</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NIF_ICON </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> NIF_MESSAGE </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> NIF_TIP;<br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    nc.uID</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">IDC_NC;<br /></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    Shell_NotifyIcon(NIM_DELETE,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nc);</span></div></font><br /><font size="2">托盘图标的消息定义及响应函数如下:<br />//定义消息码<br />#define  WM_NC  1001<br />#define  IDC_NC 1002<br /><br />//定义消息映射<br />ON_MESSAGE(WM_NC,OnNc)<br /><br />//定义消息处理函数声明<br />afx_msg void OnNc(WPARAM wParam,LPARAM IParam);<br /><br />//定义消息处理函数实现<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> CMyDlg::OnNc(WPARAM wParam,LPARAM IParam)<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_47_362_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_362_Open_Text.style.display='none'; Codehighlighter1_47_362_Closed_Image.style.display='inline'; Codehighlighter1_47_362_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_47_362_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_47_362_Closed_Text.style.display='none'; Codehighlighter1_47_362_Open_Image.style.display='inline'; Codehighlighter1_47_362_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_47_362_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_47_362_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ((IParam </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> WM_LBUTTONDOWN) </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> (IParam </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> WM_RBUTTONDOWN))<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img id="Codehighlighter1_113_360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_113_360_Open_Text.style.display='none'; Codehighlighter1_113_360_Closed_Image.style.display='inline'; Codehighlighter1_113_360_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_113_360_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_113_360_Closed_Text.style.display='none'; Codehighlighter1_113_360_Open_Image.style.display='inline'; Codehighlighter1_113_360_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_113_360_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_113_360_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        CMenu menu;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        menu.LoadMenu(IDR_MENU1);<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        CMenu</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> pPopup</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">menu.GetSubMenu(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        ::SetMenuDefaultItem(pPopup</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_hMenu,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,TRUE);<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        CPoint Point;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        GetCursorPos(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">Point);<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        pPopup</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL);<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div></font><br /><font size="2">最后很关键的是,因为我们采用了非模式框来隐藏窗口,当对话框退出后,我们需要调用PostQuitMessage()来发送WM_QUIT消息给应用程序从而结束消息循环退出整个程序.<br /><br />[全文完]</font><img src ="http://www.cppblog.com/MichaelLiu/aggbug/16376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MichaelLiu/" target="_blank">奔跑的阿甘</a> 2006-12-13 16:18 <a href="http://www.cppblog.com/MichaelLiu/articles/16376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何解决“Selected Collating Sequence Not Supported”问题</title><link>http://www.cppblog.com/MichaelLiu/articles/11959.html</link><dc:creator>奔跑的阿甘</dc:creator><author>奔跑的阿甘</author><pubDate>Sat, 02 Sep 2006 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/MichaelLiu/articles/11959.html</guid><wfw:comment>http://www.cppblog.com/MichaelLiu/comments/11959.html</wfw:comment><comments>http://www.cppblog.com/MichaelLiu/articles/11959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MichaelLiu/comments/commentRss/11959.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MichaelLiu/services/trackbacks/11959.html</trackback:ping><description><![CDATA[如何解决“Selected Collating Sequence Not Supported”问题<br />Michael 2006年9月2日<br /><br /><font size="2">在Microsoft Access 97中文版下创建的数据库，放在Windows XP英文版下，执行SELECT语句时出现标题所示的错误。<br />执行SELECT语句的客户程序是采用ADO访问数据库的。<br />为了解决这个问题，必须要首先了解数据库的一个属性，它叫“数据库排序次序”（Database Sorting Order）。在Microsoft Access的“工具”－&gt;“选项”－&gt;“常规”－&gt;“新建数据库排序次序”提供了该属性的设置，在英文版Access中为"Tools"-&gt;"Options"-&gt;"General"-&gt;"New Database Sort Order"。注意：必须要新建或者打开一个数据库才能够设置这个属性。<br /><br />那么这个"Collating Sequence"到底是个什么东西，为什么会出现"collating sequence not supported"错误呢？<br /><br />"Collating Sequence"实际上是个用于字符排序的序列，我们可以把它理解为一个表，给定一个字符，通过这个表可以查找到这个字符的序列号（范围从00－FF），继而通过这个序列号，我们可以比较两个字符在数据库中的前后顺序。所以，一个数字的排序总是比字母A-Z低，这在不同的"Collating Sequence"中可能为真也可能为假。当然，一个数字(x'30'-x'39')的代码值（Code Point）总是比字母A-Z(x'41'-x'5A')低，这是永远正确的。<br />关于"Collating Sequence"的概念可以参考以下链接：<br /><a href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/c0006812.htm">http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/c0006812.htm</a><br /><br />Microsoft Jet数据库引擎用到了四个Collating Sequence表，点击以下链接获得详细信息：<br /><a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;129719">http://support.microsoft.com/default.aspx?scid=kb;en-us;129719</a><br /><br />那么该如何解决这个问题呢？<br /><br />有两种方案：<br /><br />第一种：更新数据库<br />设置“新建数据库排序次序”属性为"General"，然后新建一个新的数据库，并导入老数据库的所有表。<br />该属性的默认值是当前操作系统的<strong>默认</strong>语言版本（注意不是操作系统的语言版本）。<br /><br />第二种：更新操作系统<br />既然操作系统不支持该数据库的Collating Sequence，就安装一个多语言支持，当然操作系统必须支持你创建数据库时使用的语言，比如OS需要支持中文字符集。<br />可以参考以下文章：<br /><a href="http://support.microsoft.com/default.aspx?scid=KB;en-us;q202150">http://support.microsoft.com/default.aspx?scid=KB;en-us;q202150</a><br /><br />[全文完]<br /></font><img src ="http://www.cppblog.com/MichaelLiu/aggbug/11959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MichaelLiu/" target="_blank">奔跑的阿甘</a> 2006-09-02 15:57 <a href="http://www.cppblog.com/MichaelLiu/articles/11959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC C运行时库的几个版本及用法</title><link>http://www.cppblog.com/MichaelLiu/articles/10607.html</link><dc:creator>奔跑的阿甘</dc:creator><author>奔跑的阿甘</author><pubDate>Thu, 27 Jul 2006 12:51:00 GMT</pubDate><guid>http://www.cppblog.com/MichaelLiu/articles/10607.html</guid><wfw:comment>http://www.cppblog.com/MichaelLiu/comments/10607.html</wfw:comment><comments>http://www.cppblog.com/MichaelLiu/articles/10607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MichaelLiu/comments/commentRss/10607.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MichaelLiu/services/trackbacks/10607.html</trackback:ping><description><![CDATA[
		<strong>VC C运行时库(CRTL)的几个版本及选用<br /></strong>
		<font size="2">Michael 2006年7月27日于突尼斯<br /><br />VC++ C运行时库（以下简称CRTL）是指LIBC.LIB/LIBCMT.LIB/MSVCRT.LIB以及他们对应的DEBUG版本（在名称后面加"D"）。<br />在VC++ 4.2以前的版本中CRTL包含了C++的iostream库函数，但是在4.2及以后的版本中（添加了对C++标准库的支持），iostream库函数被独立出来，为支持老的iostream和新的标准iostream函数，4.2及后续版本存在两套iostream库，分别是（老的）LIBCI.LIB/LIBCIMT.LIB/MSVCIRT.LIB和（新的）LIBCP.LIB/LIBCPMT.LIB/MSVCPRT.LIB。针对DEBUG版本，分别存在名称后加"D"的对应库。并且新老的iostream库是不兼容的，不能在同一个应用中混合使用。<br /><br /><strong>一 版本特性列表</strong><br />对CRTL的几个版本及特性列表(RELEASE&amp;DEBUG Version)如下：<br />RELEASE版本：<br /><table cols="4" cellpadding="5" rules="rows" border="1" frame="below"><tbody><tr valign="top"><td class="label" width="26%"><b>CRTL (without iostream)</b></td><td class="label" width="42%"><b>特性</b></td><td class="label" width="16%"><b>VC编译选项</b></td><td class="label" width="16%"><b>预编译宏</b></td></tr><tr valign="top"><td width="26%">LIBC.LIB</td><td width="42%">Single threaded, static link</td><td width="16%">/ML</td><td width="16%"></td></tr><tr valign="top"><td width="26%">LIBCMT.LIB</td><td width="42%">Multithreaded, static link</td><td width="16%">/MT</td><td width="16%">_MT</td></tr><tr valign="top"><td width="26%">MSVCRT.LIB</td><td width="42%">Multithreaded, dynamic link (import library for MSVCRT.DLL),对于不同的VC版本对应的DLL名称不一：<br />VC1.0-MSVCRT10.DLL<br />VC2.0-MSVCRT20.DLL<br />VC4.0-MSVCRT40.DLL<br />VC4.2-MSVCRT.DLL<br />VC5.0-MSVCRT.DLL<br />VC6.0-MSVCRT.DLL</td><td width="16%">/MD</td><td width="16%">_MT, _DLL</td></tr></tbody></table><br /><table cols="4" cellpadding="5" rules="rows" border="1" frame="below"><tbody><tr valign="top"><td class="label" width="26%"><b>Standard C++ Library</b></td><td class="label" width="41%"><b>Characteristics</b></td><td class="label" width="16%"><b>Option</b></td><td class="label" width="17%"><b>Defined</b></td></tr><tr valign="top"><td width="26%">LIBCP.LIB</td><td width="41%">Single threaded, static link</td><td width="16%">/ML</td><td width="17%"></td></tr><tr valign="top"><td width="26%">LIBCPMT.LIB</td><td width="41%">Multithreaded, static link</td><td width="16%">/MT</td><td width="17%">_MT</td></tr><tr valign="top"><td width="26%">MSVCPRT.LIB</td><td width="41%">Multithreaded, dynamic link (import library for MSVCRT.DLL),对于不同的VC版本对应的DLL名称不一：<br />VC4.2-MSVCPRT.DLL<br />VC5.0-MSVCP50.DLL<br />VC6.0-MSVCP60.DLL</td><td width="16%">/MD</td><td width="17%">_MT, _DLL</td></tr></tbody></table><br /><table cols="4" cellpadding="5" rules="rows" border="1" frame="below"><tbody><tr valign="top"><td class="label" width="26%"><b>Old Iostream Library</b></td><td class="label" width="41%"><b>Characteristics</b></td><td class="label" width="16%"><b>Option</b></td><td class="label" width="17%"><b>Defined</b></td></tr><tr valign="top"><td width="26%">LIBCI.LIB</td><td width="41%">Single threaded, static link</td><td width="16%">/ML</td><td width="17%"></td></tr><tr valign="top"><td width="26%">LIBCIMT.LIB</td><td width="41%">Multithreaded, static link</td><td width="16%">/MT</td><td width="17%">_MT</td></tr><tr valign="top"><td width="26%">MSVCIRT.LIB</td><td width="41%">Multithreaded, dynamic link (import library for MSVCIRT.DLL)</td><td width="16%">/MD</td><td width="17%">_MT, _DLL</td></tr></tbody></table><br />DEBUG版本：<br /><table cols="5" cellpadding="5" rules="rows" border="1" frame="below"><tbody><tr valign="top"><td class="label" width="31%"><b>CRTL(without iostream)</b></td><td class="label" width="40%"><b>Characteristics</b></td><td class="label" width="13%" colspan="2"><b>Option</b></td><td class="label" width="16%"><b>Defined</b></td></tr><tr valign="top"><td width="31%">LIBCD.LIB</td><td width="40%">Single-threaded, static link</td><td width="13%" colspan="2"><b>/MLd</b></td><td width="16%"><b>_DEBUG</b></td></tr><tr valign="top"><td width="31%">LIBCMTD.LIB</td><td width="40%">Multithreaded, static link</td><td width="13%" colspan="2"><b>/MTd</b></td><td width="16%"><b>_DEBUG</b>, <b>_MT</b></td></tr><tr valign="top"><td width="31%">MSVCRTD.LIB</td><td width="40%">Multithreaded, dynamic link <br />(import library for MSVCRxD.DLL)<sup>1</sup></td><td width="13%" colspan="2"><b>/MDd</b></td><td width="16%"><b>_DEBUG</b>, <b>_MT</b>, <b>_DLL</b></td></tr><tr valign="top"><td class="mini" width="81%" colspan="3"><sup>1   </sup>In place of the “x” in the DLL name, substitute the major version numeral of Visual C++ that you are using. For example, if you are using Visual C++ version 4, then the library name would be MSVCR40D.DLL.</td></tr></tbody></table><br /><table cols="4" cellpadding="5" rules="rows" border="1" frame="below"><tbody><tr valign="top"><td class="label" width="31%"><b>Standard C++ Debug Library</b></td><td class="label" width="39%"><b>Characteristics</b></td><td class="label" width="14%"><b>Option</b></td><td class="label" width="16%"><b>Defined</b></td></tr><tr valign="top"><td width="31%">LIBCPD.LIB</td><td width="39%">Single-threaded, static link</td><td width="14%"><b>/MLd</b></td><td width="16%"><b>_DEBUG</b></td></tr><tr valign="top"><td width="31%">LIBCPMTD.LIB</td><td width="39%">Multithreaded, static link</td><td width="14%"><b>/MTd</b></td><td width="16%"><b>_DEBUG</b>, <b>_MT</b></td></tr><tr valign="top"><td width="31%">MSVCPRTD.LIB</td><td width="39%">Multithreaded, dynamic link (import library for MSVCRTD.DLL),对于不同的VC版本对应的DLL名称不一：<br />VC4.2-MSVCPRTD.DLL<br />VC5.0-MSVCP50D.DLL<br />VC6.0-MSVCP60D.DLL</td><td width="14%"><b>/MDd</b></td><td width="16%"><b>_DEBUG</b>, <b>_MT</b>, <b>_DLL</b></td></tr></tbody></table><br /><table cols="4" cellpadding="5" rules="rows" border="1" frame="below"><tbody><tr valign="top"><td class="label" width="31%"><b>iostream Debug Library</b></td><td class="label" width="39%"><b>Characteristics</b></td><td class="label" width="14%"><b>Option</b></td><td class="label" width="16%"><b>Defined</b></td></tr><tr valign="top"><td width="31%">LIBCID.LIB</td><td width="39%">Single threaded, static link</td><td width="14%"><b>/MLd</b></td><td width="16%"><b>_DEBUG</b></td></tr><tr valign="top"><td width="31%">LIBCIMTD.LIB</td><td width="39%">Multithreaded, static link</td><td width="14%"><b>/MTd</b></td><td width="16%"><b>_DEBUG</b>, <b>_MT</b></td></tr><tr valign="top"><td width="31%">MSVCIRTD.LIB</td><td width="39%">Multithreaded, dynamic link (import library for MSVCIRTD.DLL)</td><td width="14%"><b>/MDd</b></td><td width="16%"><b>_DEBUG</b>, <b>_MT</b>, <b>_DLL</b></td></tr></tbody></table><br /><strong><br />二 单线程(Single threaded)和多线程(Multithreaded)的区别<br /></strong><br />简单地说，单线程版本提供的CRTL函数不是可重入(Re-entrant)的(只有少部分函数是可重入)，多线程版本提供的CRTL函数是可重入的。<br />对于多线程应用程序来说，如果使用单线程的CRTL将可能导致数据崩溃，因为在同一时间可能有多个线程同时访问CRTL函数中的某个静态数据，这个数据在单线程CRTL中不受保护（如果访问的是栈数据，则没有问题，因为栈的数据在每个独立线程中分配）。所以，此时需要使用多线程的CRTL，如果坚持使用单线程CRTL，应用程序必须亲自对数据共享访问进行保护处理，比如设立临界区。<br /><strong><br />三 静态链接(Static link)和动态链接(Dynamic link)的区别</strong></font>
		<br />
		<br />
		<font size="2">采用静态链接的应用程序发布后不依赖于CRTL，同时该库中的代码和数据在该应用程序调用的其他动态库中是访问不到的。<br />采用动态链接的应用程序必须依赖于CRTL（比如MSVCRT.DLL）。<br />对于动态链接CRTL的应用程序，在调用库函数时需要遵守两个原则：1）调用习惯为C(__cdecl)习惯；2）函数参数类型为值或者指针类型。<br /><br />【完】</font>
<img src ="http://www.cppblog.com/MichaelLiu/aggbug/10607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MichaelLiu/" target="_blank">奔跑的阿甘</a> 2006-07-27 20:51 <a href="http://www.cppblog.com/MichaelLiu/articles/10607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在MFC中使用OCX控件遇到的一个问题</title><link>http://www.cppblog.com/MichaelLiu/articles/5542.html</link><dc:creator>奔跑的阿甘</dc:creator><author>奔跑的阿甘</author><pubDate>Fri, 14 Apr 2006 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/MichaelLiu/articles/5542.html</guid><wfw:comment>http://www.cppblog.com/MichaelLiu/comments/5542.html</wfw:comment><comments>http://www.cppblog.com/MichaelLiu/articles/5542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MichaelLiu/comments/commentRss/5542.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MichaelLiu/services/trackbacks/5542.html</trackback:ping><description><![CDATA[
		<font face="Arial" size="2">在MFC中使用OCX控件遇到的一个问题<br /><b>[问题：]</b><br />在一个简单的MFC对话框中嵌入一个OCX控件（如浏览器控件），该控件采用动态方式创建，即调用CWnd::Create()接口生成窗口，在本机运行良好，但是在其它部分机器上运行则出现程序异常，报告occsite.cpp的第161行出现错误。当把源程序放到目标机器上重新编译后程序可以正常运行。以下是示例代码：<br />m_pFlashPlayer = NULL;  // 一个FLASH控件的对象指针<br />CRect rt;<br />GetClientRect(&amp;rt);  //获得区域大小<br />if (m_pFlashPlayer = new CShockwaveFlash) {  // CShockwaveFlash由FLASH控件添加到PROJECT后 VC自动生成<br /> if (m_pFlashPlayer-&gt;Create("PP", WS_VISIBLE , rt, this, 0)) {  //创建窗口<br />  m_pFlashPlayer-&gt;SetMovie(str);<br />  m_pFlashPlayer-&gt;Play();<br /> }<br />}<br />这个问题带来的后果是如果要发布该程序到100台机器上，则必须要在100台机器上重新编译一遍程序才能正确执行。<br /><b>[分析：]</b><br />经过测试，发现：<br />1）该问题只存在于程序DEBUG版本中，在RELEASE版本中不存在该问题。<br />2）该问题和MFC有关，和所嵌入的控件本身没有任何关系。<br />经过深入分析，发现：该问题是由于<b>开发机和目标机使用的MFCO42D.DLL库不匹配引起的</b>。<br /><b>[结果：]</b><br />经过确认，发现开发机和目标机的运行环境有如下差异：开发机未安装任何VS补丁，MFCO42D库的File Version为6.0.8168.0, Product Version为 6.0.000，而目标机安装了VS6.0 SP5，MFCO42D库的File Version为 6.0.8665.0, Product Version为 6.0.400。<br /><b>[解决：]</b><br />为确保各编码及维护人员使用的MFCO42D.DLL一致，对MFCO42D.LIB和MFCO42D.DLL进行了统一（把.lib和.dll拷贝到程序的当前路径）；同时将开发机上的MFCO42D.DLL和执行程序一起发布。<br /><b>[疑问：]</b><br />为何MFCO42D的高版本没有保持向下兼容？是否接口有变？</font>
<img src ="http://www.cppblog.com/MichaelLiu/aggbug/5542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MichaelLiu/" target="_blank">奔跑的阿甘</a> 2006-04-14 16:13 <a href="http://www.cppblog.com/MichaelLiu/articles/5542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>