VariantEx.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:7k
源码类别:

网格计算

开发平台:

Visual C++

  1. #include ".VariantEx.h"
  2. //constructor procedure
  3. CVariantEx::CVariantEx()
  4. {
  5. this->m_var.Clear();
  6. }
  7. //constructor procedure
  8. CVariantEx::CVariantEx(_variant_t &vt)
  9. {
  10. try{
  11. if( this->Clear() ){
  12. this->m_var = vt;
  13. }
  14. }
  15. catch(_com_error e){
  16. //throw e.ErrorMessage();
  17. }
  18. }
  19. //constructor procedure
  20. CVariantEx::CVariantEx(CVariantEx &var)
  21. {
  22. this->m_var = var.get_variant_t();
  23. }
  24. CVariantEx::CVariantEx(const bool bVar)
  25. {
  26. _variant_t v(bVar);
  27. this->m_var = v;
  28. }
  29. CVariantEx::CVariantEx(const long nVar)
  30. {
  31. _variant_t v(nVar);
  32. this->m_var = v;
  33. }
  34. CVariantEx::CVariantEx(const double dVar)
  35. {
  36. _variant_t v(dVar);
  37. this->m_var = v;
  38. }
  39. CVariantEx::CVariantEx(LPCSTR lpszVar)
  40. {
  41. _variant_t v(lpszVar);
  42. this->m_var = v;
  43. }
  44. //operator "=" override 
  45. CVariantEx& CVariantEx::operator=(_variant_t &vt)
  46. {
  47. this->m_var = vt;
  48. return (*this);
  49. }
  50. //operator "=" override 
  51. CVariantEx& CVariantEx::operator=(CVariantEx &var)
  52. {
  53. this->m_var = var.get_variant_t();
  54. return (*this);
  55. }
  56. CVariantEx& CVariantEx::operator=(const bool bVar)
  57. {
  58. _variant_t v(bVar);
  59. this->m_var = v;
  60. return (*this);
  61. }
  62. CVariantEx& CVariantEx::operator=(const long nVar)
  63. {
  64. _variant_t v(nVar);
  65. this->m_var = v;
  66. return (*this);
  67. }
  68. CVariantEx& CVariantEx::operator=(const double dVar)
  69. {
  70. _variant_t v(dVar);
  71. this->m_var = v;
  72. return (*this);
  73. }
  74. CVariantEx& CVariantEx::operator=(LPCSTR lpszVar)
  75. {
  76. _variant_t v(lpszVar);
  77. this->m_var = v;
  78. return (*this);
  79. }
  80. //destructor procedure
  81. CVariantEx::~CVariantEx()
  82. {
  83. this->Clear();
  84. }
  85. //determine the var whether is null
  86. bool CVariantEx::IsNull()
  87. {
  88. //if you write "this->m_var == NULL" 
  89. //then the compiler can warn syntax error
  90. return (this->m_var.vt == VT_NULL);
  91. }
  92. //clear the var value
  93. bool CVariantEx::Clear()
  94. {
  95. if( this->IsNull() ){
  96. return true;
  97. }
  98. else{
  99. this->m_var.Clear();
  100. return true;
  101. }
  102. }
  103. //get the variant type
  104. VARTYPE_ENUM CVariantEx::getVarType()
  105. {
  106. if(this->IsNull()){
  107. throw "variant is null!!!";
  108. }
  109. switch(this->m_var.vt) {
  110. case VT_BSTR:
  111. case VT_LPSTR:
  112. case VT_LPWSTR:
  113. return VTE_STRING;
  114. case VT_I2:
  115. return VTE_SHORT;
  116. case VT_I8:
  117. return VTE_LONG;
  118. case VT_VOID:
  119. case VT_INT:
  120. case VT_I4:
  121. return VTE_INT;
  122. case VT_UI2:
  123. return VTE_UNSHORT;
  124. case VT_UINT:
  125. case VT_UI4:
  126. return VTE_UNINT;
  127. case VT_UI8:
  128. return VTE_ULINT;
  129. case VT_R4:
  130. return VTE_FLOAT;
  131. case VT_DECIMAL:
  132. return VTE_DECIMAL;
  133. case VT_R8:
  134. return VTE_DOUBLE;
  135. case VT_BOOL:
  136. return VTE_BOOL;
  137. case VT_DATE: 
  138. return VTE_DATETIME;
  139. case VT_NULL:
  140. return VTE_NULL;
  141. case VT_EMPTY:
  142. return VTE_EMPTY;
  143. case VT_UNKNOWN:
  144. default:
  145. return VTE_UNKNOWN;
  146. }
  147. }
  148. //get the variant value
  149. _variant_t& CVariantEx::get_variant_t()
  150. {
  151. return this->m_var;
  152. }
  153. //######################################################
  154. //convert to string type
  155. string CVariantEx::AsString()
  156. {
  157. string strRet = "NULL";
  158. if(this->IsNull()){
  159. return strRet;
  160. //throw "variant is null!!!";
  161. }
  162. char szInt[64],
  163. szDT[MAX_DATE_SIZE + MAX_TIME_SIZE];
  164. strRet.erase();
  165. memset(szInt, 0x0, sizeof(szInt));
  166. switch(this->getVarType()) {
  167. case VTE_STRING:
  168. strRet = (LPCTSTR)(_bstr_t)this->m_var;
  169. break;
  170. case VTE_INT:
  171. itoa(this->m_var.intVal, szInt, 10);
  172. break;
  173. case VTE_SHORT:
  174. itoa(this->m_var.iVal, szInt, 10);
  175. break;
  176. case VTE_LONG:
  177. ltoa(this->m_var.lVal, szInt, 10);
  178. break;
  179. case VTE_UNSHORT:
  180. itoa(this->m_var.uiVal, szInt, 10);
  181. break;
  182. case VTE_UNINT:
  183. ultoa(this->m_var.uintVal, szInt, 10);
  184. break;
  185. case VTE_ULINT:
  186. ultoa(this->m_var.ulVal, szInt, 10);
  187. break;
  188. //real type(%.4f format)
  189. case VTE_FLOAT:
  190. case VTE_DECIMAL:
  191. sprintf((char*)&szInt[0], "%.4f", this->m_var.fltVal);
  192. break;
  193. //real type(%.8f format)
  194. case VTE_DOUBLE:
  195. sprintf((char*)&szInt[0], "%.8f", this->m_var.dblVal);
  196. break;
  197. case VTE_BOOL:
  198. if(this->AsBool())
  199. strcpy((char*)&szInt[0], "True");
  200. else
  201. strcpy((char*)&szInt[0], "False");
  202. break;
  203. case VTE_DATETIME:
  204. {
  205. try{
  206. CDateTimeEx dtDateTime = this->AsDateTime();
  207. dtDateTime.AsDTString(szDT);
  208. strRet = strRet + szDT;
  209. }
  210. catch(std::exception e){
  211. throw e.what();
  212. }
  213. }
  214. break;
  215. case VTE_NULL:
  216. strRet = "NULL";
  217. break;
  218. case VTE_UNKNOWN:
  219. strRet = "UNKNOWN";
  220. break;
  221. case VTE_EMPTY:
  222. break;
  223. case VTE_BLOB:
  224. case VTE_BLOB_OBJECT:
  225. strRet = "BLOB";
  226. break;
  227. case VTE_TEXT:
  228. strRet = "TEXT";
  229. break;
  230. default:
  231. throw "couldn't convert this variant to string value!!!";
  232. }
  233. strRet = strRet + szInt;
  234. return strRet;
  235. }
  236. //convert to boolean type
  237. bool CVariantEx::AsBool()
  238. {
  239. if(this->IsNull()){
  240. throw "variant is null!!!";
  241. }
  242. switch(this->getVarType()) {
  243. case VTE_BOOL:
  244. return (0 != this->m_var.lVal) ? true: false;
  245. case VTE_UNSHORT:
  246. return (this->m_var.uiVal != 0) ? true:false; 
  247. case VTE_UNINT:
  248. return (this->m_var.uintVal != 0) ? true:false; 
  249. case VTE_ULINT:
  250. return (this->m_var.ulVal != 0) ? true:false;
  251. default:
  252. throw "couldn't convert this variant to boolean value!!!";
  253. }
  254. }
  255. //convert to integer type
  256. int   CVariantEx::AsInteger()
  257. {
  258. if(this->IsNull()){
  259. throw "variant is null!!!";
  260. }
  261. /////////////////////////////////
  262. switch(this->getVarType()) {
  263. case VTE_INT:
  264. return (this->m_var.intVal);
  265. case VTE_SHORT:
  266. return (this->m_var.iVal);
  267. case VTE_LONG:
  268. return (this->m_var.lVal);
  269. case VTE_UNSHORT:
  270. return (this->m_var.uiVal);
  271. case VTE_UNINT:
  272. return (this->m_var.uintVal);
  273. case VTE_ULINT:
  274. return (this->m_var.ulVal);
  275. default:
  276. throw "couldn't convert this variant to int value!!!";
  277. }
  278. }
  279. //convert to real type
  280. double CVariantEx::AsReal()
  281. {
  282. if(this->IsNull()){
  283. throw "variant is null!!!";
  284. }
  285. /////////////////////////////////
  286. switch(this->getVarType()) {
  287. case VTE_FLOAT:
  288. return (this->m_var.fltVal);
  289. case VTE_DECIMAL:
  290. {
  291. char szDecimal[32];
  292. memset(szDecimal, 0x0, sizeof(szDecimal));
  293. sprintf(szDecimal, "%.4f", this->m_var.decVal);
  294. return (atof(szDecimal));
  295. }
  296. case VTE_DOUBLE:
  297. return (this->m_var.dblVal);
  298. default:
  299. throw "couldn't convert this variant to double value!!!";
  300. }
  301. }
  302. //convert to datetime type
  303. CDateTimeEx CVariantEx::AsDateTime()
  304. {
  305. if(this->IsNull()){
  306. throw "variant is null!!!";
  307. }
  308. /////////////////////////////////
  309. DATE dtTag = this->m_var.date;
  310. try{
  311. CDateTimeEx dtDateTime(dtTag);
  312. return dtDateTime;
  313. }
  314. catch(std::exception e){
  315. throw e.what();
  316. }
  317. }