工具管理----操作类介绍

操作类CToolBoxCtr是被主对话框调用的。所有的底层操作都是由CToolBoxCtr实现的。

功能:

     1、单例模式

    2、添加工具信息

    3、删除工具信息

    4、获取添加工具的图标信息。

    5、启动添加的工具

    6、初始化的时候,从配置文件读取上次添加的工具信息

    7、退出的时候,更新工具信息到配置文件里。

  1 #include "StdAfx.h"
  2 #include "ToolBoxCtr.h"
  3 
  4 // 单例模式
  5 CToolBoxCtr * CToolBoxCtr::m_pInstance = NULL;
  6 
  7 CToolBoxCtr::CToolBoxCtr(void)
  8 {
  9     m_toolFileInfoArray.RemoveAll();
 10 
 11     m_strWorkDir = GetCurrentFolder();
 12 
 13     m_strConfigFile.Format(_T("%s\\%s"), m_strWorkDir, TOOLBOXFILE);
 14 
 15     m_imageList.Create(32, 32, ILC_COLOR32, 0, 5);
 16     m_imageList.SetBkColor(DLG_BKCOLOR);
 17     ReadConfigFile();
 18 }
 19 
 20 CToolBoxCtr::~CToolBoxCtr(void)
 21 {
 22     SaveConfigFile();
 23     ClearToolFileInfoArray();
 24 }
 25 
 26 CToolBoxCtr * CToolBoxCtr::GetInstance()
 27 {
 28     if (NULL == m_pInstance)
 29     {
 30         m_pInstance = new CToolBoxCtr();
 31     }
 32 
 33     return m_pInstance;
 34 }
 35 
 36 void CToolBoxCtr::Destroy()
 37 {
 38     if (NULL != m_pInstance)
 39     {
 40         delete m_pInstance;
 41         m_pInstance = NULL;
 42     }
 43 }
 44 
 45 void CToolBoxCtr::ClearToolFileInfoArray()
 46 {
 47     for (int i = 0; i < m_toolFileInfoArray.GetCount(); i++)
 48     {
 49         delete m_toolFileInfoArray[i];
 50         m_toolFileInfoArray[i] = NULL;
 51     }
 52 
 53     m_toolFileInfoArray.RemoveAll();
 54 }
 55 
 56 // 读取工具信息
 57 void CToolBoxCtr::ReadConfigFile()
 58 {
 59     CStdioFile file;
 60 
 61     // 以只读模式打开
 62     if (!file.Open(m_strConfigFile, CFile::modeRead))
 63     {
 64          return;
 65     }
 66 
 67     CToolFileInfo * pToolFileInfo = NULL;
 68     CString strLine;
 69 
 70     while (file.ReadString(strLine))
 71     {
 72         strLine = strLine.Trim();
 73 
 74         // 注释,跳过
 75         if (strLine.IsEmpty()
 76             || 0 == strLine.Left(1).Compare(Comment_Flag))
 77         {
 78             continue;
 79         }
 80         else if (0 == strLine.Left(1).Compare(ToolInfoLeft_Flag)
 81                && 0 == strLine.Right(1).Compare(ToolInfoRight_Flag))
 82         {
 83             if (NULL != pToolFileInfo)
 84             {
 85                 m_toolFileInfoArray.Add(pToolFileInfo);
 86             }
 87             pToolFileInfo = new CToolFileInfo();
 88         }
 89         else if (NULL != pToolFileInfo)
 90         {
 91             int index = strLine.Find(_T("="));
 92 
 93             if (Not_Find != index)
 94             {
 95                 CString strLeft = strLine.Left(index).Trim();
 96                 CString strRight = strLine.Mid(index + 1).Trim();
 97 
 98                 if (strLeft.IsEmpty())
 99                 {
100                     continue;
101                 }
102 
103                 if (0 == strLeft.CompareNoCase(ToolInfoName))
104                 {
105                     pToolFileInfo->SetToolName(strRight);
106                 }
107                 else if (0 == strLeft.CompareNoCase(ToolInfoPath))
108                 {
109                     if (strRight.IsEmpty() || !PathFileExists(strRight))
110                     {
111                         delete pToolFileInfo;
112                         pToolFileInfo = NULL;
113                         continue;
114                     }
115                     pToolFileInfo->SetToolPath(strRight);
116                     GetFileIconFromPath(pToolFileInfo);
117                 }
118             }
119         }
120     }
121 
122     if (NULL != pToolFileInfo)
123     {
124         m_toolFileInfoArray.Add(pToolFileInfo);
125     }
126 
127     file.Close();
128 }
129 
130 void CToolBoxCtr::SaveConfigFile()
131 {
132     CStdioFile file;
133     if (!file.Open(m_strConfigFile, CFile::modeCreate | CFile::modeReadWrite))
134     {
135         return;
136     }
137 
138     CString strLine;
139 
140     for (int i = 0; i < m_toolFileInfoArray.GetCount(); i++)
141     {
142         strLine.Format(_T("[ToolInfo%d]\r\n"), i + 1);
143         file.WriteString(strLine);
144 
145         strLine.Format(_T("ToolName = %s\r\n"), m_toolFileInfoArray[i]->GetToolName());
146         file.WriteString(strLine);
147 
148         strLine.Format(_T("ToolPath = %s\r\n\r\n"), m_toolFileInfoArray[i]->GetToolPath());
149         file.WriteString(strLine);
150     }
151 
152     file.Close();
153 }
154 
155 CString CToolBoxCtr::GetCurrentFolder()
156 {
157     char szPath[_MAX_PATH] = {0};
158     GetModuleFileName(NULL, szPath, sizeof(szPath));
159 
160     char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
161     _splitpath_s(szPath, drive, dir, fname, ext);
162 
163     CString strPath;
164     strPath.Format(_T("%s\\%s"), drive, dir);
165 
166     return strPath;
167 }
168 
169 void CToolBoxCtr::GetFileIconFromPath(CToolFileInfo * pFileInfo)
170 {
171     if (NULL == pFileInfo)
172     {
173         return;
174     }
175 
176     CString strPath = pFileInfo->GetToolPath();
177     if (strPath.IsEmpty() || !PathFileExists(strPath))
178     {
179         return;
180     }
181 
182     SHFILEINFO stFileInfo;
183     :: SHGetFileInfo( strPath, 0, &stFileInfo, sizeof(stFileInfo), 
184                      SHGFI_ICON | SHGFI_LARGEICON | SHGFI_TYPENAME);
185     m_imageList.Add(stFileInfo.hIcon);
186 
187     if (IsExeType(stFileInfo.szTypeName))
188     {
189         pFileInfo->SetToolType(TToolType_Exe_Yes);
190     }
191     else
192     {
193         pFileInfo->SetToolType(TToolType_Exe_No);
194     }
195 
196 }
197 
198 BOOL CToolBoxCtr::IsExeType(CString strTypeName)
199 {
200     char szType[][20] = {_T("应用程序"), _T("Windows 批处理文件")};
201 
202     for (int i = 0; i < sizeof(szType)/sizeof(szType[0]); i++)
203     {
204         if (0 == strTypeName.CompareNoCase(szType[i]))
205         {
206             return TRUE;
207         }
208     }
209     return FALSE;
210 }
211 
212 void CToolBoxCtr::AddNewTool(CString strToolName, CString strToolPath)
213 {
214     if (strToolName.IsEmpty() 
215         || strToolPath.IsEmpty()
216         || !PathFileExists(strToolPath))
217     {
218         return;
219     }
220 
221     CToolFileInfo * PToolInfo = new CToolFileInfo;
222     PToolInfo->SetToolName(strToolName);
223     PToolInfo->SetToolPath(strToolPath);
224     GetFileIconFromPath(PToolInfo);
225 
226     m_toolFileInfoArray.Add(PToolInfo);
227 }
228 
229 CString CToolBoxCtr::GetToolNameFromPath(CString strPath)
230 {
231     char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
232     _splitpath_s(strPath, drive, dir, fname, ext);
233 
234     return fname;
235 }
236 
237 void CToolBoxCtr::RemoveTool(int nItem)
238 {
239     if (0 > nItem || nItem > m_toolFileInfoArray.GetCount()-1)
240     {
241         return;
242     }
243     delete m_toolFileInfoArray[nItem];
244     m_toolFileInfoArray[nItem] = NULL;
245     m_toolFileInfoArray.RemoveAt(nItem);
246     m_imageList.Remove(nItem);
247 }
248 
249 int CToolBoxCtr::RunToolFile(int index)
250 {
251     if (0 > index || index > m_toolFileInfoArray.GetCount()-1)
252     {
253         return RetCode_ExeRunFailed;
254     }
255 
256     CToolFileInfo *pFileInfo = m_toolFileInfoArray[index];
257 
258     if (NULL == pFileInfo)
259     {
260         return RetCode_ExeRunFailed;
261     }
262 
263     CString strCMD;
264     strCMD.Format(_T("\"%s\""), pFileInfo->GetToolPath());
265 
266     if (TToolType_Exe_Yes == pFileInfo->getToolType())
267     {
268         STARTUPINFO si;
269         PROCESS_INFORMATION pi;
270 
271         ZeroMemory( &si, sizeof(si) );
272         si.cb = sizeof(si);
273         ZeroMemory( &pi, sizeof(pi) );
274 
275         if (!CreateProcess(NULL, (LPSTR)(LPCTSTR)strCMD, NULL, NULL, FALSE, 0, NULL,
276             NULL, &si, &pi )) 
277         {
278             return RetCode_ExeRunFailed;
279         }
280     }
281     else
282     {
283         if (32 >= (int)ShellExecute(NULL, _T("open"), strCMD, NULL,
284                                     NULL, SW_SHOWNORMAL))
285         {
286             return RetCode_FileOpenFailed;
287         }
288     }
289 
290     return RetCode_OK;
291 
292 }

 

posted @ 2014-10-18 20:11  高山百川  阅读(299)  评论(0编辑  收藏  举报