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

图形图象

开发平台:

Visual C++

  1. // IRWConvDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "IRWConv.h"
  5. #include "IRWConvDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CIRWConvDlg dialog
  50. CIRWConvDlg::CIRWConvDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CIRWConvDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CIRWConvDlg)
  54. m_SouFileNameStr = _T("");
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. }
  59. void CIRWConvDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CIRWConvDlg)
  63. DDX_Control(pDX, IDC_FUN_REREAD_IMAGE, m_FunReReadImage);
  64. DDX_Control(pDX, IDC_MODULE_NAME, m_ModuleName);
  65. DDX_Control(pDX, IDC_FUN_SAVE_IMAGE, m_FunSaveImage);
  66. DDX_Control(pDX, IDC_FUN_READ_IMAGE, m_FunReadImage);
  67. DDX_Control(pDX, IDC_DESFN_EXIST, m_DesFileExist);
  68. DDX_Control(pDX, IDC_FULL_IRW, m_FillIRW);
  69. DDX_Control(pDX, IDC_SOU_PROCTYPE_NUM, m_ProcTypeNumber);
  70. DDX_Control(pDX, IDC_FILE_TYPE, m_FileType);
  71. DDX_Control(pDX, IDC_SOU_WRITER, m_Writer);
  72. DDX_Control(pDX, IDC_SOU_TYPE, m_PlugsInType);
  73. DDX_Control(pDX, IDC_SOU_SUBVER, m_SubVer);
  74. DDX_Control(pDX, IDC_SOU_PROCTYPE_STR, m_ProcTypeStr);
  75. DDX_Control(pDX, IDC_SOU_MODULE, m_Module);
  76. DDX_Control(pDX, IDC_SOU_MAJVER, m_MajVer);
  77. DDX_Control(pDX, IDC_SOU_HAHA, m_HaHa);
  78. DDX_Control(pDX, IDC_SOU_FILENAME, m_SouFileName);
  79. DDX_Control(pDX, IDC_SOU_EMAIL, m_EMail);
  80. DDX_Control(pDX, IDC_OPEN_FILE, m_OpenFile);
  81. DDX_Control(pDX, IDC_LOGO, m_LogoBmp);
  82. DDX_Control(pDX, IDC_DES_FILENAME, m_DesFileName);
  83. DDX_Control(pDX, IDC_CONV_TO_IRW, m_ConvToIRW);
  84. DDX_Control(pDX, IDC_CONV_TO_DLL, m_ConvToDLL);
  85. DDX_Text(pDX, IDC_SOU_FILENAME, m_SouFileNameStr);
  86. DDV_MaxChars(pDX, m_SouFileNameStr, 512);
  87. //}}AFX_DATA_MAP
  88. }
  89. BEGIN_MESSAGE_MAP(CIRWConvDlg, CDialog)
  90. //{{AFX_MSG_MAP(CIRWConvDlg)
  91. ON_WM_SYSCOMMAND()
  92. ON_WM_PAINT()
  93. ON_WM_QUERYDRAGICON()
  94. ON_BN_CLICKED(IDC_OPEN_FILE, OnOpenFile)
  95. ON_BN_CLICKED(IDC_CONV_TO_DLL, OnConvToDll)
  96. ON_BN_CLICKED(IDC_CONV_TO_IRW, OnConvToIrw)
  97. ON_BN_CLICKED(IDC_FULL_IRW, OnFillIrw)
  98. //}}AFX_MSG_MAP
  99. END_MESSAGE_MAP()
  100. /////////////////////////////////////////////////////////////////////////////
  101. // CIRWConvDlg message handlers
  102. BOOL CIRWConvDlg::OnInitDialog()
  103. {
  104. CDialog::OnInitDialog();
  105. // Add "About..." menu item to system menu.
  106. // IDM_ABOUTBOX must be in the system command range.
  107. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  108. ASSERT(IDM_ABOUTBOX < 0xF000);
  109. CMenu* pSysMenu = GetSystemMenu(FALSE);
  110. if (pSysMenu != NULL)
  111. {
  112. CString strAboutMenu;
  113. strAboutMenu.LoadString(IDS_ABOUTBOX);
  114. if (!strAboutMenu.IsEmpty())
  115. {
  116. pSysMenu->AppendMenu(MF_SEPARATOR);
  117. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  118. }
  119. }
  120. // Set the icon for this dialog.  The framework does this automatically
  121. //  when the application's main window is not a dialog
  122. SetIcon(m_hIcon, TRUE); // Set big icon
  123. SetIcon(m_hIcon, FALSE); // Set small icon
  124. // TODO: Add extra initialization here
  125. m_SouFileNameStr.Empty();
  126. m_SouFileName.SetWindowText((LPCTSTR)_T(""));
  127. m_DesFileName.SetWindowText((LPCTSTR)_T(""));
  128. m_DesFileName.EnableWindow(FALSE);
  129. m_PlugsInType.AddString((LPCTSTR)_T("内置插件"));
  130. m_PlugsInType.AddString((LPCTSTR)_T("外部插件"));
  131. m_PlugsInType.SetCurSel(0);
  132. m_PlugsInType.EnableWindow(FALSE);
  133. m_Module.AddString((LPCTSTR)_T("发布版"));
  134. m_Module.AddString((LPCTSTR)_T("调试版"));
  135. m_Module.SetCurSel(0);
  136. m_Module.EnableWindow(FALSE);
  137. m_MajVer.AddString((LPCTSTR)_T("0."));
  138. m_MajVer.AddString((LPCTSTR)_T("1."));
  139. m_MajVer.AddString((LPCTSTR)_T("2."));
  140. m_MajVer.AddString((LPCTSTR)_T("3."));
  141. m_MajVer.AddString((LPCTSTR)_T("4."));
  142. m_MajVer.AddString((LPCTSTR)_T("5."));
  143. m_MajVer.AddString((LPCTSTR)_T("6."));
  144. m_MajVer.AddString((LPCTSTR)_T("7."));
  145. m_MajVer.AddString((LPCTSTR)_T("8."));
  146. m_MajVer.AddString((LPCTSTR)_T("9."));
  147. m_MajVer.SetCurSel(0);
  148. m_MajVer.EnableWindow(FALSE);
  149. m_SubVer.AddString((LPCTSTR)_T("0"));
  150. m_SubVer.AddString((LPCTSTR)_T("1"));
  151. m_SubVer.AddString((LPCTSTR)_T("2"));
  152. m_SubVer.AddString((LPCTSTR)_T("3"));
  153. m_SubVer.AddString((LPCTSTR)_T("4"));
  154. m_SubVer.AddString((LPCTSTR)_T("5"));
  155. m_SubVer.AddString((LPCTSTR)_T("6"));
  156. m_SubVer.AddString((LPCTSTR)_T("7"));
  157. m_SubVer.AddString((LPCTSTR)_T("8"));
  158. m_SubVer.AddString((LPCTSTR)_T("9"));
  159. m_SubVer.SetCurSel(0);
  160. m_SubVer.EnableWindow(FALSE);
  161. m_ProcTypeNumber.SetWindowText((LPCTSTR)_T(""));
  162. m_ProcTypeNumber.EnableWindow(FALSE);
  163. m_ProcTypeStr.SetWindowText((LPCTSTR)_T(""));
  164. m_ProcTypeStr.EnableWindow(FALSE);
  165. m_Writer.SetWindowText((LPCTSTR)_T(""));
  166. m_Writer.EnableWindow(FALSE);
  167. m_EMail.SetWindowText((LPCTSTR)_T(""));
  168. m_EMail.EnableWindow(FALSE);
  169. m_HaHa.SetWindowText((LPCTSTR)_T(""));
  170. m_HaHa.EnableWindow(FALSE);
  171. m_DesFileExist.SetCheck(1);
  172. m_DesFileExist.EnableWindow(FALSE);
  173. m_FunSaveImage.SetCheck(0);
  174. m_FunSaveImage.EnableWindow(FALSE);
  175. m_FunReadImage.SetCheck(1);
  176. m_FunReadImage.EnableWindow(FALSE);
  177. m_FunReReadImage.SetCheck(0);
  178. m_FunReReadImage.EnableWindow(FALSE);
  179. m_ModuleName.SetWindowText((LPCTSTR)_T(""));
  180. m_ModuleName.EnableWindow(FALSE);
  181. m_ConvToIRW.EnableWindow(FALSE);
  182. m_ConvToDLL.EnableWindow(FALSE);
  183. m_FillIRW.EnableWindow(FALSE);
  184. m_State = 0;
  185. ZeroMemory((PVOID)&m_Info, sizeof(PLUGSIN));
  186. m_SouFn.Empty();
  187. return TRUE;  // return TRUE  unless you set the focus to a control
  188. }
  189. void CIRWConvDlg::OnSysCommand(UINT nID, LPARAM lParam)
  190. {
  191. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  192. {
  193. CAboutDlg dlgAbout;
  194. dlgAbout.DoModal();
  195. }
  196. else
  197. {
  198. CDialog::OnSysCommand(nID, lParam);
  199. }
  200. }
  201. // If you add a minimize button to your dialog, you will need the code below
  202. //  to draw the icon.  For MFC applications using the document/view model,
  203. //  this is automatically done for you by the framework.
  204. void CIRWConvDlg::OnPaint() 
  205. {
  206. if (IsIconic())
  207. {
  208. CPaintDC dc(this); // device context for painting
  209. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  210. // Center icon in client rectangle
  211. int cxIcon = GetSystemMetrics(SM_CXICON);
  212. int cyIcon = GetSystemMetrics(SM_CYICON);
  213. CRect rect;
  214. GetClientRect(&rect);
  215. int x = (rect.Width() - cxIcon + 1) / 2;
  216. int y = (rect.Height() - cyIcon + 1) / 2;
  217. // Draw the icon
  218. dc.DrawIcon(x, y, m_hIcon);
  219. }
  220. else
  221. {
  222. CDialog::OnPaint();
  223. }
  224. }
  225. // The system calls this to obtain the cursor to display while the user drags
  226. //  the minimized window.
  227. HCURSOR CIRWConvDlg::OnQueryDragIcon()
  228. {
  229. return (HCURSOR) m_hIcon;
  230. }
  231. void CIRWConvDlg::OnOpenFile() 
  232. {
  233. CFileDialog fd(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, 
  234. (LPCTSTR)"模块文件(*.irw; *.dll)|*.irw; *.dll|ISee图像读写插件(*.irw)|*.irw|ISee图像读写DLL(*.dll)|*.dll|所有文件(*.*)|*.*||", 
  235. (CWnd*)this);
  236. CString fn;
  237. CString soufn;
  238. CString desfn;
  239. char drive[_MAX_DRIVE];
  240. char dir[_MAX_DIR];
  241. char fname[_MAX_FNAME];
  242. char ext[_MAX_EXT];
  243. BYTE ps[256];
  244. BYTE pd[32];
  245. INFOSTR pk;
  246. HMODULE m_hDll; // 模块DLL句柄
  247. IRWP_INTERFACE m_IRWPInterFace; // 模块DLL接口函数地址。
  248. if (fd.DoModal() == IDOK)
  249. {
  250. fn = fd.GetPathName();
  251. _splitpath((const char*)fn, drive, dir, fname, ext);
  252. if (!lstrcmp(ext, (LPCTSTR)".dll"))
  253. {
  254. m_hDll = ::LoadLibrary((LPCTSTR)fn);
  255. if (!m_hDll)
  256. {
  257. MessageBox((LPCTSTR)"您指定的DLL文件无法读入内存,请检查这个文件是否有效。", 
  258. (LPCTSTR)"文件错误");
  259. return;
  260. }
  261. m_IRWPInterFace = (IRWP_INTERFACE)::GetProcAddress(m_hDll, MAKEINTRESOURCE(1));
  262. if (!m_IRWPInterFace)
  263. {
  264. ::FreeLibrary(m_hDll);
  265. MessageBox((LPCTSTR)"您指定的这个DLL文件不是ISee的图像读写模块(无法获取接口地址),请检查。", 
  266. (LPCTSTR)"文件错误");
  267. return;
  268. }
  269. ::memset((void*)&pk, 0, sizeof(INFOSTR));
  270. pk.comm = CMD_IS_SUPPORT;
  271. pk.result = ER_EMPTY;
  272. pk.annexdata.cmAnnData = CMD_IS_SUPPORT;
  273. m_IRWPInterFace(&pk);
  274. if (pk.result != ER_SUCCESS)
  275. {
  276. ::FreeLibrary(m_hDll);
  277. MessageBox((LPCTSTR)"您指定的这个DLL文件不是ISee的图像读写模块,请检查它的有效性。", 
  278. (LPCTSTR)"文件类型错误");
  279. return;
  280. }
  281. m_FileType.SetWindowText((LPCTSTR)_T("ISee图像读写模块DLL文件"));
  282. soufn.Empty();
  283. soufn += drive;
  284. soufn += "\...\";
  285. soufn += fname;
  286. soufn += ext;
  287. desfn.Empty();
  288. desfn += drive;
  289. desfn += dir;
  290. desfn += fname;
  291. desfn += ".irw";
  292. m_SouFn = fd.GetPathName();
  293. m_SouFileName.SetWindowText((LPCTSTR)soufn);
  294. m_DesFileName.SetWindowText((LPCTSTR)desfn);
  295. // 获取作者留言
  296. pk.comm = CMD_GETWRITERMESS;
  297. pk.result = ER_EMPTY;
  298. ::ZeroMemory((PVOID)pk.annexdata.scAnnData, DPK_ANNEXINFOSIZE);
  299. m_IRWPInterFace(&pk);
  300. m_HaHa.SetWindowText((LPCTSTR)pk.annexdata.scAnnData);
  301. m_HaHa.EnableWindow();
  302. // 获取作者名字
  303. pk.comm = CMD_GETWRITERS;
  304. pk.result = ER_EMPTY;
  305. ::ZeroMemory((PVOID)pk.annexdata.scAnnData, DPK_ANNEXINFOSIZE);
  306. m_IRWPInterFace(&pk);
  307. m_Writer.SetWindowText((LPCTSTR)pk.annexdata.scAnnData);
  308. m_Writer.EnableWindow();
  309. // 获取能处理的文件类型串
  310. pk.comm = CMD_GETPROCTYPE;
  311. pk.result = ER_EMPTY;
  312. ::ZeroMemory((PVOID)pk.annexdata.scAnnData, DPK_ANNEXINFOSIZE);
  313. m_IRWPInterFace(&pk);
  314. m_ProcTypeStr.SetWindowText((LPCTSTR)pk.annexdata.scAnnData);
  315. m_ProcTypeStr.EnableWindow();
  316. ::ZeroMemory((PVOID)ps, 256);
  317. ::ZeroMemory((PVOID)pd, 32);
  318. ::memcpy((void *)ps, (void *)pk.annexdata.scAnnData, ::lstrlen((LPCTSTR)pk.annexdata.scAnnData));
  319. int tn = _GetProcTypeData((LPTSTR)ps, (LPTSTR)pd);
  320. ::itoa(tn, (char*)ps, 10);
  321. m_ProcTypeNumber.SetWindowText((LPCTSTR)ps);
  322. // 获取内部版本号
  323. pk.comm = CMD_GETBUILDID;
  324. pk.result = ER_EMPTY;
  325. pk.annexdata.dwAnnData = 0L;
  326. m_IRWPInterFace(&pk);
  327. m_MajVer.SetCurSel(pk.annexdata.dwAnnData/10);
  328. m_SubVer.SetCurSel(pk.annexdata.dwAnnData-(pk.annexdata.dwAnnData/10)*10);
  329. m_MajVer.EnableWindow();
  330. m_SubVer.EnableWindow();
  331. m_EMail.EnableWindow();
  332. m_ProcTypeNumber.EnableWindow();
  333. m_PlugsInType.EnableWindow();
  334. m_Module.EnableWindow();
  335. m_ModuleName.SetWindowText((LPCTSTR)fname);
  336. m_ModuleName.EnableWindow();
  337. pk.comm = CMD_IS_SUPPORT;
  338. pk.result = ER_EMPTY;
  339. pk.annexdata.cmAnnData = CMD_LOAD_FROM_FILE;
  340. m_IRWPInterFace(&pk);
  341. if (pk.result == ER_SUCCESS)
  342. m_FunReadImage.SetCheck(1);
  343. else
  344. m_FunReadImage.SetCheck(0);
  345. m_FunReadImage.EnableWindow();
  346. pk.comm = CMD_IS_SUPPORT;
  347. pk.result = ER_EMPTY;
  348. pk.annexdata.cmAnnData = CMD_RESIZE;
  349. m_IRWPInterFace(&pk);
  350. if (pk.result == ER_SUCCESS)
  351. m_FunReReadImage.SetCheck(1);
  352. else
  353. m_FunReReadImage.SetCheck(0);
  354. m_FunReReadImage.EnableWindow();
  355. pk.comm = CMD_IS_SUPPORT;
  356. pk.result = ER_EMPTY;
  357. pk.annexdata.cmAnnData = CMD_SAVE_TO_FILE;
  358. m_IRWPInterFace(&pk);
  359. if (pk.result == ER_SUCCESS)
  360. m_FunSaveImage.SetCheck(1);
  361. else
  362. m_FunSaveImage.SetCheck(0);
  363. m_FunSaveImage.EnableWindow();
  364. m_DesFileName.EnableWindow();
  365. m_DesFileExist.SetCheck(1);
  366. m_DesFileExist.EnableWindow();
  367. m_ConvToIRW.EnableWindow();
  368. m_ConvToDLL.EnableWindow(FALSE);
  369. m_FillIRW.EnableWindow(FALSE);
  370. ::FreeLibrary(m_hDll);
  371. m_State = 1; // DLL to IRW
  372. }
  373. else if (!lstrcmp(ext, (LPCTSTR)".irw"))
  374. {
  375. TRY
  376. {
  377. CFile file((LPCTSTR)fn, CFile::modeReadWrite|CFile::typeBinary|CFile::shareExclusive);
  378. file.Seek(-(long)(sizeof(PLUGSIN)), CFile::end);
  379. file.Read((void*)&m_Info, sizeof(PLUGSIN));
  380. file.Close();
  381. }
  382. CATCH(CFileException, e)
  383. {
  384. MessageBox((LPCTSTR)"无法读取指定的IRW文件,请检查当前系统是否正常。", 
  385. (LPCTSTR)"文件错误");
  386. return;
  387. }
  388. END_CATCH
  389. if ( (m_Info.IRWID[0] != 'I')||(m_Info.IRWID[1] != 'R')|| 
  390.  (m_Info.IRWID[2] != 'W')||(m_Info.IRWID[3] != 'P') )
  391. {
  392. MessageBox((LPCTSTR)"指定的文件不是一个有效的IRW文件,请检查该文件是否被破坏。", 
  393. (LPCTSTR)"文件错误");
  394. return;
  395. }
  396. m_FileType.SetWindowText((LPCTSTR)_T("ISee图像读写模块插件(IRW文件)"));
  397. soufn.Empty();
  398. soufn += drive;
  399. soufn += "\...\";
  400. soufn += fname;
  401. soufn += ext;
  402. desfn.Empty();
  403. desfn += drive;
  404. desfn += dir;
  405. desfn += fname;
  406. desfn += ".dll";
  407. m_SouFn = fd.GetPathName();
  408. m_SouFileName.SetWindowText((LPCTSTR)soufn);
  409. m_DesFileName.SetWindowText((LPCTSTR)desfn);
  410. m_HaHa.SetWindowText((LPCTSTR)m_Info.messages);
  411. m_HaHa.EnableWindow();
  412. m_Writer.SetWindowText((LPCTSTR)m_Info.author);
  413. m_Writer.EnableWindow();
  414. ::ZeroMemory((PVOID)ps, 256);
  415. PBYTE pps = (PBYTE)ps;
  416. for (int i=0;i<(int)m_Info.proctypenum;i++)
  417. {
  418. for (int j=0, k=0;j<4;j++)
  419. {
  420. if (m_Info.proctypestr[i*4+j] != 0)
  421. *pps++ = m_Info.proctypestr[i*4+j];
  422. else
  423. {
  424. if (k == 0)
  425. {
  426. *pps++ = (BYTE)',';
  427. k++;
  428. }
  429. }
  430. }
  431. if ((*(pps-1)) != ',')
  432. *pps++ = (BYTE)',';
  433. }
  434. ps[lstrlen((LPCTSTR)ps)-1] = 0; // 除去末尾的逗号
  435. m_ProcTypeStr.SetWindowText((LPCTSTR)ps);
  436. m_ProcTypeStr.EnableWindow();
  437. char pbuff[4];
  438. itoa((int)m_Info.proctypenum, (char*)pbuff, 10);
  439. m_ProcTypeNumber.SetWindowText((LPCTSTR)pbuff);
  440. m_ProcTypeNumber.EnableWindow();
  441. m_MajVer.SetCurSel(m_Info.version>>8);
  442. m_SubVer.SetCurSel(m_Info.version&0xff);
  443. m_MajVer.EnableWindow();
  444. m_SubVer.EnableWindow();
  445. m_EMail.SetWindowText((LPCTSTR)m_Info.EMail);
  446. m_EMail.EnableWindow();
  447. m_PlugsInType.SetCurSel(m_Info.attrib>>8);
  448. m_PlugsInType.EnableWindow();
  449. m_Module.SetCurSel(m_Info.attrib&0xff);
  450. m_Module.EnableWindow();
  451. m_ModuleName.SetWindowText((LPCTSTR)m_Info.modulename);
  452. m_ModuleName.EnableWindow();
  453. m_FunReadImage.SetCheck(m_Info.function&0x1);
  454. m_FunReadImage.EnableWindow();
  455. m_FunSaveImage.SetCheck((m_Info.function>>1)&0x1);
  456. m_FunSaveImage.EnableWindow();
  457. m_FunReReadImage.SetCheck((m_Info.function>>2)&0x1);
  458. m_FunReReadImage.EnableWindow();
  459. m_DesFileName.EnableWindow();
  460. m_DesFileExist.SetCheck(1);
  461. m_DesFileExist.EnableWindow();
  462. m_ConvToIRW.EnableWindow(FALSE);
  463. m_ConvToDLL.EnableWindow();
  464. m_FillIRW.EnableWindow();
  465. m_State = 2; // IRW to DLL or full
  466. }
  467. else
  468. {
  469. MessageBox((LPCTSTR)"应该选择以IRW或DLL为扩展名的文件。", 
  470. (LPCTSTR)"文件选择错误");
  471. }
  472. }
  473. }
  474. int CIRWConvDlg::_GetProcTypeData(LPTSTR pSouStr, LPTSTR pDesStr)
  475. {
  476. BYTE c;
  477. PBYTE ps = (PBYTE)pSouStr;
  478. PBYTE pd = (PBYTE)pDesStr;
  479. int i = 0, soulen = 0, TypeNum = 0, TypeLen = 0, TypeFill = 0;
  480. soulen = ::lstrlen(pSouStr);
  481. if (soulen < 1)
  482. return 0; // 入口参数不合法
  483. _strupr((LPTSTR)ps);
  484. for (i=0;i<soulen;i++)
  485. {
  486. c = *ps++;
  487. if ((c == ',')||(c == ' '))
  488. continue;
  489. TypeNum++; TypeLen = 0;
  490. if (TypeNum > 8)
  491. {
  492. MessageBox((LPCTSTR)"单个模块不能支持多于8个类型文件的处理,请检查输入或修改代码。", 
  493. (LPCTSTR)"参数错误");
  494. return 0;
  495. }
  496. do
  497. {
  498. *pd++ = c;
  499. TypeLen++;
  500. if (TypeLen > 4)
  501. {
  502. MessageBox((LPCTSTR)"单个文件类型描述不能超过4个字符,请检查输入数据。", 
  503. (LPCTSTR)"参数错误");
  504. return 0;
  505. }
  506. c = *ps++;
  507. i++;
  508. }while((c != ',')&&(c != ' ')&&(i < soulen));
  509. TypeFill = 4 - TypeLen;
  510. ASSERT(TypeFill >= 0);
  511. while(TypeFill--) *pd++ = 0;
  512. }
  513. return TypeNum;
  514. }
  515. void CIRWConvDlg::OnConvToDll() 
  516. {
  517. ASSERT(m_State == 2);
  518. BYTE path[MAX_PATH];
  519. HANDLE hSou = ::CreateFile((LPCTSTR)m_SouFn, GENERIC_READ, 
  520. FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  521. if (hSou == INVALID_HANDLE_VALUE)
  522. {
  523. MessageBox((LPCTSTR)"指定的IRW文件打不开,请检查是否有程序正在使用该文件(如果有请关闭这个程序)。", 
  524. (LPCTSTR)"系统错误");
  525. return;
  526. }
  527. // 获取目标文件名
  528. ::ZeroMemory((PVOID)path, MAX_PATH);
  529. m_DesFileName.GetWindowText((LPTSTR)path, MAX_PATH);
  530. DWORD dwCreateAttr;
  531. if (m_DesFileExist.GetCheck() == 0)
  532. dwCreateAttr = CREATE_ALWAYS;
  533. else
  534. dwCreateAttr = CREATE_NEW;
  535. HANDLE hDes = ::CreateFile((LPCTSTR)path, GENERIC_READ | GENERIC_WRITE,
  536. FILE_SHARE_READ, NULL, dwCreateAttr, FILE_ATTRIBUTE_NORMAL, NULL);
  537. if (hDes == INVALID_HANDLE_VALUE)
  538. {
  539. ::CloseHandle(hSou);
  540. MessageBox((LPCTSTR)"无法还原DLL文件(或者该文件已经存在),请检查。", 
  541. (LPCTSTR)"系统错误");
  542. return;
  543. }
  544. int result = _CopyFileToDLL(hDes, hSou);
  545. ::CloseHandle(hSou);
  546. ::CloseHandle(hDes);
  547. if (result == 0)
  548. {
  549. MessageBox((LPCTSTR)"操作成功!已还原出DLL文件。", 
  550. (LPCTSTR)"操作成功");
  551. }
  552. else if (result == -1)
  553. {
  554. MessageBox((LPCTSTR)"内存不足,无法完成操作!请关闭一些软件再试。", 
  555. (LPCTSTR)"系统错误");
  556. }
  557. else if (result == -2)
  558. {
  559. MessageBox((LPCTSTR)"读、写文件时出错,请检查系统现在是否稳定!", 
  560. (LPCTSTR)"系统错误");
  561. }
  562. else
  563. ASSERT(FALSE);
  564. return;
  565. }
  566. void CIRWConvDlg::OnConvToIrw() 
  567. {
  568. ASSERT(m_State == 1);
  569. BYTE path[MAX_PATH];
  570. BYTE ps[256];
  571. ::ZeroMemory((PVOID)&m_Info, sizeof(PLUGSIN));
  572. ::memmove((void*)m_Info.IRWID, (const void*)"IRWP", 4);
  573. m_Info.attrib = (m_PlugsInType.GetCurSel() == 0) ? 0:1;
  574. m_Info.attrib <<= 8; // 高字节表示插件类型(内置0或外置1)
  575. m_Info.attrib |= (m_Module.GetCurSel() == 0) ? 0:1;
  576. // 低字节表示插件是DEBUG版的(1)还是发布版的(0)
  577. m_Info.version = m_MajVer.GetCurSel();
  578. m_Info.version <<= 8; // 高字节是主版本号(不大于9)
  579. m_Info.version |= m_SubVer.GetCurSel();
  580. ::ZeroMemory((PVOID)ps, 256);
  581. m_ProcTypeStr.GetWindowText((LPTSTR)ps, 256);
  582. m_Info.proctypenum = _GetProcTypeData((LPTSTR)ps, (LPTSTR)(m_Info.proctypestr));
  583. if (!m_Info.proctypenum)
  584. {
  585. MessageBox((LPCTSTR)"ISee的图像读写插件必需能处理一种或一种以上的文件类型,请检查输入的参数是否正确。", 
  586. (LPCTSTR)"参数错误");
  587. return;
  588. }
  589. ::ZeroMemory((PVOID)ps, 256);
  590. m_Writer.GetWindowText((LPTSTR)ps, 256);
  591. if (::lstrlen((LPCTSTR)ps) > 15)
  592. {
  593. MessageBox((LPCTSTR)"作者的名单太长了,应适当减小(小于16个英文字符的长度)。", 
  594. (LPCTSTR)"参数错误");
  595. return;
  596. }
  597. ::CopyMemory((PVOID)m_Info.author, (PVOID)ps, 16);
  598. ::ZeroMemory((PVOID)ps, 256);
  599. m_EMail.GetWindowText((LPTSTR)ps, 256);
  600. if (::lstrlen((LPCTSTR)ps) > 31)
  601. {
  602. MessageBox((LPCTSTR)"EMail地址太长了,是否可适当减小(应小于32个英文字符的长度)。", 
  603. (LPCTSTR)"参数错误");
  604. return;
  605. }
  606. ::CopyMemory((PVOID)m_Info.EMail, (PVOID)ps, 32);
  607. ::ZeroMemory((PVOID)ps, 256);
  608. m_HaHa.GetWindowText((LPTSTR)ps, 256);
  609. if (::lstrlen((LPCTSTR)ps) > 143)
  610. {
  611. MessageBox((LPCTSTR)"留言太多了,是否可适当缩减(应小于72个汉字的长度)。", 
  612. (LPCTSTR)"参数错误");
  613. return;
  614. }
  615. ::CopyMemory((PVOID)m_Info.messages, (PVOID)ps, 144);
  616. // 内部支持功能
  617. m_Info.function = m_FunReReadImage.GetState()&0x1;
  618. m_Info.function <<= 1;
  619. m_Info.function |= m_FunSaveImage.GetState()&0x1;
  620. m_Info.function <<= 1;
  621. m_Info.function |= m_FunReadImage.GetState()&0x1;
  622. // 模块名字
  623. ::ZeroMemory((PVOID)ps, 256);
  624. m_ModuleName.GetWindowText((LPTSTR)ps, 256);
  625. if (::lstrlen((LPCTSTR)ps) > 15)
  626. {
  627. MessageBox((LPCTSTR)"模块名太长了,是否可适当缩减(应小于16个字节)。", 
  628. (LPCTSTR)"参数错误");
  629. return;
  630. }
  631. ::CopyMemory((PVOID)m_Info.modulename, (PVOID)ps, 16);
  632. HANDLE hSou = ::CreateFile((LPCTSTR)m_SouFn, GENERIC_READ, 
  633. FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  634. if (hSou == INVALID_HANDLE_VALUE)
  635. {
  636. MessageBox((LPCTSTR)"指定的DLL文件打不开,请检查是否有程序正在使用该文件(如果有请关闭这个程序)。", 
  637. (LPCTSTR)"系统错误");
  638. return;
  639. }
  640. // 获取目标文件名
  641. ::ZeroMemory((PVOID)path, MAX_PATH);
  642. m_DesFileName.GetWindowText((LPTSTR)path, MAX_PATH);
  643. DWORD dwCreateAttr;
  644. if (m_DesFileExist.GetCheck() == 0)
  645. dwCreateAttr = CREATE_ALWAYS;
  646. else
  647. dwCreateAttr = CREATE_NEW;
  648. HANDLE hDes = ::CreateFile((LPCTSTR)path, GENERIC_READ | GENERIC_WRITE,
  649. FILE_SHARE_READ, NULL, dwCreateAttr, FILE_ATTRIBUTE_NORMAL, NULL);
  650. if (hDes == INVALID_HANDLE_VALUE)
  651. {
  652. ::CloseHandle(hSou);
  653. MessageBox((LPCTSTR)"无法创建IRW文件(或者该文件已经存在),请检查。", 
  654. (LPCTSTR)"系统错误");
  655. return;
  656. }
  657. int result = _CopyFileToIRW(hDes, hSou);
  658. ::CloseHandle(hSou);
  659. ::CloseHandle(hDes);
  660. if (result == 0)
  661. {
  662. MessageBox((LPCTSTR)"操作成功!IRW文件已建立。", 
  663. (LPCTSTR)"操作成功");
  664. }
  665. else if (result == -1)
  666. {
  667. MessageBox((LPCTSTR)"内存不足,无法完成操作!请关闭一些软件再试。", 
  668. (LPCTSTR)"系统错误");
  669. }
  670. else if (result == -2)
  671. {
  672. MessageBox((LPCTSTR)"读、写文件时出错,请检查系统现在是否稳定!", 
  673. (LPCTSTR)"系统错误");
  674. }
  675. else
  676. ASSERT(FALSE);
  677. return;
  678. }
  679. void CIRWConvDlg::OnFillIrw() 
  680. {
  681. ASSERT(m_State == 2);
  682. BYTE ps[256];
  683. ::ZeroMemory((PVOID)&m_Info, sizeof(PLUGSIN));
  684. ::memmove((void*)m_Info.IRWID, (const void*)"IRWP", 4);
  685. m_Info.attrib = (m_PlugsInType.GetCurSel() == 0) ? 0:1;
  686. m_Info.attrib <<= 8; // 高字节表示插件类型(内置0或外置1)
  687. m_Info.attrib |= (m_Module.GetCurSel() == 0) ? 0:1;
  688. // 低字节表示插件是DEBUG版的(1)还是发布版的(0)
  689. m_Info.version = m_MajVer.GetCurSel();
  690. m_Info.version <<= 8; // 高字节是主版本号(不大于9)
  691. m_Info.version |= m_SubVer.GetCurSel();
  692. ::ZeroMemory((PVOID)ps, 256);
  693. m_ProcTypeStr.GetWindowText((LPTSTR)ps, 256);
  694. m_Info.proctypenum = _GetProcTypeData((LPTSTR)ps, (LPTSTR)(m_Info.proctypestr));
  695. if (!m_Info.proctypenum)
  696. {
  697. MessageBox((LPCTSTR)"ISee的图像读写插件必需能处理一种或一种以上的文件类型,请检查输入的参数是否正确。", 
  698. (LPCTSTR)"参数错误");
  699. return;
  700. }
  701. ::ZeroMemory((PVOID)ps, 256);
  702. m_Writer.GetWindowText((LPTSTR)ps, 256);
  703. if (::lstrlen((LPCTSTR)ps) > 15)
  704. {
  705. MessageBox((LPCTSTR)"作者的名单太长了,应适当减小(小于16个英文字符的长度)。", 
  706. (LPCTSTR)"参数错误");
  707. return;
  708. }
  709. ::CopyMemory((PVOID)m_Info.author, (PVOID)ps, 16);
  710. ::ZeroMemory((PVOID)ps, 256);
  711. m_EMail.GetWindowText((LPTSTR)ps, 256);
  712. if (::lstrlen((LPCTSTR)ps) > 31)
  713. {
  714. MessageBox((LPCTSTR)"EMail地址太长了,是否可适当减小(应小于32个英文字符的长度)。", 
  715. (LPCTSTR)"参数错误");
  716. return;
  717. }
  718. ::CopyMemory((PVOID)m_Info.EMail, (PVOID)ps, 32);
  719. ::ZeroMemory((PVOID)ps, 256);
  720. m_HaHa.GetWindowText((LPTSTR)ps, 256);
  721. if (::lstrlen((LPCTSTR)ps) > 143)
  722. {
  723. MessageBox((LPCTSTR)"留言太多了,是否可适当缩减(应小于72个汉字的长度)。", 
  724. (LPCTSTR)"参数错误");
  725. return;
  726. }
  727. ::CopyMemory((PVOID)m_Info.messages, (PVOID)ps, 144);
  728. // 内部支持功能
  729. m_Info.function  = m_FunReReadImage.GetState()&0x1;
  730. m_Info.function <<= 1;
  731. m_Info.function |= m_FunSaveImage.GetState()&0x1;
  732. m_Info.function <<= 1;
  733. m_Info.function |= m_FunReadImage.GetState()&0x1;
  734. // 模块名字
  735. ::ZeroMemory((PVOID)ps, 256);
  736. m_ModuleName.GetWindowText((LPTSTR)ps, 256);
  737. if (::lstrlen((LPCTSTR)ps) > 15)
  738. {
  739. MessageBox((LPCTSTR)"模块名太长了,是否可适当缩减(应小于16个字节)。", 
  740. (LPCTSTR)"参数错误");
  741. return;
  742. }
  743. ::CopyMemory((PVOID)m_Info.modulename, (PVOID)ps, 16);
  744. HANDLE hDes = ::CreateFile((LPCTSTR)m_SouFn, GENERIC_READ | GENERIC_WRITE,
  745. FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  746. if (hDes == INVALID_HANDLE_VALUE)
  747. {
  748. MessageBox((LPCTSTR)"无法创建IRW文件(或者该文件已经存在),请检查。", 
  749. (LPCTSTR)"系统错误");
  750. return;
  751. }
  752. int result = _FillToIrw(hDes);
  753. ::CloseHandle(hDes);
  754. if (result == 0)
  755. {
  756. MessageBox((LPCTSTR)"操作成功!IRW文件中的附加信息已刷新。", 
  757. (LPCTSTR)"操作成功");
  758. }
  759. else if (result == -2)
  760. {
  761. MessageBox((LPCTSTR)"读、写文件时出错,请检查系统现在是否稳定!", 
  762. (LPCTSTR)"系统错误");
  763. }
  764. else
  765. ASSERT(FALSE);
  766. return;
  767. }
  768. int CIRWConvDlg::_FillToIrw(HANDLE hDes)
  769. {
  770. ASSERT(hDes);
  771. CFile desfile((int)hDes);
  772. TRY
  773. {
  774. desfile.Seek(-(long)(sizeof(PLUGSIN)), CFile::end);
  775. desfile.Write((const void*)&m_Info, sizeof(PLUGSIN));
  776. }
  777. CATCH(CFileException, e)
  778. {
  779. return -2; // 在读写文件的过程中发生错误
  780. }
  781. END_CATCH
  782. return 0;
  783. }
  784. int CIRWConvDlg::_CopyFileToIRW(HANDLE hDes, HANDLE hSou)
  785. {
  786. ASSERT(hDes);
  787. ASSERT(hSou);
  788. CFile soufile((int)hSou);
  789. CFile desfile((int)hDes);
  790. DWORD dwFileLen = soufile.GetLength();
  791. PBYTE pBuff = (PBYTE)::GlobalAlloc(GPTR, dwFileLen);
  792. if (!pBuff)
  793. return -1; // 内存不足
  794. TRY
  795. {
  796. soufile.SeekToBegin();
  797. desfile.SeekToBegin();
  798. soufile.ReadHuge((void*)pBuff, dwFileLen);
  799. desfile.WriteHuge((const void*)pBuff, dwFileLen);
  800. desfile.Write((const void*)&m_Info, sizeof(PLUGSIN));
  801. }
  802. CATCH(CFileException, e)
  803. {
  804. ::GlobalFree(pBuff);
  805. return -2; // 在读写文件的过程中发生错误
  806. }
  807. END_CATCH
  808. ::GlobalFree(pBuff);
  809. return 0; // OK
  810. }
  811. int CIRWConvDlg::_CopyFileToDLL(HANDLE hDes, HANDLE hSou)
  812. {
  813. ASSERT(hDes);
  814. ASSERT(hSou);
  815. CFile soufile((int)hSou); // IRW file
  816. CFile desfile((int)hDes); // DLL file
  817. DWORD dwFileLen = soufile.GetLength()-sizeof(PLUGSIN);
  818. PBYTE pBuff = (PBYTE)::GlobalAlloc(GPTR, dwFileLen);
  819. if (!pBuff)
  820. return -1; // 内存不足
  821. TRY
  822. {
  823. soufile.SeekToBegin();
  824. desfile.SeekToBegin();
  825. soufile.ReadHuge((void*)pBuff, dwFileLen);
  826. desfile.WriteHuge((const void*)pBuff, dwFileLen);
  827. }
  828. CATCH(CFileException, e)
  829. {
  830. ::GlobalFree(pBuff);
  831. return -2; // 在读写文件的过程中发生错误
  832. }
  833. END_CATCH
  834. ::GlobalFree(pBuff);
  835. return 0; // OK
  836. }