﻿<?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++博客-fengyue-随笔分类-C/C++</title><link>http://www.cppblog.com/fengyue/category/16228.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 30 Nov 2011 14:21:17 GMT</lastBuildDate><pubDate>Wed, 30 Nov 2011 14:21:17 GMT</pubDate><ttl>60</ttl><item><title>如何动态加载ActiveX控件</title><link>http://www.cppblog.com/fengyue/archive/2011/11/30/161206.html</link><dc:creator>风悦</dc:creator><author>风悦</author><pubDate>Wed, 30 Nov 2011 00:51:00 GMT</pubDate><guid>http://www.cppblog.com/fengyue/archive/2011/11/30/161206.html</guid><wfw:comment>http://www.cppblog.com/fengyue/comments/161206.html</wfw:comment><comments>http://www.cppblog.com/fengyue/archive/2011/11/30/161206.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/fengyue/comments/commentRss/161206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fengyue/services/trackbacks/161206.html</trackback:ping><description><![CDATA[<p>我们的开发平台需要用第三方控件（ActiveX）时，一般采用的方法是，先在VC中的插入控件，VC会自动生成操作控件的类，然后创建一个控件，并处理对应的事件。如果控件接口变化，更新控件，需要重复操作且编译才能发布，比较麻烦。显然，动态加载ActiveX控件能解决这个问题。如果做过页面编程就会知道，页面脚本里边可以动态创建控件的。我们的开发平台是否也能动态创建控件呢，答案是肯定的。下面介绍一下如何动态加载ActiveX控件:<br />1.首先是获取到控件的GUID，可以通过配置。<br />2.获取控件的方法、事件等属性，方便后面的事件处理<br />3.采用CWnd::CreateControl创建控件实例，如果是通过脚本调用控件接口，可以将该控件添加到脚本引擎。<br />&nbsp;&nbsp; CreateControl原型如下：</p>
<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;BOOL&nbsp;CreateControl(&nbsp;REFCLSID&nbsp;clsid,&nbsp;LPCTSTR&nbsp;pszWindowName,&nbsp;DWORD&nbsp;dwStyle,<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;POINT</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;ppt,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;SIZE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;psize,&nbsp;CWnd</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pParentWnd,&nbsp;UINT&nbsp;nID,<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;CFile</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pPersist&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL,&nbsp;BOOL&nbsp;bStorage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;FALSE,&nbsp;BSTR&nbsp;bstrLicKey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL&nbsp;);<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>4.处理控件触发的事件<br />&nbsp;&nbsp; 重载父窗体的OnCmdMsg函数，处理对应的事件即可，OnCmdMsg原型如下：</p>
<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;BOOL&nbsp;OnCmdMsg(UINT&nbsp;nID,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nCode,&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pExtra,<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;AFX_CMDHANDLERINFO</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pHandlerInfo);<br /><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/fengyue/aggbug/161206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fengyue/" target="_blank">风悦</a> 2011-11-30 08:51 <a href="http://www.cppblog.com/fengyue/archive/2011/11/30/161206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CString不是线程安全的</title><link>http://www.cppblog.com/fengyue/archive/2011/11/24/160878.html</link><dc:creator>风悦</dc:creator><author>风悦</author><pubDate>Thu, 24 Nov 2011 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/fengyue/archive/2011/11/24/160878.html</guid><wfw:comment>http://www.cppblog.com/fengyue/comments/160878.html</wfw:comment><comments>http://www.cppblog.com/fengyue/archive/2011/11/24/160878.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/fengyue/comments/commentRss/160878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fengyue/services/trackbacks/160878.html</trackback:ping><description><![CDATA[我们用MFC开发时经常会用到CString类，无可否认，CString类是很好用，但很少人注意到CString类不是线程安全的。一般地，界面编程都是在主线程，很少用到多线程，所以不会遇到什么问题。但是，当我们多个线程同时操作同一个CString类型变量时，就可能会出现内存地址错误，最终导致进程异常退出。内存错误导致的问题也很难调查，通常导致内存错误的地方没有马上报异常，而且在程序的其他地方才捕获异常。<br />CString类的Debug版本和Release版本不完全一样，Debug版本则直接分配（MFC在Debug版本有内存管理，主要是为了排错，内存泄漏等），CString类在Release版本会使用定长内存管理（CFixedAlloc类），主要管理是4个长度的内存，如下： 
<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">AFX_STATIC&nbsp;CFixedAlloc&nbsp;_afxAlloc64(ROUND4(</span><span style="color: #000000">65</span><span style="color: #000000">*</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(TCHAR)</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CStringData)));<br /></span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />AFX_STATIC&nbsp;CFixedAlloc&nbsp;_afxAlloc128(ROUND4(</span><span style="color: #000000">129</span><span style="color: #000000">*</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(TCHAR)</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CStringData)));<br /></span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />AFX_STATIC&nbsp;CFixedAlloc&nbsp;_afxAlloc256(ROUND4(</span><span style="color: #000000">257</span><span style="color: #000000">*</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(TCHAR)</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CStringData)));<br /></span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />AFX_STATIC&nbsp;CFixedAlloc&nbsp;_afxAlloc512(ROUND4(</span><span style="color: #000000">513</span><span style="color: #000000">*</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(TCHAR)</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CStringData)));</span></div>这样做应该是防止内存碎片和提高效率，由于CString类都会重用分配的定长内存，所以一般异常的地方大多数也是在CString操作的地方。有兴趣可以看看CString类的实现。<br />避免这样的问题最简单的办法就是加锁或者不用CString类。加锁用临界区就可以，实现比较简单，在这里不多说。<br /><br /><img src ="http://www.cppblog.com/fengyue/aggbug/160878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fengyue/" target="_blank">风悦</a> 2011-11-24 10:58 <a href="http://www.cppblog.com/fengyue/archive/2011/11/24/160878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OGRE资源管理分析</title><link>http://www.cppblog.com/fengyue/archive/2011/11/23/160783.html</link><dc:creator>风悦</dc:creator><author>风悦</author><pubDate>Wed, 23 Nov 2011 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/fengyue/archive/2011/11/23/160783.html</guid><wfw:comment>http://www.cppblog.com/fengyue/comments/160783.html</wfw:comment><comments>http://www.cppblog.com/fengyue/archive/2011/11/23/160783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fengyue/comments/commentRss/160783.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fengyue/services/trackbacks/160783.html</trackback:ping><description><![CDATA[<div>OGRE的文件系统比较复杂，不熟悉的人不知道怎么使用，经常出现找不到资源的问题，在这里简单介绍一下资源路径的设置：<br />资源路径可以通过程序设置也可以通过配置方式:<br /><strong>配置方式<br /></strong>resources.cfg就是用来配置资源的路径的，内容如下：<br /># Resource locations to be added to the 'boostrap' path<br /># This also contains the minimum you need to use the Ogre example framework<br />[Bootstrap]<br />Zip=../../Media/packs/OgreCore.zip 
<p># Resource locations to be added to the default path<br />[General]<br />FileSystem=../../Media<br />FileSystem=../../Media/fonts<br />FileSystem=../../Media/materials/programs<br />FileSystem=../../Media/materials/scripts<br />FileSystem=../../Media/materials/textures<br />FileSystem=../../Media/models<br />FileSystem=../../Media/overlays<br />FileSystem=../../Media/particle<br />FileSystem=../../Media/gui<br />FileSystem=../../Media/DeferredShadingMedia<br />Zip=../../Media/packs/cubemap.zip<br />Zip=../../Media/packs/cubemapsJS.zip<br />Zip=../../Media/packs/dragon.zip<br />Zip=../../Media/packs/fresneldemo.zip<br />Zip=../../Media/packs/ogretestmap.zip<br />Zip=../../Media/packs/skybox.zip<br /><br />Bootstrap、General就是资源组名称，FileSystem、Zip就是文件系统类型，表示压缩包还是文件系统。一般我们开发时都是使用文件系统，所以配置对应的路径就可以。OGRE是支持Zip压缩包的，如果要实现自己的压缩包需要实现对应的Archive的子类，实现对应接口就可以。可以参考ZipArchive、ZipArchiveFactory、ZipDataStream实现。<br /><br /><strong>程序方式<br /></strong>其实配置方式最终也是调用程序来设置的，resources.cfg只是指定了ResourceGroupManager::getSingleton().addResourceLocation的参数。<br />看下面的函数就很清楚了，就是读取resources.cfg，将配置的路径都添加到资源管理，设置完资源组路径，调用ResourceGroupManager::getSingleton().initialiseAllResourceGroups()初始化就可以，后续就可以直接加载资源，很简单吧。</p>
<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setupResources(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_41_1293_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_1293_Open_Text.style.display='none'; Codehighlighter1_41_1293_Closed_Image.style.display='inline'; Codehighlighter1_41_1293_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_41_1293_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_1293_Closed_Text.style.display='none'; Codehighlighter1_41_1293_Open_Image.style.display='inline'; Codehighlighter1_41_1293_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_41_1293_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 alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_41_1293_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Load&nbsp;resource&nbsp;paths&nbsp;from&nbsp;config&nbsp;file</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigFile&nbsp;cf;<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cf.load(mResourcePath&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">resources.cfg</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Go&nbsp;through&nbsp;all&nbsp;sections&nbsp;&amp;&nbsp;settings&nbsp;in&nbsp;the&nbsp;file</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigFile::SectionIterator&nbsp;seci&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cf.getSectionIterator();<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;secName,&nbsp;typeName,&nbsp;archName;<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(seci.hasMoreElements())<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_383_1287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_383_1287_Open_Text.style.display='none'; Codehighlighter1_383_1287_Closed_Image.style.display='inline'; Codehighlighter1_383_1287_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_383_1287_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_383_1287_Closed_Text.style.display='none'; Codehighlighter1_383_1287_Open_Image.style.display='inline'; Codehighlighter1_383_1287_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_383_1287_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 alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_383_1287_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;seci.peekNextKey();<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigFile::SettingsMultiMap&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">settings&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;seci.getNext();<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigFile::SettingsMultiMap::iterator&nbsp;i;<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;settings</span><span style="color: #000000">-&gt;</span><span style="color: #000000">begin();&nbsp;i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;settings</span><span style="color: #000000">-&gt;</span><span style="color: #000000">end();&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">i)<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img id="Codehighlighter1_629_1277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_629_1277_Open_Text.style.display='none'; Codehighlighter1_629_1277_Closed_Image.style.display='inline'; Codehighlighter1_629_1277_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_629_1277_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_629_1277_Closed_Text.style.display='none'; Codehighlighter1_629_1277_Open_Image.style.display='inline'; Codehighlighter1_629_1277_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_629_1277_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 alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_629_1277_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">-&gt;</span><span style="color: #000000">first;<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;archName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">-&gt;</span><span style="color: #000000">second;<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;OGRE_PLATFORM&nbsp;==&nbsp;OGRE_PLATFORM_APPLE</span><span style="color: #000000"><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;OS&nbsp;X&nbsp;does&nbsp;not&nbsp;set&nbsp;the&nbsp;working&nbsp;directory&nbsp;relative&nbsp;to&nbsp;the&nbsp;app,<br /></span><span style="color: #008080">22</span><span style="color: #008000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;In&nbsp;order&nbsp;to&nbsp;make&nbsp;things&nbsp;portable&nbsp;on&nbsp;OS&nbsp;X&nbsp;we&nbsp;need&nbsp;to&nbsp;provide<br /></span><span style="color: #008080">23</span><span style="color: #008000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;the&nbsp;loading&nbsp;with&nbsp;it's&nbsp;own&nbsp;bundle&nbsp;path&nbsp;location</span><span style="color: #008000"><br /></span><span style="color: #008080">24</span><span style="color: #008000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResourceGroupManager::getSingleton().addResourceLocation(<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String(macBundlePath()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;archName),&nbsp;typeName,&nbsp;secName);<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">#else</span><span style="color: #000000"><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResourceGroupManager::getSingleton().addResourceLocation(<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;archName,&nbsp;typeName,&nbsp;secName);<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><img alt="" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />&nbsp;</p></div><img src ="http://www.cppblog.com/fengyue/aggbug/160783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fengyue/" target="_blank">风悦</a> 2011-11-23 11:07 <a href="http://www.cppblog.com/fengyue/archive/2011/11/23/160783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>受限用户下应用程序的开发</title><link>http://www.cppblog.com/fengyue/archive/2011/03/29/142956.html</link><dc:creator>风悦</dc:creator><author>风悦</author><pubDate>Tue, 29 Mar 2011 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/fengyue/archive/2011/03/29/142956.html</guid><wfw:comment>http://www.cppblog.com/fengyue/comments/142956.html</wfw:comment><comments>http://www.cppblog.com/fengyue/archive/2011/03/29/142956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fengyue/comments/commentRss/142956.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fengyue/services/trackbacks/142956.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 一般地，我们开发的应用程序都在管理员权限下运行，但如果在受限用户下却不能正常运行。一般都是权限不够，应用程序使用到的权限通常有：<br>&nbsp;&nbsp;&nbsp; 1.注册表权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKEY_LOCAL_MACHINE目录受限用户只有读取权限，没有修改权限。<br>&nbsp;&nbsp;&nbsp;&nbsp; 2.文件夹权限<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般将只读的程序文件放到C:\Program Files（不同操作系统不相同，可以通过环境变量获取）下面，用户数据或者配置文件放到当前用户目录或者所有用户目录（C:\Documents and Settings\All Users，不同操作系统目录不一样）。<br>&nbsp;&nbsp;&nbsp;&nbsp; 程序放到受限用户运行，最简单的方法就是给指定的注册表目录和文件目录授予权限。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>注册表权限设计：</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height=340 alt="" src="http://www.cppblog.com/images/cppblog_com/fengyue/reg.JPG" width=553 border=0></p>
<p align=left>&nbsp;&nbsp;&nbsp;&nbsp; <strong>文件目录权限设置：<span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Calibri; mso-bidi-font-size: 11.0pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-no-proof: yes"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><o:lock aspectratio="t" v:ext="edit"></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=448 alt="" src="http://www.cppblog.com/images/cppblog_com/fengyue/folder.JPG" width=369 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了避免权限问题，我们开发应用程序访问注册表最好根据需要设置权限，不要什么都用KEY_ALL_ACCESS，尽量不要使用注册表。避免文件权限问题，最好程序和数据分离。</o:lock></v:shapetype></span></strong>
<img src ="http://www.cppblog.com/fengyue/aggbug/142956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fengyue/" target="_blank">风悦</a> 2011-03-29 17:30 <a href="http://www.cppblog.com/fengyue/archive/2011/03/29/142956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>