首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

有哪位高手能帮忙把这个json库改成CB2010下可以用的吗

2013-08-01 
有谁能帮忙把这个json库改成CB2010下可以用的吗?http://www.oschina.net/p/jsonvalue[解决办法]jsonvalue(

有谁能帮忙把这个json库改成CB2010下可以用的吗?
http://www.oschina.net/p/jsonvalue
[解决办法]
jsonvalue(http://www.oschina.net/p/jsonvalue )在CB下的修改
只要改json.cpp,json.h不需要改。我是在XE4下修改编译通过,没作运行时测试。

一、XE及以上版本,因版权问题,不自带atl文件,需要复制以前版本的ATL文件。
方法是COPY之前本的atl文件夹到 include文件夹下。同时copy bcbatl.lib 到lib\win32\release下。我是重新装了B6后,COPY了B6的ATL文件。
二、头文件部分改下:

#include "Json.h"
#include <float.h>
#include <dispex.h>

#ifdef __BORLANDC__   //使用CB编译

#include <atl/atlbase.h>  //XE以上版本COPY先前版本的ATL至include文件夹下
#include <limits.h>
#define _I8_MIN   SCHAR_MIN
#define _I8_MAX   SCHAR_MAX
#define _I16_MIN  SHRT_MIN
#define _I16_MAX  SHRT_MAX
#define _I32_MIN  INT_MIN
#define _I32_MAX  INT_MAX
#define _UI8_MIN     0
#define _UI8_MAX     UCHAR_MAX
#define _UI16_MIN    0
#define _UI16_MAX    USHRT_MAX
#define _UI32_MIN    0
#define _UI32_MAX    UINT_MAX
#define _wcstoi64 wcstoll
#define _wcstoui64 wcstoull

#else  //用VS编译

#include "StdAfx.h"
#include <atlbase.h>
#include <atlcomcli.h>// CComDispatchDriver, CComPtr
#pragma warning(disable:4389)

#endif

三、 L"" 改为wstring() 多处,用CTRL+R替换即可,问号表达式的两个值其类型必须一样,L""为const w_char * ,与wstring 是不同的类型,会提示错误。 好象XE以前版本没那么严格,记得不清了。

四、_variant_t 的赋值。CB 少了对一些类型的直接赋值支持,对_variant_t直接写值与变量类型即可。
更改bool JSONVALUE::ToVariant函数:


bool JSONVALUE::ToVariant(_variant_t& v, const DWORD nFlag)
{
UNREFERENCED_PARAMETER(nFlag);

bool bOk = true;
switch (vt) {
case VT_NULL:v = _variant_t();break;
case VT_I1:v.vt = VT_I1 ; v.cVal = (char)val.numVal.llVal; break;
case VT_I2:v = (short)val.numVal.llVal;break;
case VT_I4:v = (long)val.numVal.llVal;break;
case VT_I8:v.vt = VT_I8; v.llVal = val.numVal.llVal;break;


case VT_UI1:v = (unsigned char)val.numVal.ullVal;break;
case VT_UI2:v.vt = VT_UI2; v.uiVal  = (unsigned short)val.numVal.ullVal;break;
case VT_UI4:v.vt = VT_UI4; v.ulVal  = (unsigned long)val.numVal.ullVal;break;
case VT_UI8:v.vt = VT_UI8; v.ullVal =  val.numVal.ullVal; break;
case VT_DECIMAL:
{
DECIMAL decVal = {0};
VarDecFromR8(val.numVal.dblVal, &decVal);
v = decVal;
}
break;
case VT_R4:v = (float)val.numVal.dblVal;break;
case VT_R8:v = val.numVal.dblVal;break;
case VT_BSTR:v = val.strVal->c_str();break;
case VT_DATE:v = (DATE)val.numVal.dblVal, VT_DATE;break;
case VT_BOOL:v = val.boolVal;break;
default:bOk = false;break;
// TODO: to handle conversion to IDispatch
}
return bOk;
}

热点排行