SetupDlg.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:10k
源码类别:

图形图象

开发平台:

Visual C++

  1. // SetupDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include <shlobj.h>
  5. #include "..publicgol_isee.h"
  6. #include "Setup.h"
  7. #include "SetupDlg.h"
  8. #include "IRWERegTabFunction.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CAboutDlg dialog used for App About
  16. class CAboutDlg : public CDialog
  17. {
  18. public:
  19. CAboutDlg();
  20. // Dialog Data
  21. //{{AFX_DATA(CAboutDlg)
  22. enum { IDD = IDD_ABOUTBOX };
  23. //}}AFX_DATA
  24. // ClassWizard generated virtual function overrides
  25. //{{AFX_VIRTUAL(CAboutDlg)
  26. protected:
  27. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  28. //}}AFX_VIRTUAL
  29. // Implementation
  30. protected:
  31. //{{AFX_MSG(CAboutDlg)
  32. //}}AFX_MSG
  33. DECLARE_MESSAGE_MAP()
  34. };
  35. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  36. {
  37. //{{AFX_DATA_INIT(CAboutDlg)
  38. //}}AFX_DATA_INIT
  39. }
  40. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  41. {
  42. CDialog::DoDataExchange(pDX);
  43. //{{AFX_DATA_MAP(CAboutDlg)
  44. //}}AFX_DATA_MAP
  45. }
  46. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  47. //{{AFX_MSG_MAP(CAboutDlg)
  48. // No message handlers
  49. //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CSetupDlg dialog
  53. CSetupDlg::CSetupDlg(CWnd* pParent /*=NULL*/)
  54. : CDialog(CSetupDlg::IDD, pParent)
  55. {
  56. //{{AFX_DATA_INIT(CSetupDlg)
  57. // NOTE: the ClassWizard will add member initialization here
  58. //}}AFX_DATA_INIT
  59. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  60. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  61. }
  62. void CSetupDlg::DoDataExchange(CDataExchange* pDX)
  63. {
  64. CDialog::DoDataExchange(pDX);
  65. //{{AFX_DATA_MAP(CSetupDlg)
  66. DDX_Control(pDX, IDOK, m_OK);
  67. DDX_Control(pDX, IDC_OPR, m_Opr);
  68. DDX_Control(pDX, IDC_EDIT, m_Edit);
  69. DDX_Control(pDX, IDC_DIR, m_Dir);
  70. DDX_Control(pDX, ID_PROGRESS, m_Progress);
  71. //}}AFX_DATA_MAP
  72. }
  73. BEGIN_MESSAGE_MAP(CSetupDlg, CDialog)
  74. //{{AFX_MSG_MAP(CSetupDlg)
  75. ON_WM_SYSCOMMAND()
  76. ON_WM_PAINT()
  77. ON_WM_QUERYDRAGICON()
  78. ON_BN_CLICKED(IDC_DIR, OnDir)
  79. //}}AFX_MSG_MAP
  80. END_MESSAGE_MAP()
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CSetupDlg message handlers
  83. BOOL CSetupDlg::OnInitDialog()
  84. {
  85. CDialog::OnInitDialog();
  86. // Add "About..." menu item to system menu.
  87. // IDM_ABOUTBOX must be in the system command range.
  88. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  89. ASSERT(IDM_ABOUTBOX < 0xF000);
  90. CMenu* pSysMenu = GetSystemMenu(FALSE);
  91. if (pSysMenu != NULL)
  92. {
  93. CString strAboutMenu;
  94. strAboutMenu.LoadString(IDS_ABOUTBOX);
  95. if (!strAboutMenu.IsEmpty())
  96. {
  97. pSysMenu->AppendMenu(MF_SEPARATOR);
  98. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  99. }
  100. }
  101. // Set the icon for this dialog.  The framework does this automatically
  102. //  when the application's main window is not a dialog
  103. SetIcon(m_hIcon, TRUE); // Set big icon
  104. SetIcon(m_hIcon, FALSE); // Set small icon
  105. m_RegNameSpace.Empty();
  106. m_RegPluginsPath.Empty();
  107. m_RegNameCount = 0;
  108. LPTSTR pbuf;
  109. HKEY hKey = _IRWERTF_OpenRegTab();
  110. if (hKey)
  111. { // 说明用户的系统已安装了某些插件,提取它们的信息
  112. m_RegMark = TRUE;
  113. m_RegNameCount = _IRWERTF_GetPluginNumber(hKey);
  114. pbuf = _IRWERTF_GetPluginNames(hKey);
  115. m_RegNameSpace = pbuf;
  116. ::GlobalFree(pbuf);
  117. pbuf = _IRWERTF_GetPluginsPath(hKey);
  118. m_RegPluginsPath = pbuf;
  119. ::GlobalFree(pbuf);
  120. _IRWERTF_CloseKey(hKey);
  121. m_Edit.SetWindowText((LPCTSTR)m_RegPluginsPath);
  122. m_Edit.EnableWindow(FALSE);
  123. m_Dir.EnableWindow(FALSE);
  124. }
  125. else
  126. {
  127. m_RegMark = FALSE;
  128. m_Edit.SetWindowText((LPCTSTR)"C:\Program Files\ISee\ISee Explorer\");
  129. }
  130. // TODO: Add extra initialization here
  131. return TRUE;  // return TRUE  unless you set the focus to a control
  132. }
  133. void CSetupDlg::OnSysCommand(UINT nID, LPARAM lParam)
  134. {
  135. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  136. {
  137. CAboutDlg dlgAbout;
  138. dlgAbout.DoModal();
  139. }
  140. else
  141. {
  142. CDialog::OnSysCommand(nID, lParam);
  143. }
  144. }
  145. // If you add a minimize button to your dialog, you will need the code below
  146. //  to draw the icon.  For MFC applications using the document/view model,
  147. //  this is automatically done for you by the framework.
  148. void CSetupDlg::OnPaint() 
  149. {
  150. if (IsIconic())
  151. {
  152. CPaintDC dc(this); // device context for painting
  153. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  154. // Center icon in client rectangle
  155. int cxIcon = GetSystemMetrics(SM_CXICON);
  156. int cyIcon = GetSystemMetrics(SM_CYICON);
  157. CRect rect;
  158. GetClientRect(&rect);
  159. int x = (rect.Width() - cxIcon + 1) / 2;
  160. int y = (rect.Height() - cyIcon + 1) / 2;
  161. // Draw the icon
  162. dc.DrawIcon(x, y, m_hIcon);
  163. }
  164. else
  165. {
  166. CDialog::OnPaint();
  167. }
  168. }
  169. // The system calls this to obtain the cursor to display while the user drags
  170. //  the minimized window.
  171. HCURSOR CSetupDlg::OnQueryDragIcon()
  172. {
  173. return (HCURSOR) m_hIcon;
  174. }
  175. void CSetupDlg::OnDir() 
  176. {
  177. char  caSubPathName[_MAX_PATH];
  178. char  caFullPathName[_MAX_PATH];  
  179. BROWSEINFO brFolder;  
  180. brFolder.hwndOwner = this->m_hWnd;  
  181. brFolder.pidlRoot = NULL;  
  182. brFolder.pszDisplayName = caSubPathName;  
  183. brFolder.lpszTitle = "请选择一个安装目录(最好是原来的ISee目录):";  
  184. brFolder.ulFlags = BIF_RETURNONLYFSDIRS ;  
  185. brFolder.lpfn = NULL;  
  186. if (::SHGetPathFromIDList(::SHBrowseForFolder(&brFolder), caFullPathName))
  187. {
  188. if (caFullPathName[::strlen((const char*)caFullPathName)-1] != '\')
  189. ::strcat((char*)caFullPathName, (const char*)"\");
  190. m_Edit.SetWindowText((LPCTSTR)caFullPathName);
  191. }
  192. }
  193. void CSetupDlg::OnOK() 
  194. {
  195. m_Opr.SetWindowText((LPCTSTR)"正在收集安装信息...");
  196. // 获取源目录
  197. ::GetCurrentDirectory(MAX_PATH, (LPTSTR)m_SouPath);
  198. if (m_SouPath[::strlen((const char*)m_SouPath)-1] != '\')
  199. ::strcat((char*)m_SouPath, (const char*)"\");
  200. ::strcpy((char*)m_FinPath, (const char*)m_SouPath);
  201. ::strcat((char*)m_FinPath, (const char*)"*.irw");
  202. // 获取目标路径
  203. m_Edit.GetWindowText((LPTSTR)m_DesPath, MAX_PATH);
  204. if (m_RegMark == FALSE)
  205. {
  206. ::strcat((char*)m_DesPath, (const char*)"IRW-PlugIn\");
  207. m_RegPluginsPath = m_DesPath;
  208. }
  209. // 校验目标路径是否已经存在,如果不存在则创建目录
  210. if (!::SetCurrentDirectory((LPCTSTR)m_DesPath))
  211. {
  212. if (!::CreateDirectory((LPCTSTR)m_DesPath, (LPSECURITY_ATTRIBUTES)NULL))
  213. {
  214. ::AfxMessageBox((LPCTSTR)"无法在您指定的目录下创建"IRW-PlugIn"子目录,请检查您的系统现在是否正常,并稍后再试。");
  215. CDialog::OnOK();
  216. return;
  217. }
  218. }
  219. WIN32_FIND_DATA file;
  220. HANDLE hFind;
  221. m_FineCount = 0;
  222. hFind = ::FindFirstFile((LPCTSTR)m_FinPath, &file);
  223. if (INVALID_HANDLE_VALUE == hFind)
  224. {
  225. ::AfxMessageBox((LPCTSTR)"系统错误(无法建立搜索循环或在当前目录下找不到.irw文件),请检查后再试。");
  226. CDialog::OnOK();
  227. return;
  228. }
  229. do
  230. {
  231. ::strcpy((char*)(m_FindInfo[m_FineCount].m_FileName), (char*)(file.cFileName)); 
  232. ::strcpy((char*)(m_FindInfo[m_FineCount].m_SouFile), (char*)m_SouPath);
  233. ::strcat((char*)(m_FindInfo[m_FineCount].m_SouFile), (char*)(file.cFileName));
  234. ::strcpy((char*)(m_FindInfo[m_FineCount].m_DesFile), (char*)m_DesPath);
  235. ::strcat((char*)(m_FindInfo[m_FineCount].m_DesFile), (char*)(file.cFileName));
  236. m_FineCount++;
  237. }while(::FindNextFile(hFind, &file));
  238. ::FindClose(hFind);
  239. m_Progress.SetRange(0, m_FineCount);
  240. m_Progress.SetPos(0);
  241. BYTE tmpbuf[MAX_PATH];
  242. if (m_RegMark == FALSE)
  243. m_hKey = _IRWERTF_CreateRegTab();
  244. else
  245. m_hKey = _IRWERTF_OpenRegTab();
  246. for (int i=0;i<m_FineCount;i++)
  247. {
  248. ::sprintf((char*)tmpbuf, (const char*)"正在复制%s到目标目录...", (char*)(m_FindInfo[i].m_FileName));
  249. m_Opr.SetWindowText((LPCTSTR)tmpbuf);
  250. if (!CopyIRWFile((LPCTSTR)(m_FindInfo[i].m_DesFile), (LPCTSTR)(m_FindInfo[i].m_SouFile), (LPCTSTR)(m_FindInfo[i].m_FileName)))
  251. {
  252. ::AfxMessageBox((LPCTSTR)"复制文件的过程中发生错误,请检查后再试。");
  253. _IRWERTF_CloseKey(m_hKey);
  254. CDialog::OnOK();
  255. return;
  256. }
  257. m_Progress.SetPos(i+1);
  258. }
  259. _IRWERTF_SetPluginNumber(m_hKey, m_RegNameCount);
  260. _IRWERTF_SetPluginNames(m_hKey, (LPCTSTR)m_RegNameSpace);
  261. _IRWERTF_SetPluginsPath(m_hKey, (LPCTSTR)m_RegPluginsPath);
  262. _IRWERTF_CloseKey(m_hKey);
  263. ::AfxMessageBox((LPCTSTR)"恭喜、恭喜,安装成功!");
  264. CDialog::OnOK();
  265. }
  266. BOOL CSetupDlg::CopyIRWFile(LPCTSTR desfn, LPCTSTR soufn, LPCTSTR fn)
  267. {
  268. CFile df;
  269. CFile sf;
  270. PBYTE pbuf;
  271. HKEY hKey;
  272. LPPLUGSIN pluginfo;
  273. if (!df.Open(desfn, CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone|CFile::typeBinary))
  274. return FALSE; // 无法创建目标文件
  275. if (!sf.Open(soufn, CFile::modeRead|CFile::shareDenyNone|CFile::typeBinary))
  276. {
  277. df.Close();
  278. return FALSE; // 无法打开源文件
  279. }
  280. DWORD len = sf.GetLength();
  281. pbuf = (PBYTE)::GlobalAlloc(GPTR, sf.GetLength());
  282. if (!pbuf)
  283. {
  284. df.Close();
  285. sf.Close();
  286. return FALSE;
  287. }
  288. TRY
  289. {
  290. df.SeekToBegin();
  291. sf.SeekToBegin();
  292. LPTSTR ptmp = (LPTSTR)pbuf;
  293. DWORD  blocksize;
  294. for (DWORD l=0;l<len;l+=10240)
  295. {
  296. blocksize = ((l+10240)<len) ? 10240:(len-l);
  297. sf.Read((void*)ptmp, blocksize);
  298. df.Write((const void*)ptmp, blocksize);
  299. ptmp += blocksize;
  300. }
  301. pluginfo = (LPPLUGSIN)&(((PBYTE)pbuf)[sf.GetLength()-sizeof(PLUGSIN)]);
  302. hKey = NULL;
  303. if (m_RegNameSpace.Find((LPCTSTR)(pluginfo->modulename), 0) == -1)
  304. { // 新的插件
  305. if (m_RegNameCount)
  306. m_RegNameSpace += (LPCTSTR)" ";
  307. m_RegNameSpace += (LPCTSTR)(pluginfo->modulename);
  308. m_RegNameCount++;
  309. hKey = _IRWERTF_CreatePlugins(m_hKey, (LPCTSTR)(pluginfo->modulename));
  310. _IRWERTF_SetPluginsFileName(hKey, fn);
  311. _IRWERTF_SetPluginPRI(hKey, 30); // 30为普通优先级
  312. }
  313. else
  314. {
  315. hKey = _IRWERTF_OpenPlugins(m_hKey, (LPCTSTR)(pluginfo->modulename));
  316. _IRWERTF_SetPluginsFileName(hKey, fn);
  317. }
  318. ::RegCloseKey(hKey);
  319. sf.Close();
  320. df.Close();
  321. }
  322. CATCH(CFileException, e)
  323. {
  324. ::GlobalFree(pbuf);
  325. df.Close();
  326. sf.Close();
  327. return FALSE;
  328. }
  329. END_CATCH
  330. ::GlobalFree(pbuf);
  331. return TRUE;
  332. }