libContactlessCardLoader.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. // libContactlessCardLoader.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <Windows.h>
  5. #include < stdio.h >
  6. #include "libContactlessCardLoader.h"
  7. typedef ErrorCodeEnum(*DevAdaptObjCreateFunc)(DeviceBaseClass*& baseObj);
  8. typedef ErrorCodeEnum(*DevAdaptObjReleaseFunc)(DeviceBaseClass*& pBaseObj);
  9. HINSTANCE hinstLib = NULL;
  10. DevAdaptObjCreateFunc pFuncCreateAdapt = NULL;
  11. DevAdaptObjReleaseFunc pFuncReleaseAdapt = NULL;
  12. RFICClass* pDevAdapterInstance = NULL;
  13. struct DevErrorInfo errInfoInstance;
  14. void SetLastErrInfo(const char* formatStr, ...)
  15. {
  16. va_list arg;
  17. va_start(arg, formatStr);
  18. vsprintf_s(errInfoInstance.szErrMsg, MAX_DEV_ERROR_MSG_LEN, formatStr, arg);
  19. errInfoInstance.dwErrMsgLen = strlen(errInfoInstance.szErrMsg);
  20. va_end(arg);
  21. }
  22. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_LoadDevObject(const char* libraryPath)
  23. {
  24. ErrorCodeEnum erroCode;
  25. hinstLib = LoadLibraryA(libraryPath);
  26. if (hinstLib != NULL) {
  27. pFuncCreateAdapt = (DevAdaptObjCreateFunc)GetProcAddress(hinstLib, "CreateDevComponent");
  28. if (NULL == pFuncCreateAdapt) {
  29. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:GetProcAddress for CreateDevComponent\"}", GetLastError(), __FUNCTION__, __LINE__);
  30. FreeLibrary(hinstLib);
  31. pFuncCreateAdapt = NULL;
  32. pFuncReleaseAdapt = NULL;
  33. return Error_MisMatched;
  34. }
  35. pFuncReleaseAdapt = (DevAdaptObjReleaseFunc)GetProcAddress(hinstLib, "ReleaseDevComponent");
  36. if (NULL == pFuncCreateAdapt) {
  37. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:GetProcAddress for ReleaseDevComponent\"}", GetLastError(), __FUNCTION__, __LINE__);
  38. FreeLibrary(hinstLib);
  39. pFuncCreateAdapt = NULL;
  40. pFuncReleaseAdapt = NULL;
  41. return Error_NotIntegrated;
  42. }
  43. erroCode = pFuncCreateAdapt((DeviceBaseClass*&)pDevAdapterInstance);
  44. if (erroCode != Error_Succeed) {
  45. SetLastErrInfo("{\"ErrCode\":%u, \"RetCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:pFuncCreateAdapt for AdapterObject\"}", GetLastError(), erroCode, __FUNCTION__, __LINE__);
  46. pDevAdapterInstance = NULL;
  47. FreeLibrary(hinstLib);
  48. pFuncCreateAdapt = NULL;
  49. pFuncReleaseAdapt = NULL;
  50. return Error_NoTarget;
  51. }
  52. if (pDevAdapterInstance == NULL) {
  53. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:pFuncCreateAdapt return Null AdapterObject\"}", GetLastError(), __FUNCTION__, __LINE__);
  54. FreeLibrary(hinstLib);
  55. pFuncCreateAdapt = NULL;
  56. pFuncReleaseAdapt = NULL;
  57. return Error_Null;
  58. }
  59. } else {
  60. SetLastErrInfo("{\"ErrCode\":%u, \"Description\":\"Func:%s,Line:%d,Msg:LoadLibraryA current adapter file failed\"}", GetLastError(), __FUNCTION__, __LINE__);
  61. return Error_DevLoadFileFailed;
  62. }
  63. return Error_Succeed;
  64. }
  65. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ReleaseDevObject()
  66. {
  67. if (pFuncReleaseAdapt != NULL && pDevAdapterInstance != NULL) {
  68. DeviceBaseClass* devBasePtr = static_cast<DeviceBaseClass*>(pDevAdapterInstance);
  69. pFuncReleaseAdapt(devBasePtr);
  70. pDevAdapterInstance = NULL;
  71. }
  72. if (hinstLib != NULL) {
  73. FreeLibrary(hinstLib);
  74. hinstLib = NULL;
  75. }
  76. return Error_Succeed;
  77. }
  78. //////////////////////////////////////////////////////////////////////////
  79. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetDevCategory(DevCategoryInfo* pDevCategory)
  80. {
  81. ErrorCodeEnum result;
  82. if (pDevAdapterInstance == NULL) {
  83. return Error_NotInit;
  84. }
  85. DevCategoryInfo inner;
  86. memset(inner.szType, 0, sizeof(char) * MAX_DEV_TYPE_LEN);
  87. memset(inner.szModel, 0, sizeof(char) * MAX_DEV_MODEL_LEN);
  88. memset(inner.szVendor, 0, sizeof(char) * MAX_DEV_VENDOR_LEN);
  89. result = pDevAdapterInstance->GetDevCategory(inner);
  90. if (result == Error_Succeed) {
  91. memset(pDevCategory->szType, 0, sizeof(char) * MAX_DEV_TYPE_LEN);
  92. memset(pDevCategory->szModel, 0, sizeof(char) * MAX_DEV_MODEL_LEN);
  93. memset(pDevCategory->szVendor, 0, sizeof(char) * MAX_DEV_VENDOR_LEN);
  94. strncpy_s(pDevCategory->szType, MAX_DEV_TYPE_LEN, inner.szType, strlen(inner.szType) > MAX_DEV_TYPE_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szType));
  95. strncpy_s(pDevCategory->szModel, MAX_DEV_MODEL_LEN, inner.szModel, strlen(inner.szModel) > MAX_DEV_MODEL_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szModel));
  96. strncpy_s(pDevCategory->szVendor, MAX_DEV_VENDOR_LEN, inner.szVendor, strlen(inner.szVendor) > MAX_DEV_VENDOR_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szVendor));
  97. pDevCategory->eState = inner.eState;
  98. pDevCategory->version.wMajor = inner.version.wMajor;
  99. pDevCategory->version.wMinor = inner.version.wMinor;
  100. pDevCategory->version.wRevision = inner.version.wRevision;
  101. pDevCategory->version.wBuild = inner.version.wBuild;
  102. }
  103. return result;
  104. }
  105. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_Reset()
  106. {
  107. if (pDevAdapterInstance == NULL) {
  108. return Error_NotInit;
  109. }
  110. return pDevAdapterInstance->Reset();
  111. }
  112. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DevClose()
  113. {
  114. if (pDevAdapterInstance == NULL) {
  115. return Error_NotInit;
  116. }
  117. return pDevAdapterInstance->DevClose();
  118. }
  119. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetLastErr(DevErrorInfo* pDevErrInfo)
  120. {
  121. if (pDevAdapterInstance == NULL) {
  122. strcpy_s(pDevErrInfo->szErrMsg, MAX_DEV_ERROR_MSG_LEN, errInfoInstance.szErrMsg);
  123. pDevErrInfo->dwErrMsgLen = errInfoInstance.dwErrMsgLen;
  124. return Error_Succeed;
  125. }
  126. DevErrorInfo inner;
  127. ErrorCodeEnum result = pDevAdapterInstance->GetLastErr(inner);
  128. if (result == Error_Succeed) {
  129. memset(pDevErrInfo->szErrMsg, 0, sizeof(char) * MAX_DEV_ERROR_MSG_LEN);
  130. strncpy_s(pDevErrInfo->szErrMsg, MAX_DEV_ERROR_MSG_LEN, inner.szErrMsg, strlen(inner.szErrMsg) > MAX_DEV_ERROR_MSG_LEN - 1 ? MAX_DEV_ERROR_MSG_LEN - 1 : strlen(inner.szErrMsg));
  131. pDevErrInfo->dwErrMsgLen = inner.dwErrMsgLen;
  132. }
  133. return result;
  134. }
  135. //////////////////////////////////////////////////////////////////////////
  136. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DevOpen(DWORD dwPort, DWORD dwBaudRate)
  137. {
  138. if (pDevAdapterInstance == NULL) {
  139. return Error_NotInit;
  140. }
  141. return pDevAdapterInstance->DevOpen(dwPort, dwBaudRate);
  142. }
  143. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetDevStatus(Bridge_RFICReaderStatus* pDevStatus)
  144. {
  145. if (pDevAdapterInstance == NULL) {
  146. return Error_NotInit;
  147. }
  148. RFICReaderStatus inner;
  149. ErrorCodeEnum result = pDevAdapterInstance->GetDevStatus(inner);
  150. if (result == Error_Succeed) {
  151. pDevStatus->eMediaPos = inner.eMediaPos;
  152. }
  153. return result;
  154. }
  155. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_AbortRead()
  156. {
  157. if (pDevAdapterInstance == NULL) {
  158. return Error_NotInit;
  159. }
  160. return pDevAdapterInstance->AbortRead();
  161. }
  162. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ActiveContactlessICCard(char fstType, char scdType, char thdType, char* pOutType)
  163. {
  164. if (pDevAdapterInstance == NULL) {
  165. return Error_NotInit;
  166. }
  167. char inner;
  168. ErrorCodeEnum result = pDevAdapterInstance->ActiveContactlessICCard(fstType, scdType, thdType, inner);
  169. if (result == Error_Succeed) {
  170. *pOutType = inner;
  171. }
  172. return result;
  173. }
  174. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DeactContactlessICCard()
  175. {
  176. if (pDevAdapterInstance == NULL) {
  177. return Error_NotInit;
  178. }
  179. return pDevAdapterInstance->DeactContactlessICCard();
  180. }
  181. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_WarmReset()
  182. {
  183. if (pDevAdapterInstance == NULL) {
  184. return Error_NotInit;
  185. }
  186. return pDevAdapterInstance->WarmReset();
  187. }
  188. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_MifareCommand(int eFunType, Bridge_CmdInfo sendBuf, Bridge_CmdInfo* pRecvBuf)
  189. {
  190. if (pDevAdapterInstance == NULL) {
  191. return Error_NotInit;
  192. }
  193. CmdInfo inner_sendBuf;
  194. CmdInfo inner_recvBuf;
  195. inner_sendBuf.dwSize = sendBuf.dwSize;
  196. memcpy(inner_sendBuf.data, sendBuf.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
  197. ErrorCodeEnum result = pDevAdapterInstance->MifareCommand((MifareFuctionEnum)eFunType, inner_sendBuf, inner_recvBuf);
  198. if (result == Error_Succeed) {
  199. pRecvBuf->dwSize = inner_recvBuf.dwSize;
  200. memcpy(pRecvBuf->data, inner_recvBuf.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
  201. }
  202. return result;
  203. }
  204. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_RFTypeABCommand(Bridge_CmdInfo sendBuf, Bridge_CmdInfo* pRecvBuf)
  205. {
  206. if (pDevAdapterInstance == NULL) {
  207. return Error_NotInit;
  208. }
  209. CmdInfo inner_sendBuf;
  210. CmdInfo inner_recvBuf;
  211. inner_sendBuf.dwSize = sendBuf.dwSize;
  212. memcpy(inner_sendBuf.data, sendBuf.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
  213. ErrorCodeEnum result = pDevAdapterInstance->RFTypeABCommand(inner_sendBuf, inner_recvBuf);
  214. if (result == Error_Succeed) {
  215. pRecvBuf->dwSize = inner_recvBuf.dwSize;
  216. memcpy(pRecvBuf->data, inner_recvBuf.data, sizeof(BYTE) * MAX_IC_BUFFER_SIZE);
  217. }
  218. return result;
  219. }
  220. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_HaltCard()
  221. {
  222. if (pDevAdapterInstance == NULL) {
  223. return Error_NotInit;
  224. }
  225. return pDevAdapterInstance->HaltCard();
  226. }