有谁能帮忙把这个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;
}