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

网格计算

开发平台:

Visual C++

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