⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resdataprovidermodulemanager.cpp

📁 1)动态加载中间(2)规范化中间层接口 (3)解释本地文件系统(4)基于数据库的数据提供(5)数据库设计(6)优化数据提供逻辑(7)程序框架结构图
💻 CPP
字号:
// ResDataProvIDerModuleManager.cpp: implementation of the CResDataProvIDerModuleManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resExplorer.h"
#include "ResDataProvIDerModuleManager.h"
#include <direct.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CResDataProvIDerModuleManager::CResDataProvIDerModuleManager()
{
  LoadModles();
}

CResDataProvIDerModuleManager::~CResDataProvIDerModuleManager()
{
  UnLoadModles();
}

BOOL CResDataProvIDerModuleManager::LoadModles()
{//加载plugins目录下的所有中间层
       //获取主程序所在路径,存在sPath中
       CString sPath;
       GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
       sPath.ReleaseBuffer ();
       int nPos;
       nPos=sPath.ReverseFind ('\\');
       sPath=sPath.Left (nPos);
       CString strCurDir=sPath+"\\plugins\\";
		this->ModulePtrArray.RemoveAll();

	HANDLE hFind;
	CString strEx;

	WIN32_FIND_DATA wfd;
	if (_chdir(strCurDir) != 0){
		AfxMessageBox("目录:"+strCurDir+"未找到!");
        return false;
	}
	hFind = FindFirstFile(_T("*.*"),&wfd);
	if(hFind == INVALID_HANDLE_VALUE) return false;
	if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
		!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
	{//如果为非隐藏的目录
		if( wfd.cFileName[0] != '.' )
		{
			//wfd.cFileName
			_chdir(".."); // 查找完毕之后,返回上一级目录
		} 
	} 
	else
	{ 
		strEx = GetFileExName(wfd.cFileName);
		strEx.MakeUpper();
		if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
		{
			if (strEx == "DLL")
			{//如果为非隐藏的文件
  				ModulePtrArray.Add(new CResDataProvIDerModule(strCurDir+wfd.cFileName));	
				if(((CResDataProvIDerModule*)ModulePtrArray[ModulePtrArray.GetSize()-1])->Create()){
				}else{
				   AfxMessageBox("plugins未加载:"+strCurDir+wfd.cFileName+"!");
				}
			}
		}
	} 
	while(FindNextFile(hFind, &wfd)) 
	{ 
		if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
			!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
		{//如果为非隐藏的目录
			if( wfd.cFileName[0] != '.' )
			{
				_chdir(".."); // 查找完毕之后,返回上一级目录
			} 
		} 
		else
		{ 
			strEx = GetFileExName(wfd.cFileName);
			strEx.MakeUpper();
			if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
			{//如果为非隐藏的文件
				if (strEx == "DLL")
				{  //加载改目录下扩展名为DLL的中间层文件
  					ModulePtrArray.Add(new CResDataProvIDerModule(strCurDir+wfd.cFileName));	
					if(((CResDataProvIDerModule*)ModulePtrArray[ModulePtrArray.GetSize()-1])->Create()){
					}else{
					   AfxMessageBox("plugins未加载:"+strCurDir+wfd.cFileName+"!");
					}
				}
			}
		} 
	} 
	FindClose(hFind);
    return true;
}

BOOL CResDataProvIDerModuleManager::UnLoadModles()
{ //卸载中间层
    int max=ModulePtrArray.GetSize();
	for(int i=0;i<max;i++){
      ((CResDataProvIDerModule*)ModulePtrArray[i])->Destroy();
	}
	return true;
}

CString CResDataProvIDerModuleManager::GetLibName(int nIndex)
{  //得到第nIndex个模块的名称   
       CString str= ((CResDataProvIDerModule*)ModulePtrArray[nIndex])->GetLibName();
	   return str;
}
CString CResDataProvIDerModuleManager::GetLibID(int nIndex)
{//得到第nIndex个模块的ID号
       CString str= ((CResDataProvIDerModule*)ModulePtrArray[nIndex])->GetLibID();
	   return str;
}
CString CResDataProvIDerModuleManager::GetFileExName(TCHAR cFileName[])
{	//得到文件扩展名
	CString strFileName,strFileExName;
	strFileName = (CString)cFileName;
	strFileExName.Empty();
	for (int i=strFileName.GetLength()-1; i>=0; i--)
	{
		if (strFileName.GetAt(i) != '.')
			strFileExName = strFileName.GetAt(i) + strFileExName;
		else
			return strFileExName;
	}
	return strFileExName;
}



MSXML::IXMLDOMElement * CResDataProvIDerModuleManager::GetChildren(CString ID)
{
   MSXML::IXMLDOMElement * ResultDom;
   ResultDom=NULL;
   //分析与ID相关的特征字符串
   CString libID=(ID.Left(ID.Find(":")));
   if(libID==""){
      libID=ID;
   }
   int max=ModulePtrArray.GetSize();
   for(int i=0;i<max;i++){
	   if(libID==GetLibID(i)){
		  //如果在加载的中间层中发现有库标识号
		 //与现有资源目录ID特征字符相同的资源库模块
		 //则调用该模块函数功能
          ResultDom=((CResDataProvIDerModule*)ModulePtrArray[i])->GetChildren(ID);
		  break;
	   }
   }
   //如果为找到合适的模块,返回NULL
   return ResultDom ;
}
//返回合适的资源库中与ID相关的目录中的文件XML数据包的函数
MSXML::IXMLDOMElement * CResDataProvIDerModuleManager::GetChildrenList(CString ID)
{
   MSXML::IXMLDOMElement * ResultDom;
   ResultDom=NULL;
   //分析与ID相关的特征字符串
   CString libID=(ID.Left(ID.Find(":")));
   if(libID==""){
      libID=ID;
   }
   int max=ModulePtrArray.GetSize();
   for(int i=0;i<max;i++){
	   if(libID==GetLibID(i)){
		 //如果在加载的中间层中发现有库标识号
		 //与现有资源目录ID特征字符相同的资源库模块
		 //则调用该模块函数功能
          ResultDom=((CResDataProvIDerModule*)ModulePtrArray[i])->GetChildrenList(ID);
		  break;
	   }
   }
   //如果未找到合适的模块,返回NULL
   return ResultDom ;
}

CString CResDataProvIDerModuleManager::GetFilePathByID(CString ID)
{
   CString ResultString;
   //分析与ID相关的特征字符串
   ResultString="";
   CString libID=(ID.Left(ID.Find(":")));
   if(libID==""){
      libID=ID;
   }
   int max=ModulePtrArray.GetSize();
   for(int i=0;i<max;i++){
	   if(libID==GetLibID(i)){
		 //如果在加载的中间层中发现有库标识号
		 //与现有资源目录ID特征字符相同的资源库模块
		 //则调用该模块函数功能
         ResultString=((CResDataProvIDerModule*)ModulePtrArray[i])->GetFilePathByID(ID);
		  break;
	   }
   }
   //如果未找到合适的模块,返回NULL
   return ResultString ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -