﻿<?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++博客-Hello World！-文章分类-技术相关</title><link>http://www.cppblog.com/lizao2/category/18943.html</link><description>程序员那点事儿</description><language>zh-cn</language><lastBuildDate>Wed, 28 Mar 2012 19:44:40 GMT</lastBuildDate><pubDate>Wed, 28 Mar 2012 19:44:40 GMT</pubDate><ttl>60</ttl><item><title>BSTR</title><link>http://www.cppblog.com/lizao2/articles/169250.html</link><dc:creator>hello wold!</dc:creator><author>hello wold!</author><pubDate>Wed, 28 Mar 2012 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/lizao2/articles/169250.html</guid><wfw:comment>http://www.cppblog.com/lizao2/comments/169250.html</wfw:comment><comments>http://www.cppblog.com/lizao2/articles/169250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lizao2/comments/commentRss/169250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lizao2/services/trackbacks/169250.html</trackback:ping><description><![CDATA[<div class="turnBoxzz"><a name="1_1"></a><span></span>概述</div>
<div id="sina_keyword_ad_area2" class="articalContent  ">　　它被描述成一个与自动化相兼容的类型，由于<a href="http://baike.baidu.com/view/880.htm" target="_blank">操作系统</a>提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码。因此BSTR实际上就是一个COM字符串，但它却在自动化技术以外的多种场合下得到广泛使用。 
<div>
<h3><a name="2_1"></a><span>为什么需要BSTR</span></h3>　　COM是一种跨编程语言的平台，需要提供语言无关的数据类型。多数编程语言有自己的字符串表示。 
<div></div>　　&#9679;C++ 字符串是以0结束的ASCII或Unicode字符数组。 
<div></div>　　&#9679;Visual Basic字符串是一个ASCII字符数组加上表示长度的前缀。 
<div></div>　　&#9679;Java字符串是以0结束的Unicode字符数组。 
<div></div>　　需要定义一种通用的字符串类型，可以很容易的匹配到不同编程语言。<strong>在</strong><strong>C++</strong><strong>中，就是</strong><strong>BSTR</strong>。 
<h3><a name="2_2"></a><span>什么是BSTR</span></h3>　　BSTR是&#8220;Basic STRing&#8221;的简称，<a href="http://baike.baidu.com/view/2353.htm" target="_blank">微软</a>在COM/OLE中定义的标准字符串数据类型。 
<div></div>　　对于C++，Windows头文件wtypes.h中定义如下： 
<div></div>　　typedef <a href="http://baike.baidu.com/view/2063825.htm" target="_blank">wchar_t</a> WCHAR; 
<div></div>　　typedef WCHAR OLECHAR; 
<div></div>　　typedef OLECHAR __RPC_FAR *BSTR;; 
<div></div>　　使用以Null结尾的简单字符串在COM component间传递不太方便。因此，<strong>标准BSTR是一个有长度前缀和null结束符的OLECHAR数组。</strong>BSTR的前4字节是一个表示字符串长度的前缀。BSTR长度域的值是字符串的字节数，并且不包括0结束符。 
<div></div>　　由于是Unicode串，所以字符数是字节数的一半。这种方式的优点是允许程序员在BSTR串中间嵌入NULL字符。但是，BSTR的前四个字节表示长度，而OLECHAR数组的前四字节表示前两个字符。这种情况下，对于C++程序，如何实现BSTR和OLECHAR的交换？答案是COM提供了两个BSTR分配用的API：SysAllocString / SysReallocString。函数返回的指针指向BSTR的第一个字符，而不是BSTR在内存的第一个字节。 
<h3><a name="2_3"></a><span>什么时候使用BSTR</span></h3>　　<strong>只有在你不得不用的时候。</strong> 
<div></div>　　<strong>使用BSTR一般有以下几种情况：</strong> 
<div></div>　　&#9679;COM interface接口定义，并且不希望额外提供custom marshaling库（MDIL生成或开发人员自己订制），必须使用BSTR传递字符串。使用C/C++类型的字符串在COM DLL传递字符串，表面上可以使用，但违背了COM的基本规则，并且给以后的扩展留下了隐患。例如，把一个In-process COM Object(简单说COM DLL)改成out-of-process object（COM EXE）。理论上，<a href="http://baike.baidu.com/view/930.htm" target="_blank">客户端</a>的代码应该不做任何改变。但如果是用了C/C++字符串，又希望只使用系统的automation mashaller（Oleaut32.dll），就会出错。 
<div></div>　　&#9679;如果可以提供custom marshaling，也推荐使用BSTR。 
<div></div>　　&#9679;客户要求接口必须使用BSTR，和客户讨论后，不能修改。 
<div></div>　　&#9679;使用的外部库的接口使用BSTR 
<div></div>　　<strong>不使用的情况：</strong> 
<div></div>　　&#9679;<strong>不推荐在IDL结构体中定义BSTR成员</strong>，会给结构体的复制和释放带来麻烦。最好直接使用限定最大长度的TCHAR数组。如果确实需要传递变长字符串，BSTR应该被定义成独立的参数或者使用独立的get/set接口。 
<div></div>　　&#9679;<strong>尽可能缩小的BSTR及相关类型的作用域范围</strong>。类的成员变量和函数参数不使用BSTR。<a href="http://baike.baidu.com/view/552847.htm" target="_blank">局部变量</a>要尽快释放类的内部不使用BSTR。代码处理逻辑中只在接口直接相关部分使用BSTR。接收到一个BSTR时，尽量立刻变成C/C++的字符串副本进行处理。在需要传递BSTR参数前产生BSTR，用过立即释放。</div>
<div>
<div><br /></div>
<div><strong>BSTR、char*和CString转换&nbsp;<wbr></strong></div>
<div>　　(1) char*转换成CString</div>
<div><br /></div>
<div>　　若将char*转换成CString，除了直接赋值外，还可使用CString::Format进行。例如：</div>
<div><br /></div>
<div>char chArray[] = "This is a test";&nbsp;<wbr></div>
<div>char * p = "This is a test";&nbsp;<wbr></div>
<div><br /></div>
<div>　　或</div>
<div><br /></div>
<div>LPSTR p = "This is a test";&nbsp;<wbr></div>
<div><br /></div>
<div>　　或在已定义Unicode应的用程序中</div>
<div><br /></div>
<div>TCHAR * p = _T("This is a test");&nbsp;<wbr></div>
<div><br /></div>
<div>　　或</div>
<div><br /></div>
<div>LPTSTR p = _T("This is a test");&nbsp;<wbr></div>
<div>CString theString = chArray;&nbsp;<wbr></div>
<div>theString.Format(_T("%s"), chArray);&nbsp;<wbr></div>
<div>theString = p;&nbsp;<wbr></div>
<div><br /></div>
<div>　　(2) CString转换成char*</div>
<div><br /></div>
<div>　　若将CString类转换成char*(LPSTR)类型，常常使用下列三种方法：</div>
<div><br /></div>
<div>　　方法一，使用强制转换。例如：</div>
<div><br /></div>
<div>CString theString( "This is a test" );&nbsp;<wbr></div>
<div>LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; &nbsp;<wbr></div>
<div><br /></div>
<div>　　方法二，使用strcpy。例如：</div>
<div><br /></div>
<div>CString theString( "This is a test" );&nbsp;<wbr></div>
<div>LPTSTR lpsz = new TCHAR[theString.GetLength()+1];&nbsp;<wbr></div>
<div>_tcscpy(lpsz, theString);&nbsp;<wbr></div>
<div><br /></div>
<div>　　需要说明的是，strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI)，系统编译器将会自动对其进行转换。</div>
<div><br /></div>
<div>　　方法三，使用CString::GetBuffer。例如：</div>
<div><br /></div>
<div>CString s(_T("This is a test "));&nbsp;<wbr></div>
<div>LPTSTR p = s.GetBuffer();&nbsp;<wbr></div>
<div>// 在这里添加使用p的代码&nbsp;<wbr></div>
<div>if(p != NULL) *p = _T('\0');&nbsp;<wbr></div>
<div>s.ReleaseBuffer();&nbsp;<wbr></div>
<div>// 使用完后及时释放，以便能使用其它的CString成员函数&nbsp;<wbr></div>
<div><br /></div>
<div>　　(3) BSTR转换成char*</div>
<div><br /></div>
<div>　　方法一，使用ConvertBSTRToString。例如：</div>
<div><br /></div>
<div>#include&nbsp;<wbr></div>
<div>#pragma comment(lib, "comsupp.lib")&nbsp;<wbr></div>
<div>int _tmain(int argc, _TCHAR* argv[]){&nbsp;<wbr></div>
<div>BSTR bstrText = ::SysAllocString(L"Test");&nbsp;<wbr></div>
<div>char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);&nbsp;<wbr></div>
<div>SysFreeString(bstrText); // 用完释放&nbsp;<wbr></div>
<div>delete[] lpszText2;&nbsp;<wbr></div>
<div>return 0;&nbsp;<wbr></div>
<div>} &nbsp;<wbr></div>
<div><br /></div>
<div>　　方法二，使用_bstr_t的赋值运算符重载。例如：</div>
<div><br /></div>
<div>_bstr_t b = bstrText;&nbsp;<wbr></div>
<div>char* lpszText2 = b;&nbsp;<wbr></div>
<div><br /></div>
<div>　　(4) char*转换成BSTR</div>
<div><br /></div>
<div>　　方法一，使用SysAllocString等API函数。例如：</div>
<div><br /></div>
<div>BSTR bstrText = ::SysAllocString(L"Test");&nbsp;<wbr></div>
<div>BSTR bstrText = ::SysAllocStringLen(L"Test",4);&nbsp;<wbr></div>
<div>BSTR bstrText = ::SysAllocStringByteLen("Test",4);&nbsp;<wbr></div>
<div><br /></div>
<div>　　方法二，使用COleVariant或_variant_t。例如：</div>
<div><br /></div>
<div>//COleVariant strVar("This is a test");&nbsp;<wbr></div>
<div>_variant_t strVar("This is a test");&nbsp;<wbr></div>
<div>BSTR bstrText = strVar.bstrVal;&nbsp;<wbr></div>
<div><br /></div>
<div>　　方法三，使用_bstr_t，这是一种最简单的方法。例如：</div>
<div><br /></div>
<div>BSTR bstrText = _bstr_t("This is a test");&nbsp;<wbr></div>
<div><br /></div>
<div>　　方法四，使用CComBSTR。例如：</div>
<div><br /></div>
<div>BSTR bstrText = CComBSTR("This is a test");&nbsp;<wbr></div>
<div><br /></div>
<div>　　或</div>
<div><br /></div>
<div>CComBSTR bstr("This is a test");&nbsp;<wbr></div>
<div>BSTR bstrText = bstr.m_str;&nbsp;<wbr></div>
<div><br /></div>
<div>　　方法五，使用ConvertStringToBSTR。例如：</div>
<div><br /></div>
<div>char* lpszText = "Test";&nbsp;<wbr></div>
<div>BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);&nbsp;<wbr></div>
<div><br /></div>
<div>　　(5) CString转换成BSTR</div>
<div><br /></div>
<div>　　通常是通过使用CStringT::AllocSysString来实现。例如：</div>
<div><br /></div>
<div>CString str("This is a test");&nbsp;<wbr></div>
<div>BSTR bstrText = str.AllocSysString();&nbsp;<wbr></div>
<div>&#8230;&nbsp;<wbr></div>
<div>SysFreeString(bstrText); // 用完释放 &nbsp;<wbr></div>
<div><br /></div>
<div>　　(6) BSTR转换成CString</div>
<div><br /></div>
<div>　　一般可按下列方法进行：</div>
<div><br /></div>
<div>BSTR bstrText = ::SysAllocString(L"Test");&nbsp;<wbr></div>
<div>CStringA str;&nbsp;<wbr></div>
<div>str.Empty();&nbsp;<wbr></div>
<div>str = bstrText; &nbsp;<wbr></div>
<div><br /></div>
<div>　　或</div>
<div><br /></div>
<div>CStringA str(bstrText);&nbsp;<wbr></div>
<div><br /></div>
<div>　　(7) ANSI、Unicode和宽字符之间的转换</div>
<div><br /></div>
<div>　　方法一，使用MultiByteToWideChar将ANSI字符转换成Unicode字符，使用WideCharToMultiByte将Unicode字符转换成ANSI字符。</div>
<div><br /></div>
<div>　　方法二，使用&#8220;_T&#8221;将ANSI转换成&#8220;一般&#8221;类型字符串，使用&#8220;L&#8221;将ANSI转换成Unicode，而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如：</div>
<div><br /></div>
<div>TCHAR tstr[] = _T("this is a test");&nbsp;<wbr></div>
<div>wchar_t wszStr[] = L"This is a test";&nbsp;<wbr></div>
<div>String* str = S&#8221;This is a test&#8221;;&nbsp;<wbr></div>
<div><br /></div>
<div>　　方法三，使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类，它具有如图3所示的统一形式：</div>
<div><br /></div>
<div>　　其中，第一个C表示&#8220;类&#8221;，以便于ATL 3.0宏相区别，第二个C表示常量，2表示&#8220;to&#8221;，EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、T、W和OLE，其含义分别是ANSI、Unicode、&#8220;一般&#8221;类型和OLE字符串。例如，CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码：</div>
<div><br /></div>
<div>LPTSTR tstr= CA2TEX&lt;16&gt;("this is a test");&nbsp;<wbr></div>
<div>LPCTSTR tcstr= CA2CT("this is a test");&nbsp;<wbr></div>
<div>wchar_t wszStr[] = L"This is a test";&nbsp;<wbr></div>
<div>char* chstr = CW2A(wszStr); &nbsp;<wbr></div>
<div><br /></div>
<div>　　六、结语</div>
<div><br /></div>
<div>　　几乎所有的程序都要用到字符串，而Visual C++.NET由于功能强大、应用广泛，因而字符串之间的转换更为频繁。本文几乎涉及到目前的所有转换方法。当然对于.NET框架来说，还可使用Convert和Text类进行不同数据类型以及字符编码之间的相互转换。</div>
<div>&nbsp;</div></div></div><img src ="http://www.cppblog.com/lizao2/aggbug/169250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lizao2/" target="_blank">hello wold!</a> 2012-03-28 10:52 <a href="http://www.cppblog.com/lizao2/articles/169250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC 教程MFC 教程 MFC 教程 </title><link>http://www.cppblog.com/lizao2/articles/169142.html</link><dc:creator>hello wold!</dc:creator><author>hello wold!</author><pubDate>Tue, 27 Mar 2012 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/lizao2/articles/169142.html</guid><wfw:comment>http://www.cppblog.com/lizao2/comments/169142.html</wfw:comment><comments>http://www.cppblog.com/lizao2/articles/169142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lizao2/comments/commentRss/169142.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lizao2/services/trackbacks/169142.html</trackback:ping><description><![CDATA[<font face="Simsun" size="3"><span style="line-height: normal; "><br />
</span></font>
<table cellspacing="0" cellpadding="10" width="500" align="left" border="0" style="font-family: Simsun; ">
     <tbody>
         <tr bgcolor="#e6e6e6">
             <td width="746">
             <p><font size="2"><strong>作者序<font size="3"><br />
             -----------&nbsp;</font></strong><br />
             我曾写一本关于MFC的书，分析了MFC的结构和设计(《MFC深入浅出》)，华中理工大学出版。书的内容建立在对MSDN和MFC SOURCE CODE的大量分析上，该书对于希望学习MFC的人来说，是较有价值的。可惜出版社好象只在几个城市针对学生作销售，虽然学生反应不错，但是外界知道不多。</font></p>
             </td>
         </tr>
         <tr bgcolor="#939393">
             <td align="left" width="746"><font color="white" size="2">名称</font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc1.php" target="_self">1_MFC概述</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc2.php" target="_self">2_MFC和Win32</a></font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc3.php" target="_self">3_CObject类</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc4.php" target="_self">4_消息映射的实现</a></font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc5.php" target="_self">5_MFC对象的创建</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc6.php" target="_self">6_应用程序的退出</a></font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc7.php" target="_self">7_MFC的DLL</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc8.php" target="_self">8_MFC的进程和线程</a></font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc9.php" target="_self">9_MFC的状态</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc10.php" target="_self">10_内存分配方式和调试机制</a></font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc11.php" target="_self">11_MFC下的文件类</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc12.php" target="_self">12_对话框和对话框类CDialog</a></font></td>
         </tr>
         <tr bgcolor="#e6e6e6">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc13.php" target="_self">13_MFC工具条和状态栏</a></font></td>
         </tr>
         <tr bgcolor="#f4f4f4">
             <td width="746" height="35"><font size="2"><a href="http://www.vczx.com/tutorial/mfc/mfc14.php" target="_self">14_SOCKET类的设计和实现</a></font></td>
         </tr>
     </tbody>
</table>
<br class="Apple-interchange-newline" />
<font face="Simsun" size="3"><span style="line-height: normal;"><br />
</span></font>来源&nbsp;<a href="http://www.vczx.com/tutorial/mfc/mfc.php">http://www.vczx.com/tutorial/mfc/mfc.php</a>&nbsp;&nbsp;
<img src ="http://www.cppblog.com/lizao2/aggbug/169142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lizao2/" target="_blank">hello wold!</a> 2012-03-27 13:52 <a href="http://www.cppblog.com/lizao2/articles/169142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vs2008 ActiveX控件测试容器的生成以及调试ActiveX控件</title><link>http://www.cppblog.com/lizao2/articles/169117.html</link><dc:creator>hello wold!</dc:creator><author>hello wold!</author><pubDate>Tue, 27 Mar 2012 03:36:00 GMT</pubDate><guid>http://www.cppblog.com/lizao2/articles/169117.html</guid><wfw:comment>http://www.cppblog.com/lizao2/comments/169117.html</wfw:comment><comments>http://www.cppblog.com/lizao2/articles/169117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lizao2/comments/commentRss/169117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lizao2/services/trackbacks/169117.html</trackback:ping><description><![CDATA[vs2008 ActiveX控件测试容器的生成以及调试ActiveX控件
分类：ActiveXVS20082011-04-28 17:10277人阅读评论(0)收藏举报
1、ActiveX控件测试容器的生成：用TSTCON生成测试容器
http://msdn.microsoft.com/zh-cn/library/f9adb5t5(v=vs.90).aspx
在搜索里搜索tstcon,双击TstCon文件夹，将此文件夹里的东西全部复制到另外一个新的空文件里，然后打开解决方案 tstcon.sln，记住要把平台选为win32,然后Build即可。在生成的Debug或Release文件夹中找到TstCon32.exe，双击即可ActiveX Control Test Container，然后在里面进行相应的操作就行了。
2、调试ActiveX控件:
http://technet.microsoft.com/zh-cn/office/w54zfak1.aspx
按照以上网页中的步骤配置完后，设置断点，按F5，会打开ActiveX Control Test Container，在Edit菜单里选择Insert New Control...就可以进行调试了。<img src ="http://www.cppblog.com/lizao2/aggbug/169117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lizao2/" target="_blank">hello wold!</a> 2012-03-27 11:36 <a href="http://www.cppblog.com/lizao2/articles/169117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2008 在IE中 调试 ActiveX控件 </title><link>http://www.cppblog.com/lizao2/articles/169095.html</link><dc:creator>hello wold!</dc:creator><author>hello wold!</author><pubDate>Tue, 27 Mar 2012 00:29:00 GMT</pubDate><guid>http://www.cppblog.com/lizao2/articles/169095.html</guid><wfw:comment>http://www.cppblog.com/lizao2/comments/169095.html</wfw:comment><comments>http://www.cppblog.com/lizao2/articles/169095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lizao2/comments/commentRss/169095.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lizao2/services/trackbacks/169095.html</trackback:ping><description><![CDATA[<h3><span class="link_title"><a href="http://blog.csdn.net/mythma/article/details/2857664">VS2008 在IE中 调试 ActiveX控件 </a></span></h3>
<div class="article_manage"><span class="link_categories">分类： <a href="http://blog.csdn.net/mythma/article/category/148404">C++/VC Tech</a> </span><span class="link_postdate">2008-08-31 23:12</span> <span class="link_view" title="阅读次数">4035人阅读</span> <span class="link_comments" title="评论次数"><a href="http://blog.csdn.net/mythma/article/details/2857664#comments">评论</a>(0)</span> <span class="link_collect"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report"><a title="举报" href="http://blog.csdn.net/mythma/article/details/2857664#report">举报</a></span> </div>
<div id="article_content" class="article_content">
<p>不知道是不是微软的粗心大意，VS2008中竟然没有ActiveX控件测试容器。</p>
<p>幸好需要在IE中测试控件，就不需要那个测试容器啦。</p>
<p>&nbsp;</p>
<p>1. 生产测试控件的HTML：</p>
<p>&lt;HTML&gt;<br />&lt;HEAD&gt;<br />&lt;TITLE&gt;Test&lt;/TITLE&gt;<br />&lt;/HEAD&gt;<br />&lt;BODY&gt;</p>
<p>&lt;OBJECT ID="MyActiveX" WIDTH=800 HEIGHT=600<br />&nbsp;CLASSID="CLSID:5228A02F-8FBD-424C-B457-EEBD4E748504"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;PARAM NAME="_Version" VALUE="65536"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;PARAM NAME="_ExtentX" VALUE="4657"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;PARAM NAME="_ExtentY" VALUE="4075"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;PARAM NAME="_StockProps" VALUE="0"&gt;<br />&lt;/OBJECT&gt;</p>
<p>&lt;/BODY&gt;<br />&lt;/HTML&gt;</p>
<p>&nbsp;</p>
<p>2. 设置debug选项</p>
<p>command: C:/Program Files/Internet Explorer/iexplore.exe</p>
<p>command arguments: F:/test.htm</p>
<p>&nbsp;</p>
<p>3. 全路径</p>
<p>注册ocx时，需要使用全路径。 否则就有错误：The sepcified module could not be found.</p>
<p>&nbsp;</p>
<p>4. 在Vista下的问题</p>
<p>由于UAC的控制，需要用"Run as Admin"的方式运行</p>
<p>否则就有&#8220;1&gt;Project : error PRJ0050: Failed to register output.&#8221;错误。</p></div> <img src ="http://www.cppblog.com/lizao2/aggbug/169095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lizao2/" target="_blank">hello wold!</a> 2012-03-27 08:29 <a href="http://www.cppblog.com/lizao2/articles/169095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>libjson编译好之后需要设置jsonoptions选项</title><link>http://www.cppblog.com/lizao2/articles/168986.html</link><dc:creator>hello wold!</dc:creator><author>hello wold!</author><pubDate>Mon, 26 Mar 2012 03:42:00 GMT</pubDate><guid>http://www.cppblog.com/lizao2/articles/168986.html</guid><wfw:comment>http://www.cppblog.com/lizao2/comments/168986.html</wfw:comment><comments>http://www.cppblog.com/lizao2/articles/168986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lizao2/comments/commentRss/168986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lizao2/services/trackbacks/168986.html</trackback:ping><description><![CDATA[用libjson的时候，怎么也找不到parse方法，后来一查才知道，需要设置选项，把jsonOptions.h粘上来<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#ifndef&nbsp;JSON_OPTIONS_H<br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_OPTIONS_H<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />&nbsp;*&nbsp;&nbsp;This&nbsp;file&nbsp;holds&nbsp;all&nbsp;of&nbsp;the&nbsp;compiling&nbsp;options&nbsp;for&nbsp;easy&nbsp;access&nbsp;and&nbsp;so<br />&nbsp;*&nbsp;&nbsp;that&nbsp;you&nbsp;don't&nbsp;have&nbsp;to&nbsp;remember&nbsp;them,&nbsp;or&nbsp;look&nbsp;them&nbsp;up&nbsp;all&nbsp;the&nbsp;time<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_LIBRARY&nbsp;must&nbsp;be&nbsp;declared&nbsp;if&nbsp;libjson&nbsp;is&nbsp;compiled&nbsp;as&nbsp;a&nbsp;static&nbsp;or&nbsp;dynamic&nbsp;<br />&nbsp;*&nbsp;&nbsp;library.&nbsp;&nbsp;This&nbsp;exposes&nbsp;a&nbsp;C-style&nbsp;interface,&nbsp;but&nbsp;none&nbsp;of&nbsp;the&nbsp;inner&nbsp;workings&nbsp;of&nbsp;libjson<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_LIBRARY</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_STRICT&nbsp;removes&nbsp;all&nbsp;of&nbsp;libjson's&nbsp;extensions.&nbsp;&nbsp;Meaning&nbsp;no&nbsp;comments,&nbsp;no&nbsp;special&nbsp;numbers<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_STRICT</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_DEBUG&nbsp;is&nbsp;used&nbsp;to&nbsp;perform&nbsp;extra&nbsp;error&nbsp;checking.&nbsp;&nbsp;Because&nbsp;libjson&nbsp;usually&nbsp;<br />&nbsp;*&nbsp;&nbsp;does&nbsp;on&nbsp;the&nbsp;fly&nbsp;parsing,&nbsp;validation&nbsp;is&nbsp;impossible,&nbsp;so&nbsp;this&nbsp;option&nbsp;will&nbsp;allow<br />&nbsp;*&nbsp;&nbsp;you&nbsp;to&nbsp;register&nbsp;an&nbsp;error&nbsp;callback&nbsp;so&nbsp;that&nbsp;you&nbsp;can&nbsp;record&nbsp;what&nbsp;is&nbsp;going&nbsp;wrong&nbsp;<br />&nbsp;*&nbsp;&nbsp;before&nbsp;the&nbsp;library&nbsp;crashes.&nbsp;&nbsp;This&nbsp;option&nbsp;does&nbsp;not&nbsp;protect&nbsp;from&nbsp;these&nbsp;errors,<br />&nbsp;*&nbsp;&nbsp;it&nbsp;simply&nbsp;tells&nbsp;you&nbsp;about&nbsp;them,&nbsp;which&nbsp;is&nbsp;nice&nbsp;for&nbsp;debugging,&nbsp;but&nbsp;not&nbsp;preferable<br />&nbsp;*&nbsp;&nbsp;for&nbsp;release&nbsp;candidates<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_DEBUG<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_ISO_STRICT&nbsp;turns&nbsp;off&nbsp;all&nbsp;code&nbsp;that&nbsp;uses&nbsp;non-standard&nbsp;C++.&nbsp;&nbsp;This&nbsp;removes&nbsp;all<br />&nbsp;*&nbsp;&nbsp;references&nbsp;to&nbsp;long&nbsp;long&nbsp;and&nbsp;long&nbsp;double&nbsp;as&nbsp;well&nbsp;as&nbsp;a&nbsp;few&nbsp;others<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_ISO_STRICT</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_SAFE&nbsp;performs&nbsp;similarly&nbsp;to&nbsp;JSON_DEBUG,&nbsp;except&nbsp;this&nbsp;option&nbsp;does&nbsp;protect<br />&nbsp;*&nbsp;&nbsp;from&nbsp;the&nbsp;errors&nbsp;that&nbsp;it&nbsp;encounters.&nbsp;&nbsp;This&nbsp;option&nbsp;is&nbsp;recommended&nbsp;for&nbsp;those&nbsp;who<br />&nbsp;*&nbsp;&nbsp;feel&nbsp;it's&nbsp;possible&nbsp;for&nbsp;their&nbsp;program&nbsp;to&nbsp;encounter&nbsp;invalid&nbsp;json.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_SAFE<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_STDERROR&nbsp;routes&nbsp;error&nbsp;messages&nbsp;to&nbsp;cerr&nbsp;instead&nbsp;of&nbsp;a&nbsp;callback,&nbsp;this&nbsp;<br />&nbsp;*&nbsp;&nbsp;option&nbsp;hides&nbsp;the&nbsp;callback&nbsp;registering&nbsp;function.&nbsp;&nbsp;This&nbsp;will&nbsp;usually&nbsp;display<br />&nbsp;*&nbsp;&nbsp;messages&nbsp;in&nbsp;the&nbsp;console<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_STDERROR</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_PREPARSE&nbsp;causes&nbsp;all&nbsp;parsing&nbsp;to&nbsp;be&nbsp;done&nbsp;immediately.&nbsp;&nbsp;By&nbsp;default,&nbsp;libjson<br />&nbsp;*&nbsp;&nbsp;parses&nbsp;nodes&nbsp;on&nbsp;the&nbsp;fly&nbsp;as&nbsp;they&nbsp;are&nbsp;needed,&nbsp;this&nbsp;makes&nbsp;parsing&nbsp;much&nbsp;faster&nbsp;if<br />&nbsp;*&nbsp;&nbsp;your&nbsp;program&nbsp;gets&nbsp;a&nbsp;lot&nbsp;of&nbsp;information&nbsp;that&nbsp;it&nbsp;doesn't&nbsp;need.&nbsp;&nbsp;An&nbsp;example&nbsp;of<br />&nbsp;*&nbsp;&nbsp;this&nbsp;would&nbsp;be&nbsp;a&nbsp;client&nbsp;application&nbsp;communicating&nbsp;with&nbsp;a&nbsp;server&nbsp;if&nbsp;the&nbsp;server<br />&nbsp;*&nbsp;&nbsp;returns&nbsp;things&nbsp;like&nbsp;last&nbsp;modified&nbsp;date&nbsp;and&nbsp;other&nbsp;things&nbsp;that&nbsp;you&nbsp;don't&nbsp;use.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_PREPARSE</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_LESS_MEMORY&nbsp;will&nbsp;force&nbsp;libjson&nbsp;to&nbsp;let&nbsp;go&nbsp;of&nbsp;memory&nbsp;as&nbsp;quickly&nbsp;as&nbsp;it&nbsp;can<br />&nbsp;*&nbsp;&nbsp;this&nbsp;is&nbsp;recommended&nbsp;for&nbsp;software&nbsp;that&nbsp;has&nbsp;to&nbsp;run&nbsp;on&nbsp;less&nbsp;than&nbsp;optimal&nbsp;machines.<br />&nbsp;*&nbsp;&nbsp;It&nbsp;will&nbsp;cut&nbsp;libjson's&nbsp;memory&nbsp;usage&nbsp;by&nbsp;about&nbsp;20%,&nbsp;but&nbsp;also&nbsp;run&nbsp;slightly&nbsp;slower.<br />&nbsp;*&nbsp;&nbsp;It's&nbsp;recommended&nbsp;that&nbsp;you&nbsp;also&nbsp;compile&nbsp;using&nbsp;the&nbsp;-Os&nbsp;option,&nbsp;as&nbsp;this&nbsp;will&nbsp;also<br />&nbsp;*&nbsp;&nbsp;reduce&nbsp;the&nbsp;size&nbsp;of&nbsp;the&nbsp;library<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_LESS_MEMORY</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_UNICODE&nbsp;tells&nbsp;libjson&nbsp;to&nbsp;use&nbsp;wstrings&nbsp;instead&nbsp;of&nbsp;regular&nbsp;strings,&nbsp;this<br />&nbsp;*&nbsp;&nbsp;means&nbsp;that&nbsp;libjson&nbsp;supports&nbsp;the&nbsp;full&nbsp;array&nbsp;of&nbsp;unicode&nbsp;characters,&nbsp;but&nbsp;also&nbsp;takes<br />&nbsp;*&nbsp;&nbsp;much&nbsp;more&nbsp;memory&nbsp;and&nbsp;processing&nbsp;power.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_UNICODE</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_REF_COUNT&nbsp;causes&nbsp;libjson&nbsp;to&nbsp;reference&nbsp;count&nbsp;JSONNodes,&nbsp;which&nbsp;makes&nbsp;copying<br />&nbsp;*&nbsp;&nbsp;and&nbsp;passing&nbsp;them&nbsp;around&nbsp;much&nbsp;faster.&nbsp;&nbsp;It&nbsp;is&nbsp;recommended&nbsp;that&nbsp;this&nbsp;stay&nbsp;on&nbsp;for<br />&nbsp;*&nbsp;&nbsp;most&nbsp;uses<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_REF_COUNT<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_BINARY&nbsp;is&nbsp;used&nbsp;to&nbsp;support&nbsp;binary,&nbsp;which&nbsp;is&nbsp;base64&nbsp;encoded&nbsp;and&nbsp;decoded&nbsp;by&nbsp;libjson,<br />&nbsp;*&nbsp;&nbsp;if&nbsp;this&nbsp;option&nbsp;is&nbsp;not&nbsp;turned&nbsp;on,&nbsp;no&nbsp;base64&nbsp;support&nbsp;is&nbsp;included<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_BINARY</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_EXPOSE_BASE64&nbsp;is&nbsp;used&nbsp;to&nbsp;turn&nbsp;on&nbsp;the&nbsp;functionality&nbsp;of&nbsp;libjson's&nbsp;base64&nbsp;encoding<br />&nbsp;*&nbsp;&nbsp;and&nbsp;decoding.&nbsp;&nbsp;This&nbsp;may&nbsp;be&nbsp;useful&nbsp;if&nbsp;you&nbsp;want&nbsp;to&nbsp;obfuscate&nbsp;your&nbsp;json,&nbsp;or&nbsp;send&nbsp;binary&nbsp;data&nbsp;over<br />&nbsp;*&nbsp;&nbsp;a&nbsp;network<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_EXPOSE_BASE64</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_ITERATORS&nbsp;turns&nbsp;on&nbsp;all&nbsp;of&nbsp;libjson's&nbsp;iterating&nbsp;functionality.&nbsp;&nbsp;This&nbsp;would&nbsp;usually<br />&nbsp;*&nbsp;&nbsp;only&nbsp;be&nbsp;turned&nbsp;off&nbsp;while&nbsp;compiling&nbsp;for&nbsp;use&nbsp;with&nbsp;C<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_ITERATORS<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_STREAM&nbsp;turns&nbsp;on&nbsp;libjson's&nbsp;streaming&nbsp;functionality.&nbsp;&nbsp;This&nbsp;allows&nbsp;you&nbsp;to&nbsp;give&nbsp;parts&nbsp;of&nbsp;<br />&nbsp;*&nbsp;&nbsp;your&nbsp;json&nbsp;into&nbsp;a&nbsp;stream,&nbsp;which&nbsp;will&nbsp;automatically&nbsp;hit&nbsp;a&nbsp;callback&nbsp;when&nbsp;full&nbsp;nodes&nbsp;are<br />&nbsp;*&nbsp;&nbsp;completed<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_STREAM</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_MEMORY_CALLBACKS&nbsp;exposes&nbsp;functions&nbsp;to&nbsp;register&nbsp;callbacks&nbsp;for&nbsp;allocating,&nbsp;resizing,<br />&nbsp;*&nbsp;&nbsp;and&nbsp;freeing&nbsp;memory.&nbsp;&nbsp;Because&nbsp;libjson&nbsp;is&nbsp;designed&nbsp;for&nbsp;customizability,&nbsp;it&nbsp;is&nbsp;feasible<br />&nbsp;*&nbsp;&nbsp;that&nbsp;some&nbsp;users&nbsp;would&nbsp;like&nbsp;to&nbsp;further&nbsp;add&nbsp;speed&nbsp;by&nbsp;having&nbsp;the&nbsp;library&nbsp;utilize&nbsp;a&nbsp;memory<br />&nbsp;*&nbsp;&nbsp;pool.&nbsp;&nbsp;With&nbsp;this&nbsp;option&nbsp;turned&nbsp;on,&nbsp;the&nbsp;default&nbsp;behavior&nbsp;is&nbsp;still&nbsp;done&nbsp;internally&nbsp;unless<br />&nbsp;*&nbsp;&nbsp;a&nbsp;callback&nbsp;is&nbsp;registered.&nbsp;&nbsp;So&nbsp;you&nbsp;can&nbsp;have&nbsp;this&nbsp;option&nbsp;on&nbsp;and&nbsp;not&nbsp;use&nbsp;it.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_MEMORY_CALLBACKS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_MEMORY_MANAGE&nbsp;is&nbsp;used&nbsp;to&nbsp;create&nbsp;functionality&nbsp;to&nbsp;automatically&nbsp;track&nbsp;and&nbsp;clean<br />&nbsp;*&nbsp;&nbsp;up&nbsp;memory&nbsp;that&nbsp;has&nbsp;been&nbsp;allocated&nbsp;by&nbsp;the&nbsp;user.&nbsp;&nbsp;This&nbsp;includes&nbsp;strings,&nbsp;binary&nbsp;data,&nbsp;and<br />&nbsp;*&nbsp;&nbsp;nodes.&nbsp;&nbsp;It&nbsp;also&nbsp;exposes&nbsp;bulk&nbsp;delete&nbsp;functions.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_MEMORY_MANAGE</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;JSON_MEMORY_POOL&nbsp;Turns&nbsp;on&nbsp;libjson's&nbsp;iteraction&nbsp;with&nbsp;mempool++.&nbsp;&nbsp;It&nbsp;is&nbsp;more&nbsp;efficient&nbsp;that&nbsp;simply<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;connecting&nbsp;mempool++&nbsp;to&nbsp;the&nbsp;callbacks&nbsp;because&nbsp;it&nbsp;integrates&nbsp;things&nbsp;internally&nbsp;and&nbsp;uses&nbsp;a&nbsp;number<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;memory&nbsp;pools.&nbsp;&nbsp;This&nbsp;value&nbsp;tells&nbsp;libjson&nbsp;how&nbsp;large&nbsp;of&nbsp;a&nbsp;memory&nbsp;pool&nbsp;to&nbsp;start&nbsp;out&nbsp;with.&nbsp;&nbsp;500KB&nbsp;<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;suffice&nbsp;for&nbsp;most&nbsp;cases.&nbsp;&nbsp;libjson&nbsp;will&nbsp;distribute&nbsp;that&nbsp;within&nbsp;the&nbsp;pool&nbsp;for&nbsp;the&nbsp;best<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;performance&nbsp;depending&nbsp;on&nbsp;other&nbsp;settings.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_MEMORY_POOL&nbsp;524288</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_MUTEX_CALLBACKS&nbsp;exposes&nbsp;functions&nbsp;to&nbsp;register&nbsp;callbacks&nbsp;to&nbsp;lock&nbsp;and&nbsp;unlock<br />&nbsp;*&nbsp;&nbsp;mutexs&nbsp;and&nbsp;functions&nbsp;to&nbsp;lock&nbsp;and&nbsp;unlock&nbsp;JSONNodes&nbsp;and&nbsp;all&nbsp;of&nbsp;it's&nbsp;children.&nbsp;&nbsp;This&nbsp;<br />&nbsp;*&nbsp;&nbsp;does&nbsp;not&nbsp;prevent&nbsp;other&nbsp;threads&nbsp;from&nbsp;accessing&nbsp;the&nbsp;node,&nbsp;but&nbsp;will&nbsp;prevent&nbsp;them&nbsp;from<br />&nbsp;*&nbsp;&nbsp;locking&nbsp;it.&nbsp;It&nbsp;is&nbsp;much&nbsp;easier&nbsp;for&nbsp;the&nbsp;end&nbsp;programmer&nbsp;to&nbsp;allow&nbsp;libjson&nbsp;to&nbsp;manage<br />&nbsp;*&nbsp;&nbsp;your&nbsp;mutexs&nbsp;because&nbsp;of&nbsp;reference&nbsp;counting&nbsp;and&nbsp;manipulating&nbsp;trees,&nbsp;libjson&nbsp;automatically<br />&nbsp;*&nbsp;&nbsp;tracks&nbsp;mutex&nbsp;controls&nbsp;for&nbsp;you,&nbsp;so&nbsp;you&nbsp;only&nbsp;ever&nbsp;lock&nbsp;what&nbsp;you&nbsp;need&nbsp;to<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_MUTEX_CALLBACKS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_MUTEX_MANAGE&nbsp;lets&nbsp;you&nbsp;set&nbsp;mutexes&nbsp;and&nbsp;forget&nbsp;them,&nbsp;libjson&nbsp;will&nbsp;not&nbsp;only&nbsp;keep<br />&nbsp;*&nbsp;&nbsp;track&nbsp;of&nbsp;the&nbsp;mutex,&nbsp;but&nbsp;also&nbsp;keep&nbsp;a&nbsp;count&nbsp;of&nbsp;how&nbsp;many&nbsp;nodes&nbsp;are&nbsp;using&nbsp;it,&nbsp;and&nbsp;delete<br />&nbsp;*&nbsp;&nbsp;it&nbsp;when&nbsp;there&nbsp;are&nbsp;no&nbsp;more&nbsp;references<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_MUTEX_MANAGE</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_NO_C_CONSTS&nbsp;removes&nbsp;consts&nbsp;from&nbsp;the&nbsp;C&nbsp;interface.&nbsp;&nbsp;It&nbsp;still&nbsp;acts&nbsp;the&nbsp;same&nbsp;way,&nbsp;but<br />&nbsp;*&nbsp;&nbsp;this&nbsp;may&nbsp;be&nbsp;useful&nbsp;for&nbsp;using&nbsp;the&nbsp;header&nbsp;with&nbsp;languages&nbsp;or&nbsp;variants&nbsp;that&nbsp;don't&nbsp;have&nbsp;const<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_NO_C_CONSTS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_OCTAL&nbsp;allows&nbsp;libjson&nbsp;to&nbsp;use&nbsp;octal&nbsp;values&nbsp;in&nbsp;numbers.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_OCTAL</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_WRITE_PRIORITY&nbsp;turns&nbsp;on&nbsp;libjson's&nbsp;writing&nbsp;capabilties.&nbsp;&nbsp;Without&nbsp;this&nbsp;libjson&nbsp;can&nbsp;only<br />&nbsp;*&nbsp;&nbsp;read&nbsp;and&nbsp;parse&nbsp;json,&nbsp;this&nbsp;allows&nbsp;it&nbsp;to&nbsp;write&nbsp;back&nbsp;out.&nbsp;&nbsp;Changing&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;writer<br />&nbsp;*&nbsp;&nbsp;changes&nbsp;how&nbsp;libjson&nbsp;compiles,&nbsp;and&nbsp;how&nbsp;fast&nbsp;it&nbsp;will&nbsp;go&nbsp;when&nbsp;writing<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_WRITE_PRIORITY&nbsp;MED<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_READ_PRIORITY&nbsp;turns&nbsp;on&nbsp;libjson's&nbsp;reading&nbsp;capabilties.&nbsp;&nbsp;Changing&nbsp;the&nbsp;value&nbsp;of&nbsp;the&nbsp;reader<br />&nbsp;*&nbsp;&nbsp;changes&nbsp;how&nbsp;libjson&nbsp;compiles,&nbsp;and&nbsp;how&nbsp;fast&nbsp;it&nbsp;will&nbsp;go&nbsp;when&nbsp;writing<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_READ_PRIORITY&nbsp;HIGH<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_NEWLINE&nbsp;affects&nbsp;how&nbsp;libjson&nbsp;writes.&nbsp;&nbsp;If&nbsp;this&nbsp;option&nbsp;is&nbsp;turned&nbsp;on,&nbsp;libjson<br />&nbsp;*&nbsp;&nbsp;will&nbsp;use&nbsp;whatever&nbsp;it's&nbsp;defined&nbsp;as&nbsp;for&nbsp;the&nbsp;newline&nbsp;signifier,&nbsp;otherwise,&nbsp;it&nbsp;will&nbsp;use&nbsp;<br />&nbsp;*&nbsp;&nbsp;standard&nbsp;unix&nbsp;\n.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_NEWLINE&nbsp;"\r\n"&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">\r\n&nbsp;is&nbsp;standard&nbsp;for&nbsp;most&nbsp;windows&nbsp;and&nbsp;dos&nbsp;programs</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_INDENT&nbsp;affects&nbsp;how&nbsp;libjson&nbsp;writes.&nbsp;&nbsp;If&nbsp;this&nbsp;option&nbsp;is&nbsp;turned&nbsp;on,&nbsp;libjson<br />&nbsp;*&nbsp;&nbsp;will&nbsp;use&nbsp;\t&nbsp;to&nbsp;indent&nbsp;formatted&nbsp;json,&nbsp;otherwise&nbsp;it&nbsp;will&nbsp;use&nbsp;the&nbsp;number&nbsp;of&nbsp;characters<br />&nbsp;*&nbsp;&nbsp;that&nbsp;you&nbsp;specify.&nbsp;&nbsp;If&nbsp;this&nbsp;is&nbsp;not&nbsp;turned&nbsp;on,&nbsp;then&nbsp;it&nbsp;will&nbsp;use&nbsp;the&nbsp;tab&nbsp;(\t)&nbsp;character<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_INDENT&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;"</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_ESCAPE_WRITES&nbsp;tells&nbsp;the&nbsp;libjson&nbsp;engine&nbsp;to&nbsp;escape&nbsp;special&nbsp;characters&nbsp;when&nbsp;it&nbsp;writes<br />&nbsp;*&nbsp;&nbsp;out.&nbsp;&nbsp;If&nbsp;this&nbsp;option&nbsp;is&nbsp;turned&nbsp;off,&nbsp;the&nbsp;json&nbsp;it&nbsp;outputs&nbsp;may&nbsp;not&nbsp;adhere&nbsp;to&nbsp;JSON&nbsp;standards<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_ESCAPE_WRITES</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_COMMENTS&nbsp;tells&nbsp;libjson&nbsp;to&nbsp;store&nbsp;and&nbsp;write&nbsp;comments.&nbsp;&nbsp;libjson&nbsp;always&nbsp;supports<br />&nbsp;*&nbsp;&nbsp;parsing&nbsp;json&nbsp;that&nbsp;has&nbsp;comments&nbsp;in&nbsp;it&nbsp;as&nbsp;it&nbsp;simply&nbsp;ignores&nbsp;them,&nbsp;but&nbsp;with&nbsp;this&nbsp;option<br />&nbsp;*&nbsp;&nbsp;it&nbsp;keeps&nbsp;the&nbsp;comments&nbsp;and&nbsp;allows&nbsp;you&nbsp;to&nbsp;insert&nbsp;further&nbsp;comments<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_COMMENTS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_WRITE_BASH_COMMENTS&nbsp;will&nbsp;cause&nbsp;libjson&nbsp;to&nbsp;write&nbsp;all&nbsp;comments&nbsp;in&nbsp;bash&nbsp;(#)&nbsp;style<br />&nbsp;*&nbsp;&nbsp;if&nbsp;this&nbsp;option&nbsp;is&nbsp;not&nbsp;turned&nbsp;on,&nbsp;then&nbsp;it&nbsp;will&nbsp;use&nbsp;C-style&nbsp;comments.&nbsp;&nbsp;Bash&nbsp;comments&nbsp;are<br />&nbsp;*&nbsp;&nbsp;all&nbsp;single&nbsp;line<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_WRITE_BASH_COMMENTS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_WRITE_SINGLE_LINE_COMMENTS&nbsp;will&nbsp;cause&nbsp;libjson&nbsp;to&nbsp;write&nbsp;all&nbsp;comments&nbsp;in&nbsp;using&nbsp;//<br />&nbsp;*&nbsp;&nbsp;notation,&nbsp;or&nbsp;(#)&nbsp;if&nbsp;that&nbsp;option&nbsp;is&nbsp;on.&nbsp;&nbsp;Some&nbsp;parsers&nbsp;do&nbsp;not&nbsp;support&nbsp;multiline&nbsp;C&nbsp;comments<br />&nbsp;*&nbsp;&nbsp;although,&nbsp;this&nbsp;option&nbsp;is&nbsp;not&nbsp;needed&nbsp;for&nbsp;bash&nbsp;comments,&nbsp;as&nbsp;they&nbsp;are&nbsp;all&nbsp;single&nbsp;line&nbsp;anyway<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_WRITE_SINGLE_LINE_COMMENTS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_ARRAY_SIZE_ON_ON_LINE&nbsp;allows&nbsp;you&nbsp;to&nbsp;put&nbsp;small&nbsp;arrays&nbsp;of&nbsp;primitives&nbsp;all&nbsp;on&nbsp;one&nbsp;line<br />&nbsp;*&nbsp;&nbsp;in&nbsp;a&nbsp;write_formatted.&nbsp;&nbsp;This&nbsp;is&nbsp;common&nbsp;for&nbsp;tuples,&nbsp;like&nbsp;coordinates.&nbsp;&nbsp;If&nbsp;must&nbsp;be&nbsp;defined&nbsp;<br />&nbsp;*&nbsp;&nbsp;as&nbsp;an&nbsp;integer<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_ARRAY_SIZE_ON_ONE_LINE&nbsp;2</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_VALIDATE&nbsp;turns&nbsp;on&nbsp;validation&nbsp;features&nbsp;of&nbsp;libjson.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_VALIDATE</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_CASE_INSENSITIVE_FUNCTIONS&nbsp;turns&nbsp;on&nbsp;funtions&nbsp;for&nbsp;finding&nbsp;child&nbsp;nodes&nbsp;in&nbsp;a&nbsp;case-<br />&nbsp;*&nbsp;&nbsp;insenititve&nbsp;way<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_CASE_INSENSITIVE_FUNCTIONS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_INDEX_TYPE&nbsp;allows&nbsp;you&nbsp;th&nbsp;change&nbsp;the&nbsp;size&nbsp;type&nbsp;for&nbsp;the&nbsp;children&nbsp;functions.&nbsp;If&nbsp;this&nbsp;<br />&nbsp;*&nbsp;&nbsp;option&nbsp;is&nbsp;not&nbsp;used&nbsp;then&nbsp;unsigned&nbsp;int&nbsp;is&nbsp;used.&nbsp;&nbsp;This&nbsp;option&nbsp;is&nbsp;useful&nbsp;for&nbsp;cutting&nbsp;down<br />&nbsp;*&nbsp;&nbsp;on&nbsp;memory,&nbsp;or&nbsp;using&nbsp;huge&nbsp;numbers&nbsp;of&nbsp;child&nbsp;nodes&nbsp;(over&nbsp;4&nbsp;billion)<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_INDEX_TYPE&nbsp;unsigned&nbsp;int</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_BOOL_TYPE&nbsp;lets&nbsp;you&nbsp;change&nbsp;the&nbsp;bool&nbsp;type&nbsp;for&nbsp;the&nbsp;C&nbsp;interface.&nbsp;&nbsp;Because&nbsp;before&nbsp;C99&nbsp;there<br />&nbsp;*&nbsp;&nbsp;was&nbsp;no&nbsp;bool,&nbsp;and&nbsp;even&nbsp;then&nbsp;it's&nbsp;just&nbsp;a&nbsp;typedef,&nbsp;you&nbsp;may&nbsp;want&nbsp;to&nbsp;use&nbsp;something&nbsp;else.&nbsp;&nbsp;If&nbsp;this&nbsp;<br />&nbsp;*&nbsp;&nbsp;is&nbsp;not&nbsp;defined,&nbsp;it&nbsp;will&nbsp;revert&nbsp;to&nbsp;int<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_BOOL_TYPE&nbsp;char</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_INT_TYPE&nbsp;lets&nbsp;you&nbsp;change&nbsp;the&nbsp;int&nbsp;type&nbsp;for&nbsp;as_int.&nbsp;&nbsp;If&nbsp;you&nbsp;ommit&nbsp;this&nbsp;option,&nbsp;the&nbsp;default<br />&nbsp;*&nbsp;&nbsp;long&nbsp;will&nbsp;be&nbsp;used<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_INT_TYPE&nbsp;long</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_STRING_HEADER&nbsp;allows&nbsp;you&nbsp;to&nbsp;change&nbsp;the&nbsp;type&nbsp;of&nbsp;string&nbsp;that&nbsp;libjson&nbsp;uses&nbsp;both&nbsp;for&nbsp;the<br />&nbsp;*&nbsp;&nbsp;interface&nbsp;and&nbsp;internally.&nbsp;&nbsp;It&nbsp;must&nbsp;implement&nbsp;most&nbsp;of&nbsp;the&nbsp;STL&nbsp;string&nbsp;interface,&nbsp;but&nbsp;not&nbsp;all<br />&nbsp;*&nbsp;&nbsp;of&nbsp;it.&nbsp;&nbsp;Things&nbsp;like&nbsp;wxString&nbsp;or&nbsp;QString&nbsp;should&nbsp;wourk&nbsp;without&nbsp;much&nbsp;trouble<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_STRING_HEADER&nbsp;"../TestSuite/StringTest.h"</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_UNIT_TEST&nbsp;is&nbsp;used&nbsp;to&nbsp;maintain&nbsp;and&nbsp;debug&nbsp;the&nbsp;libjson.&nbsp;&nbsp;It&nbsp;makes&nbsp;all&nbsp;private<br />&nbsp;*&nbsp;&nbsp;members&nbsp;and&nbsp;functions&nbsp;public&nbsp;so&nbsp;that&nbsp;tests&nbsp;can&nbsp;do&nbsp;checks&nbsp;of&nbsp;the&nbsp;inner&nbsp;workings<br />&nbsp;*&nbsp;&nbsp;of&nbsp;libjson.&nbsp;&nbsp;This&nbsp;should&nbsp;not&nbsp;be&nbsp;turned&nbsp;on&nbsp;by&nbsp;end&nbsp;users.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_UNIT_TEST</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_NO_EXCEPTIONS&nbsp;turns&nbsp;off&nbsp;any&nbsp;exception&nbsp;throwing&nbsp;by&nbsp;the&nbsp;library.&nbsp;&nbsp;It&nbsp;may&nbsp;still&nbsp;use&nbsp;exceptions<br />&nbsp;*&nbsp;&nbsp;internally,&nbsp;but&nbsp;the&nbsp;interface&nbsp;will&nbsp;never&nbsp;throw&nbsp;anything.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_NO_EXCEPTIONS</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_DEPRECATED_FUNCTIONS&nbsp;turns&nbsp;on&nbsp;functions&nbsp;that&nbsp;have&nbsp;been&nbsp;deprecated,&nbsp;this&nbsp;is&nbsp;for&nbsp;backwards<br />&nbsp;*&nbsp;&nbsp;compatibility&nbsp;between&nbsp;major&nbsp;releases.&nbsp;&nbsp;It&nbsp;is&nbsp;highly&nbsp;recommended&nbsp;that&nbsp;you&nbsp;move&nbsp;your&nbsp;functions<br />&nbsp;*&nbsp;&nbsp;over&nbsp;to&nbsp;the&nbsp;new&nbsp;equivalents<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_DEPRECATED_FUNCTIONS<br /><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_CASTABLE&nbsp;allows&nbsp;you&nbsp;to&nbsp;call&nbsp;as_bool&nbsp;on&nbsp;a&nbsp;number&nbsp;and&nbsp;have&nbsp;it&nbsp;do&nbsp;the&nbsp;0&nbsp;or&nbsp;not&nbsp;0&nbsp;check,<br />&nbsp;*&nbsp;&nbsp;it&nbsp;also&nbsp;allows&nbsp;you&nbsp;to&nbsp;ask&nbsp;for&nbsp;a&nbsp;string&nbsp;from&nbsp;a&nbsp;number,&nbsp;or&nbsp;boolean,&nbsp;and&nbsp;have&nbsp;it&nbsp;return&nbsp;the&nbsp;right&nbsp;thing.<br />&nbsp;*&nbsp;&nbsp;Without&nbsp;this&nbsp;option,&nbsp;those&nbsp;types&nbsp;of&nbsp;requests&nbsp;are&nbsp;undefined.&nbsp;&nbsp;It&nbsp;also&nbsp;exposes&nbsp;the&nbsp;as_array,&nbsp;as_node,&nbsp;and&nbsp;cast&nbsp;<br />&nbsp;*&nbsp;&nbsp;functions<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_CASTABLE</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_SECURITY_MAX_NEST_LEVEL&nbsp;is&nbsp;a&nbsp;security&nbsp;measure&nbsp;added&nbsp;to&nbsp;make&nbsp;prevent&nbsp;against&nbsp;DoS&nbsp;attacks<br />&nbsp;*&nbsp;&nbsp;This&nbsp;only&nbsp;affects&nbsp;validation,&nbsp;as&nbsp;if&nbsp;you&nbsp;are&nbsp;worried&nbsp;about&nbsp;security&nbsp;attacks,&nbsp;then&nbsp;you&nbsp;are<br />&nbsp;*&nbsp;&nbsp;most&nbsp;certainly&nbsp;validating&nbsp;json&nbsp;before&nbsp;sending&nbsp;it&nbsp;to&nbsp;be&nbsp;parsed.&nbsp;&nbsp;This&nbsp;option&nbsp;allows&nbsp;you&nbsp;to&nbsp;limitl&nbsp;how&nbsp;many<br />&nbsp;*&nbsp;&nbsp;levels&nbsp;deep&nbsp;a&nbsp;JSON&nbsp;Node&nbsp;can&nbsp;go.&nbsp;&nbsp;128&nbsp;is&nbsp;a&nbsp;good&nbsp;depth&nbsp;to&nbsp;start&nbsp;with<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_SECURITY_MAX_NEST_LEVEL&nbsp;128</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;JSON_SECURITY_MAX_STRING_LENGTH&nbsp;is&nbsp;another&nbsp;security&nbsp;measure,&nbsp;preventing&nbsp;DoS&nbsp;attacks&nbsp;with&nbsp;very&nbsp;long<br />&nbsp;*&nbsp;&nbsp;strings&nbsp;of&nbsp;JSON.&nbsp;&nbsp;32MB&nbsp;is&nbsp;the&nbsp;default&nbsp;value&nbsp;for&nbsp;this,&nbsp;this&nbsp;allows&nbsp;large&nbsp;images&nbsp;to&nbsp;be&nbsp;embedded<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#define&nbsp;JSON_SECURITY_MAX_STRING_LENGTH&nbsp;33554432</span><span style="color: #008000; "><br /></span><br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;JSON_SECURITY_MAX_STREAM_OBJECTS&nbsp;is&nbsp;a&nbsp;security&nbsp;measure&nbsp;for&nbsp;streams.&nbsp;&nbsp;It&nbsp;prevents&nbsp;DoS&nbsp;attacks&nbsp;with<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;large&nbsp;number&nbsp;of&nbsp;objects&nbsp;hitting&nbsp;the&nbsp;stream&nbsp;all&nbsp;at&nbsp;once.&nbsp;&nbsp;128&nbsp;is&nbsp;a&nbsp;lot&nbsp;of&nbsp;objects,&nbsp;but&nbsp;not&nbsp;out&nbsp;of<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;question&nbsp;for&nbsp;high&nbsp;speed&nbsp;systems.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">#define</span>&nbsp;JSON_SECURITY_MAX_STREAM_OBJECTS&nbsp;128<br /><br /><span style="color: #0000FF; ">#endif</span></div> <img src ="http://www.cppblog.com/lizao2/aggbug/168986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lizao2/" target="_blank">hello wold!</a> 2012-03-26 11:42 <a href="http://www.cppblog.com/lizao2/articles/168986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>