|
@@ -0,0 +1,197 @@
|
|
|
+#ifndef _RVC_DEVICE_ADAPTER_ENTITY_BASE_H__
|
|
|
+#define _RVC_DEVICE_ADAPTER_ENTITY_BASE_H__
|
|
|
+
|
|
|
+#pragma once
|
|
|
+
|
|
|
+#include "SpHelper.h"
|
|
|
+#include "DeviceBaseClass.h"
|
|
|
+
|
|
|
+#define SAFE_FREE_LIBRARY(hModule) \
|
|
|
+ do { \
|
|
|
+ if(hModule){ \
|
|
|
+ FreeLibrary(hModule); \
|
|
|
+ hModule = NULL; \
|
|
|
+ } \
|
|
|
+ }while(0)
|
|
|
+
|
|
|
+using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pOutDevAptObj);
|
|
|
+using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pInDevAptObj);
|
|
|
+
|
|
|
+template <typename TSubAdpt>
|
|
|
+struct DevAdptLibHelper
|
|
|
+{
|
|
|
+ ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
|
|
|
+ {
|
|
|
+ ErrorCodeEnum erroCode = Error_Succeed;
|
|
|
+
|
|
|
+ do
|
|
|
+ {
|
|
|
+ hModule = LoadLibraryA(strFullLibPath);
|
|
|
+ if (hModule == NULL) {
|
|
|
+ DWORD tmpError = GetLastError();
|
|
|
+ Dbg("LoadLibraryA[%s] failed with error %u.", strFullLibPath, tmpError);
|
|
|
+ if (tmpError == 126) {
|
|
|
+ Dbg("该问题是缺失某个DLL导致的错误。");
|
|
|
+ SetLastError(126);
|
|
|
+ }
|
|
|
+ erroCode = Error_DevLoadFileFailed;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if ((pFuncCreateAdapt = (DevAdaptObjCreateFunc)GetProcAddress(hModule,
|
|
|
+ "CreateDevComponent")) == NULL) {
|
|
|
+ //TODO: SetCustLastErrorCode();
|
|
|
+ Dbg("Get 'CreateDevComponent' Func address failed with code %d", GetLastError());
|
|
|
+ erroCode = Error_DevLoadFileFailed;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if ((pFuncReleaseAdapt = (DevAdaptObjReleaseFunc)GetProcAddress(hModule,
|
|
|
+ "ReleaseDevComponent")) == NULL) {
|
|
|
+ Dbg("Get 'ReleaseDevComponent' Func address failed with code %d", GetLastError());
|
|
|
+ erroCode = Error_DevLoadFileFailed;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ } while (false);
|
|
|
+
|
|
|
+ if (IS_FAILURED(erroCode)) {
|
|
|
+ TearDown();
|
|
|
+ }
|
|
|
+
|
|
|
+ return erroCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum CreateDevAdptObject()
|
|
|
+ {
|
|
|
+ if (m_AdptObjPtr != nullptr) {
|
|
|
+ return Error_AlreadyExist;
|
|
|
+ }
|
|
|
+ if (hModule == nullptr || pFuncCreateAdapt == nullptr || pFuncReleaseAdapt == nullptr) {
|
|
|
+ return Error_NotInit;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum erroCode = Error_Succeed;
|
|
|
+ erroCode = pFuncCreateAdapt((DeviceBaseClass*&)m_AdptObjPtr);
|
|
|
+ if (IS_FAILURED(erroCode)) {
|
|
|
+ Dbg("Create device adapter object failed! EC=%s", SpStrError(erroCode));
|
|
|
+ return erroCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ LOG_ASSERT(m_AdptObjPtr != nullptr);
|
|
|
+
|
|
|
+ return Error_Succeed;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum TearDown()
|
|
|
+ {
|
|
|
+ if (m_AdptObjPtr != nullptr) {
|
|
|
+ m_AdptObjPtr->DevClose();
|
|
|
+ }
|
|
|
+ if (m_AdptObjPtr != nullptr && nullptr != pFuncReleaseAdapt) {
|
|
|
+ pFuncReleaseAdapt(0, m_AdptObjPtr);
|
|
|
+ m_AdptObjPtr = nullptr;
|
|
|
+ }
|
|
|
+ SAFE_FREE_LIBRARY(hModule);
|
|
|
+ }
|
|
|
+
|
|
|
+ TSubAdpt* operator ->() { return m_AdptObjPtr; }
|
|
|
+
|
|
|
+ DevAdptLibHelper()
|
|
|
+ :hModule(nullptr)
|
|
|
+ , pFuncCreateAdapt(nullptr), pFuncReleaseAdapt(nullptr)
|
|
|
+ , m_AdptObjPtr(nullptr)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+private:
|
|
|
+
|
|
|
+ HMODULE hModule;
|
|
|
+ DevAdaptObjCreateFunc pFuncCreateAdapt;
|
|
|
+ DevAdaptObjReleaseFunc pFuncReleaseAdapt;
|
|
|
+
|
|
|
+ TSubAdpt* m_AdptObjPtr;
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+class CDevAdptEntityBase : public CEntityBase
|
|
|
+{
|
|
|
+
|
|
|
+public:
|
|
|
+
|
|
|
+ CDevAdptEntityBase() :m_strLibName(true) {}
|
|
|
+
|
|
|
+ CSimpleStringA GetVendorLibName()
|
|
|
+ {
|
|
|
+ if (m_strLibName.IsNullOrEmpty()) {
|
|
|
+ ExtractVendorLibName(m_strLibName);
|
|
|
+ }
|
|
|
+ return m_strLibName;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum ExtractVendorLibFullPath(CSimpleStringA& csLibFullPath);
|
|
|
+
|
|
|
+private:
|
|
|
+
|
|
|
+ ErrorCodeEnum ExtractVendorLibName(CSimpleStringA& csLibName);
|
|
|
+
|
|
|
+private:
|
|
|
+
|
|
|
+ CSimpleStringA m_strLibName;
|
|
|
+};
|
|
|
+
|
|
|
+ErrorCodeEnum CDevAdptEntityBase::ExtractVendorLibName(CSimpleStringA& csLibName)
|
|
|
+{
|
|
|
+ CSmartPointer<IConfigInfo> spRootConfig;
|
|
|
+ ErrorCodeEnum erroCode = GetFunction()->OpenConfig(Config_Root, spRootConfig);
|
|
|
+
|
|
|
+ if (IS_SUCCEED(erroCode)) {
|
|
|
+ CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityName();
|
|
|
+ csLibName = GetEntityBase()->GetEntityName();
|
|
|
+ CSimpleStringA str;
|
|
|
+ spRootConfig->ReadConfigValue(strSection, "Vendor", str);
|
|
|
+ if (!str.IsNullOrEmpty()) {
|
|
|
+ csLibName += ".";
|
|
|
+ csLibName += str;
|
|
|
+ } else {
|
|
|
+ erroCode = Error_NotConfig;
|
|
|
+ }
|
|
|
+
|
|
|
+ str.Clear();
|
|
|
+ spRootConfig->ReadConfigValue(strSection, "Version", str);
|
|
|
+ if (!str.IsNullOrEmpty()) {
|
|
|
+ csLibName += ".";
|
|
|
+ csLibName += str;
|
|
|
+ }
|
|
|
+
|
|
|
+ str.Clear();
|
|
|
+ spRootConfig->ReadConfigValue(strSection, "Batch", str);
|
|
|
+ if (!str.IsNullOrEmpty()) {
|
|
|
+ csLibName += ".";
|
|
|
+ csLibName += str;
|
|
|
+ }
|
|
|
+
|
|
|
+ str = csLibName + ".dll";
|
|
|
+ csLibName = str;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //TODO: SetCustLastErrorCode();
|
|
|
+ }
|
|
|
+ return erroCode;
|
|
|
+}
|
|
|
+
|
|
|
+ErrorCodeEnum CDevAdptEntityBase::ExtractVendorLibFullPath(CSimpleStringA& csLibFullPath)
|
|
|
+{
|
|
|
+ CSimpleStringA strLibName = GetVendorLibName();
|
|
|
+ if (strLibName.IsNullOrEmpty()) {
|
|
|
+ return Error_Unexpect;
|
|
|
+ }
|
|
|
+
|
|
|
+ CSimpleStringA strDepPath;
|
|
|
+ GetFunction()->GetPath("Dep", strDepPath);
|
|
|
+ csLibFullPath = CSimpleStringA::Format("%s\\%s", (LPCTSTR)strDepPath, (LPCTSTR)strLibName);
|
|
|
+
|
|
|
+ return Error_Succeed;
|
|
|
+}
|
|
|
+
|
|
|
+#endif /*_RVC_DEVICE_ADAPTER_ENTITY_BASE_H__*/
|