AppInstance.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:7k
源码类别:

网格计算

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "trfAgent.h"
  3. #include "ConfigEnv.h"
  4. #include "AppInstance.h"
  5. #include "..publicHdHelper.h"
  6. #include "..publicShortCut.h"
  7. CAppInstance::CAppInstance()
  8. {
  9. this->m_hAppMutex = NULL;
  10. this->m_binadminmode = false;
  11. memset(&m_authorinfo, 0x0, sizeof(AUTHORINFO));
  12. memset(m_sModuleFile, 0x0, sizeof(m_sModuleFile));
  13. ::GetModuleFileName(NULL, m_sModuleFile, MAX_PATH);
  14. }
  15. CAppInstance::~CAppInstance()
  16. {
  17. //this->UnInitApp();
  18. }
  19. BOOL CAppInstance::Exists()
  20. {
  21. if(this->m_hAppMutex) return TRUE;
  22. this->m_hAppMutex = CreateMutex(NULL, FALSE, _T("843F00BA81D649649D529594B27D8760"));
  23. if(this->m_hAppMutex)
  24. {
  25. if(ERROR_ALREADY_EXISTS == GetLastError())
  26. {
  27. this->m_hAppMutex = NULL;
  28. return TRUE;
  29. }
  30. }
  31. return FALSE;
  32. }
  33. //initializing  system environment.
  34. //for example : creating system directory, 
  35. // extracting system files from applicaton's resource and so on.
  36. BOOL CAppInstance::InitApp(void)
  37. {
  38. //get the client hard disk id information.
  39. memset(m_sHDID, 0x0, sizeof(m_sHDID));
  40. if(!GetAgentSerialNo(m_sHDID, sizeof(m_sHDID)))
  41. {
  42. return FALSE;
  43. }
  44. // check the shell "send-to" link whether or not exists.
  45. // if link not exists then create it.
  46. CShortcut ssc;
  47. CString shortcutname;
  48. shortcutname.Format("%s %s", SYS_APPANEM, SYS_VERSION_NO);
  49. if(!ssc.isLinkAvailable(shortcutname, CSIDL_SENDTO))
  50. {
  51. ssc.CreateShortCut("_this", shortcutname, CSIDL_SENDTO, 
  52. _LoadString(IDS_SHLSENDTODESC), m_sModuleFile, 0);
  53. }
  54. // initialize the windows socket2 library
  55. if(!::Initialize())
  56. {
  57. MSGBOX_ERROR(_LoadString(IDS_INITSOCKLIBFAILED).GetBuffer(0));
  58. return FALSE;
  59. }
  60. // check the system whether or not installed ?
  61. CRegister regkey;
  62. if(!regkey.Open(HKEY_CURRENT_USER, REG_SSYSSETTINGKEY)) return FALSE;
  63. BOOL binited = regkey.Read_Bool_Value(REG_BSYSINITIALIZED);
  64. regkey.Close();
  65. if(!binited && !this->SysFirstInit())
  66. {
  67. MSGBOX_ERROR(_LoadString(IDS_FIRSTINITSYSFAIL).GetBuffer(0));
  68. return FALSE;
  69. }
  70. // initialize the system ado connection.
  71. char directory[_MAX_PATH], adoconnstr[MAX_SQL_SIZE];
  72. _snprintf(directory, _MAX_PATH-1, "%s%s", ENV_SYSROOTDIR, ENV_SYSDATAFLEDIR);
  73. //_snprintf(adoconnstr, MAX_SQL_SIZE-1, "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=%s;Mode=Share Deny None;Extended Properties=Paradox 7.x;", directory);
  74. _snprintf(adoconnstr, MAX_SQL_SIZE-1, "Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=%s\fMail.mdb;Persist Security Info=True;", directory);
  75. if(!this->m_adoconn.Open(adoconnstr))
  76. {
  77. MSGBOX_ERROR(_LoadString(IDS_INITDBCONNFAIL).GetBuffer(0));
  78. return FALSE;
  79. }
  80. return TRUE;
  81. }
  82. void CAppInstance::UnInitApp(void)
  83. {
  84. //close the ado db connection.
  85. if(this->m_adoconn.IsConnect())
  86. {
  87. this->m_adoconn.Close();
  88. }
  89. //uninitialize the windows socket2 library
  90. ::UnInitialize();
  91. if(NULL != this->m_hAppMutex)
  92. {
  93. CloseHandle(this->m_hAppMutex);
  94. }
  95. }
  96. BOOL CAppInstance::SysFirstInit(void)
  97. {
  98. CRegister regkey;
  99. //0---initializing system parameters.
  100. if(MSGBOX_CONFIRM(_LoadString(IDS_SYSINITCONFIRM)) == IDYES)
  101. {
  102. CConfigEnv sheet_SysConfig(_LoadString(IDS_SYSCONFIG));
  103. sheet_SysConfig.DoModal();
  104. }
  105. //1---create system directories.
  106. char directory[_MAX_PATH];
  107. _snprintf(directory, _MAX_PATH-1, "%s%s", ENV_SYSROOTDIR, ENV_DEFAULT_RECVFLEDIR);
  108. if(!DirectoryExists(directory))
  109. {
  110. if(false == CreateDirectorys(directory)) return FALSE;
  111. }
  112. _snprintf(directory, _MAX_PATH-1, "%s%s", ENV_SYSROOTDIR, ENV_SYSDATAFLEDIR);
  113. if(!DirectoryExists(directory))
  114. {
  115. if(false == CreateDirectorys(directory)) return FALSE;
  116. }
  117. //2---export databse table files from application's resource.
  118. HRSRC hrsrc = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDF_DBFILES), "DBFiles");
  119. if(NULL == hrsrc) return FALSE;
  120. DWORD dwsize = SizeofResource(GetModuleHandle(NULL), hrsrc), writen = 0;
  121. HGLOBAL hglobal = LoadResource(GetModuleHandle(NULL), hrsrc);
  122. if(NULL == hglobal) return FALSE;
  123. LPVOID pres = LockResource(hglobal);
  124. if(NULL == pres) return FALSE;
  125. char datafile[_MAX_PATH];
  126. _snprintf(datafile, _MAX_PATH-1, "%s\dbfiles.dat", directory);
  127. HANDLE hresfile = CreateFile(datafile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 
  128. NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  129. if(INVALID_HANDLE_VALUE == hresfile) return FALSE;
  130. WriteFile(hresfile, pres, dwsize, &writen, NULL);
  131. CloseHandle(hresfile);
  132. //3---extracting databse table files.
  133. if(FALSE == ExtractAllFileFromAG(datafile, directory)) return FALSE;
  134. DeleteFile(datafile);
  135. if(!regkey.Open(HKEY_CURRENT_USER, REG_SSYSSETTINGKEY)) return FALSE;
  136. regkey.Write_Bool_Value(REG_BSYSINITIALIZED, TRUE);
  137. return TRUE;
  138. }
  139. BOOL CAppInstance::ExtractAllFileFromAG(LPCSTR lpcsSrcFilename, LPCSTR lpcsDestDir)
  140. {
  141. try{
  142. //@1 --- 打开源文件
  143. HANDLE hAGLibFile = ::CreateFile((char*)lpcsSrcFilename, GENERIC_READ, 0, NULL,
  144. OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  145. if (hAGLibFile == INVALID_HANDLE_VALUE) return FALSE;
  146. //@2 --- 读取源文件的真实大小和附加文件个数.
  147. DWORD readed = 0, writen = 0;
  148. char filename[_szFilename+1],
  149. flesize[_szFilesize+1],
  150. //
  151. agrelsize[_szFilesize+1],
  152. extraflenum[_szExtraFileCount+1];
  153. //@2.1
  154. int  offset = _szFilesize;
  155. memset((char*)agrelsize, 0x0, _szFilesize+1);
  156. SetFilePointer(hAGLibFile, -offset, NULL, FILE_END);
  157. ReadFile(hAGLibFile, (char*)agrelsize, _szFilesize, &readed, NULL);
  158. //@2.2
  159. offset += _szExtraFileCount;
  160. memset((char*)extraflenum, 0x0, _szExtraFileCount+1);
  161. SetFilePointer(hAGLibFile, -offset, NULL, FILE_END);
  162. ReadFile(hAGLibFile, (char*)extraflenum, _szExtraFileCount, &readed, NULL);
  163. //@3 --- 定位到第一个用户文件开始处,并依次检查是否是指定的文件
  164. //  如果是指定的文件则将文件内容写入指定的目标文件中.
  165. SetFilePointer(hAGLibFile, atoi((char*)agrelsize), NULL, FILE_BEGIN);
  166. int nextraflenum = atoi((char*)extraflenum);
  167. for(int i = 0; i < nextraflenum; ++i)
  168. {
  169. memset((char*)filename, 0x0, sizeof(filename));
  170. ReadFile(hAGLibFile, (char*)filename, _szFilename, &readed, NULL);
  171. ReadFile(hAGLibFile, (char*)flesize, _szFilesize, &readed, NULL);
  172. //@4.1
  173. char dffn[_MAX_PATH];
  174. _snprintf(dffn, _MAX_PATH-1, "%s\%s", lpcsDestDir, (char*)filename);
  175. HANDLE hDestFile = CreateFile((char*)dffn,
  176. GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,
  177. NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  178. if(INVALID_HANDLE_VALUE == hDestFile)
  179. {
  180. CloseHandle(hAGLibFile);
  181. return FALSE;
  182. }
  183. //@4.2 --- 写目标文件内容.
  184. int leftsize = atoi((char*)flesize), maxsize = 0;
  185. char lpBuf[MASS_BLOCK_SIZE];
  186. while(leftsize > 0)
  187. {
  188. memset(lpBuf, 0x0, sizeof(lpBuf));
  189. maxsize = (leftsize > MASS_BLOCK_SIZE ? MASS_BLOCK_SIZE : leftsize);
  190. ReadFile(hAGLibFile, lpBuf, maxsize, &readed, NULL);
  191. WriteFile(hDestFile, lpBuf, readed, &writen, NULL);
  192. leftsize -= readed;
  193. }
  194. CloseHandle(hDestFile);
  195. //break;
  196. }
  197. //@over
  198. CloseHandle(hAGLibFile);
  199. return TRUE;
  200. }
  201. catch (...) {
  202. return FALSE;
  203. }
  204. }