📄 resdataprovidermodulemanager.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 + -