resdataprovider.cpp
来自「能像Windows操作系统的资源管理器一样将资源按目录(文件夹文件)的形式组织起」· C++ 代码 · 共 458 行
CPP
458 行
// ResDataProvider.cpp: implementation of the CResDataProvider class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resExplorer.h"
#include "ResDataProvider.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CResDataProvider::CResDataProvider()
{
m_displaySettingDOM=NULL;
//获取主程序所在路径,存在sPath中
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
CString tmpStr=sPath+"\\setting\\display.xml";
if(!LoadDispalySetting(tmpStr)){
AfxMessageBox("显示配置文件加载失败");
}
}
CResDataProvider::~CResDataProvider()
{
}
MSXML::IXMLDOMElement * CResDataProvider::GetChildren(CString id)
{
MSXML::IXMLDOMDocument* document = NULL;
MSXML::IXMLDOMParseError* parseError = NULL;
MSXML::IXMLDOMElement* element = NULL;
CString xmlStr;
xmlStr="";
xmlStr+="<tree>";
int i;
for(i=1;i<=10;i++){
CString s;
s.Format("<item text=\"资源目录%i(%s)\" pid=\"%s\" id=\"%s:%i\" icon=\"folder\"/>",i,id,id,id,i);
xmlStr+=s;
}
xmlStr+="</tree>";
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)) {
return FALSE;
}
hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
MSXML::IID_IXMLDOMDocument, (LPVOID*)&document);
if (!document) {
return FALSE;
}
BSTR bstr = NULL;
document->put_async(VARIANT_FALSE);
bstr = xmlStr.AllocSysString();
VARIANT_BOOL varOkay = document->loadXML(bstr);
SysFreeString(bstr);
if (varOkay) {
hr = document->get_documentElement(&element);
//document->getElementsByTagName("tree");
if (FAILED(hr) || element == NULL) {
AfxMessageBox(_T("Error Loading XML"));
return FALSE;
}
//AfxMessageBox(CString((char *)(element->Getxml())));
return element;
} else {
long line, linePos;
BSTR reason = NULL;
document->get_parseError(&parseError);
parseError->get_errorCode(&hr);
parseError->get_line(&line);
parseError->get_linepos(&linePos);
parseError->get_reason(&reason);
CString strMsg;
strMsg.Format(_T("Error 0x%.8X on line %d, position %d\r\nReason: %s"),
hr, line, linePos, CString(reason));
AfxMessageBox(strMsg);
SysFreeString(reason);
return FALSE;
}
return FALSE;
}
MSXML::IXMLDOMElement * CResDataProvider::GetResLibs()
{
MSXML::IXMLDOMDocument* document = NULL;
MSXML::IXMLDOMParseError* parseError = NULL;
MSXML::IXMLDOMElement* element = NULL;
CString xmlStr;
xmlStr="";
xmlStr+="<tree>";
xmlStr+="<item text=\"语文资源库\" pid=\"root\" id=\"ywlib\" icon=\"disk\"/>";
xmlStr+="<item text=\"英语资源库\" pid=\"root\" id=\"enlib\" icon=\"disk\"/>";
xmlStr+="<item text=\"数学资源库\" pid=\"root\" id=\"sxlib\" icon=\"disk\"/>";
xmlStr+="<item text=\"物理资源库\" pid=\"root\" id=\"wllib\" icon=\"disk\"/>";
xmlStr+="<item text=\"化学资源库\" pid=\"root\" id=\"hxlib\" icon=\"disk\"/>";
xmlStr+="</tree>";
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)) {
return FALSE;
}
hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
MSXML::IID_IXMLDOMDocument, (LPVOID*)&document);
if (!document) {
return FALSE;
}
BSTR bstr = NULL;
document->put_async(VARIANT_FALSE);
bstr = xmlStr.AllocSysString();
VARIANT_BOOL varOkay = document->loadXML(bstr);
SysFreeString(bstr);
if (varOkay) {
hr = document->get_documentElement(&element);
//document->getElementsByTagName("tree");
if (FAILED(hr) || element == NULL) {
AfxMessageBox(_T("Error Loading XML"));
return FALSE;
}
//AfxMessageBox(CString((char *)(element->Getxml())));
return element;
} else {
long line, linePos;
BSTR reason = NULL;
document->get_parseError(&parseError);
parseError->get_errorCode(&hr);
parseError->get_line(&line);
parseError->get_linepos(&linePos);
parseError->get_reason(&reason);
CString strMsg;
strMsg.Format(_T("Error 0x%.8X on line %d, position %d\r\nReason: %s"),
hr, line, linePos, CString(reason));
AfxMessageBox(strMsg);
SysFreeString(reason);
return FALSE;
}
return FALSE;
}
CString CResDataProvider::GetFilePathByID(CString id)
{
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
CString tmpStr=sPath+"\\test\\test.doc";
return tmpStr;
}
int CResDataProvider::GetDispalySetting(CString id)
{
int defaultvalue=4;
if(this->m_displaySettingDOM==NULL){
return defaultvalue;
}
MSXML::IXMLDOMNodeListPtr pNodeList;
pNodeList=this->m_displaySettingDOM->getElementsByTagName("item");
long count=pNodeList->Getlength();
for(int i=0;i<count;i++){
MSXML::IXMLDOMNodePtr pNode=pNodeList->Getitem(i);
MSXML::IXMLDOMNamedNodeMap* namedNodeMap = NULL;
HRESULT hr = S_OK;
hr = pNode->get_attributes(&namedNodeMap);
if (SUCCEEDED(hr) && namedNodeMap != NULL) {
MSXML::IXMLDOMNodePtr pIDNode=namedNodeMap->getNamedItem("id");
BSTR tmpID;
hr=pIDNode->get_text(&tmpID);
MSXML::IXMLDOMNodePtr pStateNode=namedNodeMap->getNamedItem("state");
BSTR tmpState;
hr=pStateNode->get_text(&tmpState);
if(CString(tmpID)==id){
CString strState((_com_util::ConvertBSTRToString(pStateNode->text)));
return atoi(strState);
}
}
}
return defaultvalue;
}
BOOL CResDataProvider::SetDispalySetting(CString id, int state)
{
if(this->m_displaySettingDOM==NULL){
return false;
}
MSXML::IXMLDOMNodeListPtr pNodeList;
pNodeList=this->m_displaySettingDOM->getElementsByTagName("item");
long count=pNodeList->Getlength();
for(int i=0;i<count;i++){
MSXML::IXMLDOMNodePtr pNode=pNodeList->Getitem(i);
MSXML::IXMLDOMNamedNodeMap* namedNodeMap = NULL;
HRESULT hr = S_OK;
hr = pNode->get_attributes(&namedNodeMap);
if (SUCCEEDED(hr) && namedNodeMap != NULL) {
MSXML::IXMLDOMNodePtr pIDNode=namedNodeMap->getNamedItem("id");
BSTR tmpID;
hr=pIDNode->get_text(&tmpID);
MSXML::IXMLDOMNodePtr pStateNode=namedNodeMap->getNamedItem("state");
BSTR tmpState;
hr=pStateNode->get_text(&tmpState);
if(CString(tmpID)==id){
BSTR bstr = NULL;
CString s;
s.Format("%i",state);
bstr = s.AllocSysString();
pStateNode->text=(bstr);
SysFreeString(bstr);
return true;
}
}
}
//如果还未设置,添加一新的设置
//MSXML::IXMLDOMNodePtr pNode=m_displaySettingDOM->createNode("element","item");
//MSXML::IXMLDOMNodePtr pIDNode=m_displaySettingDOM->createAttribute("id");
CString xmlStr;
xmlStr="";
xmlStr+="<setting>";
CString s;
s.Format("%i",state);
xmlStr+="<item id=\"" + id + "\" state=\"" + s + "\"/>";
xmlStr+="</setting>";
MSXML::IXMLDOMDocument* tmpDOM;
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)) {
// return FALSE;
}
hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
MSXML::IID_IXMLDOMDocument, (LPVOID*)&tmpDOM);
if (!tmpDOM) {
// return FALSE;
}
tmpDOM->put_async(VARIANT_FALSE);
BSTR bstr = NULL;
bstr = xmlStr.AllocSysString();
//AfxMessageBox(CString(bstr));
VARIANT_BOOL varOkay = tmpDOM->loadXML(bstr);
SysFreeString(bstr);
MSXML::IXMLDOMNodePtr pNode=tmpDOM->GetfirstChild();
MSXML::IXMLDOMNodePtr pItemNode=pNode->GetfirstChild();
//AfxMessageBox(pItemNode->xml);
// AfxMessageBox("bstr");
m_displaySettingDOM->GetfirstChild()->appendChild(pItemNode);
return true;
}
BOOL CResDataProvider::LoadDispalySetting(const CString &strFileName)
{
MSXML::IXMLDOMDocument* document = NULL;
MSXML::IXMLDOMParseError* parseError = NULL;
MSXML::IXMLDOMElement* element = NULL;
CString xmlStr;
xmlStr="";
xmlStr+="<setting>";
/*
xmlStr+="<item text=\"语文资源库\" pid=\"root\" id=\"ywlib\" icon=\"disk\"/>";
xmlStr+="<item text=\"英语资源库\" pid=\"root\" id=\"enlib\" icon=\"disk\"/>";
xmlStr+="<item text=\"数学资源库\" pid=\"root\" id=\"sxlib\" icon=\"disk\"/>";
xmlStr+="<item text=\"物理资源库\" pid=\"root\" id=\"wllib\" icon=\"disk\"/>";
xmlStr+="<item text=\"化学资源库\" pid=\"root\" id=\"hxlib\" icon=\"disk\"/>";
*/
xmlStr+="</setting>";
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)) {
return FALSE;
}
hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
MSXML::IID_IXMLDOMDocument, (LPVOID*)&document);
if (!document) {
return FALSE;
}
BSTR bstr = NULL;
document->put_async(VARIANT_FALSE);
bstr = strFileName.AllocSysString();
VARIANT_BOOL varOkay = document->load(bstr);
SysFreeString(bstr);
if (varOkay) {
hr = document->get_documentElement(&element);
//document->getElementsByTagName("tree");
if (FAILED(hr) || element == NULL) {
AfxMessageBox(_T("Error Loading XML"));
return FALSE;
}
m_displaySettingDOM=document;
//AfxMessageBox(CString((char *)(element->Getxml())));
return true;
} else {
long line, linePos;
BSTR reason = NULL;
document->get_parseError(&parseError);
parseError->get_errorCode(&hr);
parseError->get_line(&line);
parseError->get_linepos(&linePos);
parseError->get_reason(&reason);
CString strMsg;
strMsg.Format(_T("Error 0x%.8X on line %d, position %d\r\nReason: %s"),
hr, line, linePos, CString(reason));
AfxMessageBox(strMsg);
SysFreeString(reason);
return FALSE;
}
return FALSE;
}
BOOL CResDataProvider::SaveDispalySetting(const CString &strFileName)
{
this->m_displaySettingDOM->save(&_variant_t(strFileName));
return true;
}
BOOL CResDataProvider::SaveSetting()
{
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
CString tmpStr=sPath+"\\setting\\display.xml";
SaveDispalySetting(tmpStr);
return true;
}
MSXML::IXMLDOMElement * CResDataProvider::GetChildrenList(CString id)
{
MSXML::IXMLDOMDocument* document = NULL;
MSXML::IXMLDOMParseError* parseError = NULL;
MSXML::IXMLDOMElement* element = NULL;
CString xmlStr;
xmlStr="";
xmlStr+="<list>";
int i;
for(i=1;i<=100;i++){
CString tmpStr;
tmpStr.Format("<item text=\"资源文件%i(%s)\" pid=\"%s\" id=\"%s:%i\" size=\"%i\" modifyTime=\"2003-6-7\" type=\"doc文件\" icon=\"xls\"/>",i,id,id,id,i,i);
xmlStr+=tmpStr;
}
xmlStr+="</list>";
HRESULT hr;
hr = CoInitialize(NULL);
if (FAILED(hr)) {
return FALSE;
}
hr =CoCreateInstance(MSXML::CLSID_DOMDocument, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
MSXML::IID_IXMLDOMDocument, (LPVOID*)&document);
if (!document) {
return FALSE;
}
BSTR bstr = NULL;
document->put_async(VARIANT_FALSE);
bstr = xmlStr.AllocSysString();
VARIANT_BOOL varOkay = document->loadXML(bstr);
SysFreeString(bstr);
if (varOkay) {
hr = document->get_documentElement(&element);
if (FAILED(hr) || element == NULL) {
AfxMessageBox(_T("Error Loading XML"));
return FALSE;
}
return element;
} else {
long line, linePos;
BSTR reason = NULL;
document->get_parseError(&parseError);
parseError->get_errorCode(&hr);
parseError->get_line(&line);
parseError->get_linepos(&linePos);
parseError->get_reason(&reason);
CString strMsg;
strMsg.Format(_T("Error 0x%.8X on line %d, position %d\r\nReason: %s"),
hr, line, linePos, CString(reason));
AfxMessageBox(strMsg);
SysFreeString(reason);
return FALSE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?