idcer_impl.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. // dllmain.cpp : 定义 DLL 应用程序的入口点。
  2. #include "idcer_impl.h"
  3. #include "idcer_httpans.h"
  4. #include <cstring>
  5. #include <cstdio>
  6. #include "log4vendor.h"
  7. #include <path.h>
  8. typedef unsigned short UINT16;
  9. typedef unsigned char UINT8;
  10. //BMP图片生成功能
  11. #define w 102 //图片宽度
  12. #define h 126 //图片高度
  13. bool WriteBMP(char* img, const char* filename)
  14. {
  15. int l = (w * 3 + 3) / 4 * 4;
  16. int bmi[] = {
  17. l * h + 54,0,54,40,w,h,1 | 3 * 8 << 16,0,l * h,0,0,100,0 };
  18. FILE* fp = fopen(filename, "wb");
  19. if (!fp)
  20. {
  21. return false;
  22. }
  23. fprintf(fp, "BM");
  24. fwrite(&bmi, 52, 1, fp);
  25. fwrite(img, 1, l * h, fp);
  26. fclose(fp);
  27. return true;
  28. }
  29. bool GenerateBmpFile(string fileName)
  30. {
  31. string path;
  32. path = GetCurrentDirectory();
  33. if (path.length() == 0)
  34. return false;
  35. path = path + SPLIT_SLASH_STR + fileName;
  36. char img[w * h * 3];
  37. for (int i = 0; i < w * h * 3; i++)img[i] = rand() % 256;
  38. return WriteBMP(img, path.c_str());
  39. }
  40. #ifdef _MSC_VER
  41. char* ConvertGBKToUtf8(const char* gbk, int* n)
  42. {
  43. int len = MultiByteToWideChar(CP_ACP, 0, gbk, -1, NULL, 0);
  44. WCHAR* wszGBK = new WCHAR[len + 1];
  45. memset(wszGBK, 0, len * 2 + 2);
  46. MultiByteToWideChar(CP_ACP, 0, gbk, -1, wszGBK, len);
  47. len = WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  48. char* szUtf8 = new char[len + 1];
  49. memset(szUtf8, 0, len + 1);
  50. WideCharToMultiByte(CP_UTF8, 0, wszGBK, -1, szUtf8, len, NULL, NULL);
  51. delete[] wszGBK;
  52. *n = len - 1;
  53. return szUtf8;
  54. }
  55. void ConvertGBKToUtf8(std::string& str)
  56. {
  57. int len = 0;
  58. char* dst = ConvertGBKToUtf8(str.c_str(), &len);
  59. str = dst;
  60. delete[] dst;
  61. }
  62. #endif // _MSC_VER
  63. bool UTF8_to_UCS2(const UINT8* UINT8_code, UINT16* ucs2_code)
  64. {
  65. UINT16 temp1, temp2;
  66. bool is_unrecognized = false;
  67. UINT8* in = (UINT8*)UINT8_code;
  68. if (!UINT8_code || !ucs2_code)
  69. {
  70. return is_unrecognized;
  71. }
  72. while (*in != 0)
  73. {
  74. //1字节 0xxxxxxx
  75. //0x80=1000,0000,判断最高位是否为0,如果为0,那么是ASCII字符
  76. //不需要处理,直接拷贝即可
  77. if (0x00 == (*in & 0x80))
  78. {
  79. /* 1 byte UTF-8 Charater.*/
  80. *ucs2_code = *in;
  81. is_unrecognized = true;
  82. in += 1;
  83. }
  84. //2字节 110xxxxx 10xxxxxx
  85. //0xe0=1110,0000
  86. //0xc0=1100,0000
  87. else if (0xc0 == (*in & 0xe0) && 0x80 == (*(in + 1) & 0xc0))
  88. {
  89. /* 2 bytes UTF-8 Charater.*/
  90. //0x1f=0001,1111,获得第一个字节的后5位
  91. temp1 = (UINT16)(*in & 0x1f);
  92. //左移6位
  93. temp1 <<= 6;
  94. //0x3f=0011,1111,获得第二个字节的后6位
  95. //加上上面的5位一共有11位
  96. temp1 |= (UINT16)(*(in + 1) & 0x3f);
  97. *ucs2_code = temp1;
  98. is_unrecognized = true;
  99. in += 2;
  100. }
  101. //3字节 1110xxxx 10xxxxxx 10xxxxxx
  102. //中文要进入这一个分支
  103. else if (0xe0 == (*in & 0xf0) &&
  104. 0x80 == (*(in + 1) & 0xc0) &&
  105. 0x80 == (*(in + 2) & 0xc0)
  106. )
  107. {
  108. /* 3bytes UTF-8 Charater.*/
  109. //0x0f=0000,1111
  110. //取出第一个字节的低4位
  111. temp1 = (UINT16)(*in & 0x0f);
  112. temp1 <<= 12;
  113. //0x3f=0011,1111
  114. //取得第二个字节的低6位
  115. temp2 = (UINT16)(*(in + 1) & 0x3F);
  116. temp2 <<= 6;
  117. //取得第三个字节的低6位,最后组成16位
  118. temp1 = temp1 | temp2 | (UINT16)(*(in + 2) & 0x3F);
  119. *ucs2_code = temp1;
  120. //移动到下一个字符
  121. in += 3;
  122. is_unrecognized = true;
  123. }
  124. else
  125. {
  126. /* unrecognize byte. */
  127. *ucs2_code = 0x22e0;
  128. is_unrecognized = false;
  129. //直接退出循环
  130. break;
  131. }
  132. ucs2_code += 1;
  133. }
  134. return is_unrecognized;
  135. }
  136. ErrorCodeEnum IDCerClassImpl::ex2HttpFunction(IDCerInfoEx2& idCerInfoEx2)
  137. {
  138. IDCerDevAns idCerRet;
  139. ErrorCodeEnum resFlag = SimulatorHttpFunction(EntityName, "IDCerGetDataEx2", idCerRet);
  140. if (resFlag == Error_Succeed) {
  141. if (idCerRet.name.data.length() <= 0)
  142. {
  143. return Error_Unexpect;
  144. }
  145. #ifdef _MSC_VER
  146. ConvertGBKToUtf8(idCerRet.name.data);
  147. ConvertGBKToUtf8(idCerRet.sex.data);
  148. ConvertGBKToUtf8(idCerRet.nation.data);
  149. ConvertGBKToUtf8(idCerRet.birthday.data);
  150. ConvertGBKToUtf8(idCerRet.address.data);
  151. ConvertGBKToUtf8(idCerRet.idno.data);
  152. ConvertGBKToUtf8(idCerRet.department.data);
  153. ConvertGBKToUtf8(idCerRet.startDate.data);
  154. ConvertGBKToUtf8(idCerRet.endDate.data);
  155. ConvertGBKToUtf8(idCerRet.photoPath.data);
  156. ConvertGBKToUtf8(idCerRet.newAddress.data);
  157. ConvertGBKToUtf8(idCerRet.englishName.data);
  158. ConvertGBKToUtf8(idCerRet.nationality.data);
  159. ConvertGBKToUtf8(idCerRet.idVersion.data);
  160. ConvertGBKToUtf8(idCerRet.idType.data);
  161. ConvertGBKToUtf8(idCerRet.reserved.data);
  162. ConvertGBKToUtf8(idCerRet.txzCode.data);
  163. ConvertGBKToUtf8(idCerRet.issuedSN.data);
  164. ConvertGBKToUtf8(idCerRet.reserved2.data);
  165. ConvertGBKToUtf8(idCerRet.reserved3.data);
  166. ConvertGBKToUtf8(idCerRet.reserved4.data);
  167. ConvertGBKToUtf8(idCerRet.reserved5.data);
  168. #endif // _MSC_VER
  169. char name[1024]; memset(name, 0, 1024);
  170. std::strcpy(name, idCerRet.name.data.c_str());
  171. UTF8_to_UCS2((UINT8*)name, (UINT16*)idCerInfoEx2.name.data);
  172. idCerInfoEx2.name.dwSize = strlen(idCerInfoEx2.name.data);
  173. char sex[1024]; memset(sex, 0, 1024);
  174. std::strcpy(sex, idCerRet.sex.data.c_str());
  175. UTF8_to_UCS2((UINT8*)sex, (UINT16*)idCerInfoEx2.sex.data);
  176. idCerInfoEx2.sex.dwSize = strlen(idCerInfoEx2.sex.data);
  177. char nation[1024]; memset(nation, 0, 1024);
  178. std::strcpy(nation, idCerRet.nation.data.c_str());
  179. UTF8_to_UCS2((UINT8*)nation, (UINT16*)idCerInfoEx2.nation.data);
  180. idCerInfoEx2.nation.dwSize = strlen(idCerInfoEx2.nation.data);
  181. char birthday[1024]; memset(birthday, 0, 1024);
  182. std::strcpy(birthday, idCerRet.birthday.data.c_str());
  183. UTF8_to_UCS2((UINT8*)birthday, (UINT16*)idCerInfoEx2.birthday.data);
  184. idCerInfoEx2.birthday.dwSize = strlen(idCerInfoEx2.birthday.data);
  185. char address[1024]; memset(address, 0, 1024);
  186. std::strcpy(address, idCerRet.address.data.c_str());
  187. UTF8_to_UCS2((UINT8*)address, (UINT16*)idCerInfoEx2.address.data);
  188. idCerInfoEx2.address.dwSize = strlen(idCerInfoEx2.address.data);
  189. char idno[1024]; memset(idno, 0, 1024);
  190. std::strcpy(idno, idCerRet.idno.data.c_str());
  191. UTF8_to_UCS2((UINT8*)idno, (UINT16*)idCerInfoEx2.idno.data);
  192. idCerInfoEx2.idno.dwSize = strlen(idCerInfoEx2.idno.data);
  193. char department[1024]; memset(department, 0, 1024);
  194. std::strcpy(department, idCerRet.department.data.c_str());
  195. UTF8_to_UCS2((UINT8*)department, (UINT16*)idCerInfoEx2.department.data);
  196. idCerInfoEx2.department.dwSize = strlen(idCerInfoEx2.department.data);
  197. char startDate[1024]; memset(startDate, 0, 1024);
  198. std::strcpy(startDate, idCerRet.startDate.data.c_str());
  199. UTF8_to_UCS2((UINT8*)startDate, (UINT16*)idCerInfoEx2.startDate.data);
  200. idCerInfoEx2.startDate.dwSize = strlen(idCerInfoEx2.startDate.data);
  201. char endDate[1024]; memset(endDate, 0, 1024);
  202. std::strcpy(endDate, idCerRet.endDate.data.c_str());
  203. UTF8_to_UCS2((UINT8*)endDate, (UINT16*)idCerInfoEx2.endDate.data);
  204. idCerInfoEx2.endDate.dwSize = strlen(idCerInfoEx2.endDate.data);
  205. char photoPath[1024]; memset(photoPath, 0, 1024);
  206. std::strcpy(photoPath, idCerRet.photoPath.data.c_str());
  207. UTF8_to_UCS2((UINT8*)photoPath, (UINT16*)idCerInfoEx2.photoPath.data);
  208. idCerInfoEx2.photoPath.dwSize = strlen(idCerInfoEx2.photoPath.data);
  209. char newAddress[1024]; memset(newAddress, 0, 1024);
  210. std::strcpy(newAddress, idCerRet.newAddress.data.c_str());
  211. UTF8_to_UCS2((UINT8*)newAddress, (UINT16*)idCerInfoEx2.newAddress.data);
  212. idCerInfoEx2.newAddress.dwSize = strlen(idCerInfoEx2.newAddress.data);
  213. char englishname[1024]; memset(englishname, 0, 1024);
  214. std::strcpy(englishname, idCerRet.englishName.data.c_str());
  215. UTF8_to_UCS2((UINT8*)englishname, (UINT16*)idCerInfoEx2.englishName.data);
  216. idCerInfoEx2.englishName.dwSize = strlen(idCerInfoEx2.englishName.data);
  217. char nationality[1024]; memset(nationality, 0, 1024);
  218. std::strcpy(nationality, idCerRet.nationality.data.c_str());
  219. UTF8_to_UCS2((UINT8*)nationality, (UINT16*)idCerInfoEx2.nationality.data);
  220. idCerInfoEx2.nationality.dwSize = strlen(idCerInfoEx2.nationality.data);
  221. char idVersion[1024]; memset(idVersion, 0, 1024);
  222. std::strcpy(idVersion, idCerRet.idVersion.data.c_str());
  223. UTF8_to_UCS2((UINT8*)idVersion, (UINT16*)idCerInfoEx2.idVersion.data);
  224. idCerInfoEx2.idVersion.dwSize = strlen(idCerInfoEx2.idVersion.data);
  225. char idType[1024]; memset(idType, 0, 1024);
  226. std::strcpy(idType, idCerRet.idType.data.c_str());
  227. UTF8_to_UCS2((UINT8*)idType, (UINT16*)idCerInfoEx2.idType.data);
  228. idCerInfoEx2.idType.dwSize = strlen(idCerInfoEx2.idType.data);
  229. char reserved[1024]; memset(reserved, 0, 1024);
  230. std::strcpy(reserved, idCerRet.reserved.data.c_str());
  231. UTF8_to_UCS2((UINT8*)reserved, (UINT16*)idCerInfoEx2.reserved.data);
  232. idCerInfoEx2.reserved.dwSize = strlen(idCerInfoEx2.reserved.data);
  233. char txzCode[1024]; memset(txzCode, 0, 1024);
  234. std::strcpy(txzCode, idCerRet.txzCode.data.c_str());
  235. UTF8_to_UCS2((UINT8*)txzCode, (UINT16*)idCerInfoEx2.txzCode.data);
  236. idCerInfoEx2.txzCode.dwSize = strlen(idCerInfoEx2.txzCode.data);
  237. char issuedSN[1024]; memset(issuedSN, 0, 1024);
  238. std::strcpy(issuedSN, idCerRet.issuedSN.data.c_str());
  239. UTF8_to_UCS2((UINT8*)issuedSN, (UINT16*)idCerInfoEx2.issuedSN.data);
  240. idCerInfoEx2.issuedSN.dwSize = strlen(idCerInfoEx2.issuedSN.data);
  241. char reserved2[1024]; memset(reserved2, 0, 1024);
  242. std::strcpy(reserved2, idCerRet.reserved2.data.c_str());
  243. UTF8_to_UCS2((UINT8*)reserved2, (UINT16*)idCerInfoEx2.reserved2.data);
  244. idCerInfoEx2.reserved2.dwSize = strlen(idCerInfoEx2.reserved2.data);
  245. char reserved3[1024]; memset(reserved3, 0, 1024);
  246. std::strcpy(reserved3, idCerRet.reserved3.data.c_str());
  247. UTF8_to_UCS2((UINT8*)reserved3, (UINT16*)idCerInfoEx2.reserved3.data);
  248. idCerInfoEx2.reserved3.dwSize = strlen(idCerInfoEx2.reserved3.data);
  249. char reserved4[1024]; memset(reserved4, 0, 1024);
  250. std::strcpy(reserved4, idCerRet.reserved4.data.c_str());
  251. UTF8_to_UCS2((UINT8*)reserved4, (UINT16*)idCerInfoEx2.reserved4.data);
  252. idCerInfoEx2.reserved4.dwSize = strlen(idCerInfoEx2.reserved4.data);
  253. char reserved5[1024]; memset(reserved5, 0, 1024);
  254. std::strcpy(reserved5, idCerRet.reserved5.data.c_str());
  255. UTF8_to_UCS2((UINT8*)reserved5, (UINT16*)idCerInfoEx2.reserved5.data);
  256. idCerInfoEx2.reserved5.dwSize = strlen(idCerInfoEx2.reserved5.data);
  257. }
  258. return resFlag;
  259. }
  260. IDCerClassImpl::IDCerClassImpl()
  261. {
  262. }
  263. IDCerClassImpl::~IDCerClassImpl()
  264. {
  265. }
  266. ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo& devCategory)
  267. {
  268. ErrorCodeEnum err = Error_Succeed;
  269. SimulatorDevCategoryAns ans;
  270. err = SimulatorHttpFunction(EntityName, "GetDevCategory", ans);
  271. LOG4VTM(INFO, "GetDevCategory err = " << err);
  272. strcpy(devCategory.szType, ans.szType.c_str());
  273. strcpy(devCategory.szModel, ans.szModel.c_str());
  274. strcpy(devCategory.szVendor, ans.szVendor.c_str());
  275. devCategory.eState = (DevStateEnum)ans.eState;
  276. devCategory.version.wMajor = ans.version.wMajor;
  277. devCategory.version.wMinor = ans.version.wMinor;
  278. devCategory.version.wRevision = ans.version.wRevision;
  279. devCategory.version.wBuild = ans.version.wBuild;
  280. return err;
  281. }
  282. ErrorCodeEnum IDCerClassImpl::Reset()
  283. {
  284. ErrorCodeEnum err = Error_Succeed;
  285. err = SimulatorHttpFunction(EntityName, "Reset");
  286. LOG4VTM(INFO, "Reset err = " << err);
  287. return err;
  288. }
  289. ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
  290. {
  291. ErrorCodeEnum err = Error_Succeed;
  292. err = SimulatorHttpFunction(EntityName, "IDCerAuthenticate");
  293. LOG4VTM(INFO, "IDCerAuthenticate err = " << err);
  294. return err;
  295. }
  296. ErrorCodeEnum IDCerClassImpl::ForceIDEject()
  297. {
  298. ErrorCodeEnum err = Error_Succeed;
  299. err = SimulatorHttpFunction(EntityName, "ForceIDEject");
  300. LOG4VTM(INFO, "ForceIDEject err = " << err);
  301. return err;
  302. }
  303. ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
  304. {
  305. ErrorCodeEnum err = Error_NotImpl;
  306. err = SimulatorHttpFunction(EntityName, "ScanIDAndSaveImage");
  307. LOG4VTM(INFO, "ScanIDAndSaveImage err = " << err);
  308. /* if (err == Error_Succeed)
  309. {
  310. bool flag1 = GenerateBmpFile("idfront.bmp");
  311. bool flag2 = GenerateBmpFile("idback.bmp");
  312. if (!(flag1 & flag2))
  313. {
  314. err = Error_Bug;
  315. }
  316. }*/
  317. return err;
  318. }
  319. ErrorCodeEnum IDCerClassImpl::QueryCardPos(int& pos)
  320. {
  321. ErrorCodeEnum err = Error_Succeed;
  322. QueryCardPosAns ans;
  323. err = SimulatorHttpFunction(EntityName, "QueryCardPos", ans);
  324. LOG4VTM(INFO, "QueryCardPos err = " << err);
  325. pos = ans.pos;
  326. return err;
  327. }
  328. ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
  329. {
  330. ErrorCodeEnum err = Error_Succeed;
  331. err = SimulatorHttpFunction(EntityName, "IDCerRFControl");
  332. LOG4VTM(INFO, "IDCerRFControl err = " << err);
  333. return err;
  334. }
  335. ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
  336. {
  337. ErrorCodeEnum err = Error_Succeed;
  338. err = SimulatorHttpFunction(EntityName, "DevOpen");
  339. LOG4VTM(INFO, "DevOpen err = " << err);
  340. return err;
  341. }
  342. ErrorCodeEnum IDCerClassImpl::DevClose()
  343. {
  344. ErrorCodeEnum err = Error_Succeed;
  345. err = SimulatorHttpFunction(EntityName, "DevClose");
  346. LOG4VTM(INFO, "DevClose err = " << err);
  347. return err;
  348. }
  349. ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo& idCerInfo)
  350. {
  351. ErrorCodeEnum err = Error_Succeed;
  352. memset(&idCerInfo, 0, sizeof(IDCerInfo));
  353. strcpy(idCerInfo.startDate.data, "2009.03.25");
  354. idCerInfo.startDate.dwSize = strlen("2009.03.25");
  355. strcpy(idCerInfo.endDate.data, "2029.03.24");
  356. idCerInfo.endDate.dwSize = strlen("2029.03.24");
  357. return err;
  358. }
  359. ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx& idCerInfoEx)
  360. {
  361. ErrorCodeEnum err = Error_Succeed;
  362. memset(&idCerInfoEx, 0, sizeof(IDCerInfo));
  363. strcpy(idCerInfoEx.startDate.data, "2009.03.25");
  364. idCerInfoEx.startDate.dwSize = strlen("2009.03.25");
  365. strcpy(idCerInfoEx.endDate.data, "2029.03.24");
  366. idCerInfoEx.endDate.dwSize = strlen("2029.03.24");
  367. return err;
  368. }
  369. ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx2(IDCerInfoEx2& idCerInfoEx2)
  370. {
  371. ErrorCodeEnum err = Error_Succeed;
  372. memset(&idCerInfoEx2, 0, sizeof(IDCerInfoEx2));
  373. err = ex2HttpFunction(idCerInfoEx2);
  374. /*bool flag = GenerateBmpFile("zp.bmp");
  375. if (!flag)
  376. {
  377. err = Error_Bug;
  378. }*/
  379. LOG4VTM(INFO, "IDCerGetDataEx2 err = " << err);
  380. return err;
  381. }
  382. ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo& devErrInfo)
  383. {
  384. ErrorCodeEnum err = Error_Succeed;
  385. SimulatorDevErrInfoAns ans;
  386. err = SimulatorHttpFunction(EntityName, "GetLastErr", ans);
  387. LOG4VTM(INFO, "GetLastErr err = " << err);
  388. devErrInfo.dwErrMsgLen = ans.dwErrMsgLen;
  389. strcpy(devErrInfo.szErrMsg, ans.szErrMsg.c_str());
  390. return err;
  391. }
  392. #ifdef _MSC_VER
  393. BOOL APIENTRY DllMain(HMODULE hModule,
  394. DWORD ul_reason_for_call,
  395. LPVOID lpReserved
  396. )
  397. {
  398. switch (ul_reason_for_call)
  399. {
  400. case DLL_PROCESS_ATTACH:
  401. case DLL_THREAD_ATTACH:
  402. case DLL_THREAD_DETACH:
  403. case DLL_PROCESS_DETACH:
  404. break;
  405. }
  406. return TRUE;
  407. }
  408. #endif // _MSC_VER
  409. DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass*& pBaseObj)
  410. {
  411. pBaseObj = new IDCerClassImpl();
  412. if (pBaseObj == NULL)
  413. return Error_Resource;
  414. cmb::log_init_config config;
  415. config.dev_name = "vendor_IDCertificate";
  416. #ifdef _MSC_VER
  417. config.log_dir = ("D:\\rvc\\dbg\\");
  418. #else
  419. config.log_dir = ("/opt/rvc/dbg/");
  420. #endif
  421. std::string str;
  422. cmb::log4vendor::init(config, str);
  423. std::string tmpStr = GetSimulatorUrl();
  424. LOG4VTM(INFO, "URL = " << tmpStr.c_str());
  425. return Error_Succeed;
  426. }
  427. DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass*& pBaseObj)
  428. {
  429. if (pBaseObj == NULL)
  430. return Error_Param;
  431. IDCerClassImpl* pTmp = (IDCerClassImpl*)(pBaseObj);
  432. delete pTmp;
  433. pTmp = NULL;
  434. pBaseObj = NULL;
  435. return Error_Succeed;
  436. }
  437. #ifdef NEWER_COMPILER_WORKAROUNDS
  438. DEVICEBASE_API ErrorCodeEnum GetDevAdapterVersion(DevSoftVersion& retVesion)
  439. {
  440. retVesion.wMajor = retVesion.wMinor = retVesion.wBuild = retVesion.wRevision = 0;
  441. return Error_Succeed;
  442. }
  443. #endif // NEWER_COMPILER_WORKAROUNDS