stdafx.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. // stdafx.cpp : source file that includes just the standard includes
  2. // DownloadShell.pch will be the pre-compiled header
  3. // stdafx.obj will contain the pre-compiled type information
  4. #include "stdafx.h"
  5. #include <tlhelp32.h>
  6. int FindAndCloseProcess(__in CString strProName)
  7. {
  8. int nIndex = strProName.ReverseFind('\\');
  9. if (nIndex != -1) // 如果传的是全路径;
  10. strProName = strProName.Right(strProName.GetLength() - nIndex - 1);
  11. DWORD dwProcessID = 0;
  12. PROCESSENTRY32 pe32 = { 0 };
  13. HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  14. if (hProcessSnap == NULL)
  15. {
  16. return 0;
  17. }
  18. pe32.dwSize = sizeof(PROCESSENTRY32);
  19. if (Process32First(hProcessSnap, &pe32))
  20. {
  21. do
  22. {
  23. if (_tcscmp(strProName, pe32.szExeFile) == 0)
  24. {
  25. dwProcessID = pe32.th32ProcessID;
  26. break;
  27. }
  28. } while (Process32Next(hProcessSnap, &pe32));
  29. }
  30. CloseHandle(hProcessSnap);
  31. hProcessSnap = NULL;
  32. if (dwProcessID == 0)
  33. return 0;
  34. HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID);
  35. if (hProcess == NULL)
  36. return 0;
  37. DWORD dwError;
  38. if (!TerminateProcess(hProcess, 0))
  39. {
  40. dwError = GetLastError();
  41. CloseHandle(hProcess);
  42. hProcess = NULL;
  43. return -1;
  44. }
  45. // 等待进程结束响应;
  46. if (WAIT_OBJECT_0 != WaitForSingleObject(hProcess, INFINITE))
  47. {
  48. CloseHandle(hProcess);
  49. AfxMessageBox(_T("结束进程失败"));
  50. return -1;
  51. }
  52. CloseHandle(hProcess);
  53. hProcess = NULL;
  54. return 1;
  55. }
  56. int UpdateFile(IN CONST DWORD &dwResourceID, IN LPCTSTR lpExt, IN LPCTSTR lpFileFullName)
  57. {
  58. if (lpFileFullName == NULL)
  59. return -1;
  60. HGLOBAL hGlobal = NULL;
  61. HRSRC hSource = NULL;
  62. LPVOID lpBuffer = NULL;
  63. DWORD dwSize = 0;
  64. BOOL bResult = FALSE;
  65. if (_tcscmp(lpExt, _T("EXE")) == 0)
  66. {
  67. FindAndCloseProcess(lpFileFullName);
  68. }
  69. if (DeleteFile(lpFileFullName) == 0)
  70. {
  71. DWORD dwError = GetLastError();
  72. if (ERROR_FILE_NOT_FOUND != dwError && ERROR_PATH_NOT_FOUND != dwError)
  73. {
  74. CString strError;
  75. strError.Format(_T("%s:文件拒绝访问,删除文件失败!"), lpFileFullName);
  76. AfxMessageBox(strError);
  77. _exit(0);
  78. return -1;
  79. }
  80. }
  81. // 1.定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可
  82. hSource = FindResource(NULL, MAKEINTRESOURCE(dwResourceID), lpExt);
  83. if (hSource == NULL)
  84. {
  85. AfxMessageBox(_T("载入资源失败, 升级失败!"));
  86. _exit(0);
  87. return -1;
  88. }
  89. // 2.获取资源的大小;
  90. dwSize = (UINT)SizeofResource(NULL, hSource);
  91. // 3.加载资源;
  92. hGlobal = LoadResource(NULL, hSource);
  93. if (hGlobal == NULL)
  94. {
  95. AfxMessageBox(_T("载入资源失败, 升级失败!"));
  96. _exit(0);
  97. return -1;
  98. }
  99. // 4.锁定资源,获取buffer;
  100. lpBuffer = LockResource(hGlobal);
  101. if (lpBuffer == NULL)
  102. {
  103. AfxMessageBox(_T("载入资源失败, 升级失败!"));
  104. _exit(0);
  105. return -1;
  106. }
  107. #if 0
  108. // lpFileFullName需要先判断文件是否存在??不需要;
  109. CFile fp;
  110. if (fp.Open(lpFileFullName, CFile::modeCreate | CFile::modeWrite) == 0)
  111. {
  112. AfxMessageBox(_T("创建文件失败,升级失败!"));
  113. _exit(0);
  114. return -1;
  115. }
  116. fp.Write(lpBuffer, dwSize);
  117. fp.Close();
  118. #else
  119. Uncompress(lpFileFullName, (BYTE*)lpBuffer, dwSize);
  120. #endif
  121. UnlockResource(hGlobal);
  122. FreeResource(hGlobal);
  123. return 0;
  124. }
  125. const TCHAR g_szLzma[] = _T("#LZMA#");
  126. BOOL CompressFile(CString strCompressFile, CString &strSaveFile)
  127. {
  128. //////////////////////////////////////////////////////////////////////////
  129. // 压缩文件;
  130. //////////////////////////////////////////////////////////////////////////
  131. byte prop[5] = {0};
  132. size_t nPropSize = 5;
  133. ULONGLONG ulTickCount = GetTickCount();
  134. strSaveFile = strCompressFile.Mid(0,strCompressFile.ReverseFind('.')) + ".lam";
  135. if ( PathFileExists(strSaveFile) )
  136. {
  137. // 已经压缩了;
  138. return TRUE;
  139. }
  140. FILE* fp = fopen(strCompressFile, "rb");
  141. if ( NULL != fp )
  142. {
  143. fseek(fp, 0, SEEK_END);
  144. size_t nSrcLen = ftell(fp);
  145. fseek(fp, 0, SEEK_SET);
  146. byte* pSrcData = (byte*)malloc(nSrcLen);
  147. fread(pSrcData, nSrcLen, 1, fp);
  148. fclose(fp);
  149. size_t nDesLen = nSrcLen;
  150. byte* pDesData = (byte*)malloc(nDesLen);
  151. #ifdef USE_LIB
  152. int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, (1<<24), 8, 0, 2, 32, 2);
  153. #else
  154. int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, (1<<24), 3, 0, 2, 32, 2);
  155. #endif
  156. if ( SZ_ERROR_OUTPUT_EOF == nRet )
  157. {//申请内存不足;
  158. free(pDesData);
  159. nDesLen += nSrcLen;
  160. pDesData = (byte*)malloc(nDesLen);
  161. #ifdef USE_LIB
  162. nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 5, (1<<24), 8, 0, 2, 32, 2);
  163. #else
  164. nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, (1<<24), 3, 0, 2, 32, 2);
  165. #endif
  166. }
  167. if ( SZ_OK == nRet )
  168. {//压缩完成,保存文件;
  169. fp = fopen(strSaveFile, "wb+");
  170. if ( NULL != fp )
  171. {
  172. // 写入压缩标记;
  173. fwrite(g_szLzma, strlen(g_szLzma), 1, fp);
  174. // 写入prop;
  175. fwrite(prop, 5, 1, fp);
  176. // 写入nPropSize;
  177. fwrite(&nPropSize, sizeof(size_t), 1, fp);
  178. // 写入文件大小;
  179. fwrite(&nSrcLen, sizeof(size_t), 1, fp);
  180. // 写入压缩数据;
  181. fwrite(pDesData, nDesLen, 1, fp);
  182. fclose(fp);
  183. }
  184. else
  185. {
  186. nRet = SZ_ERROR_FAIL;
  187. }
  188. }
  189. free(pDesData);
  190. free(pSrcData);
  191. if ( nRet != SZ_OK )
  192. return FALSE;
  193. }
  194. else
  195. {
  196. return FALSE;
  197. }
  198. return TRUE;
  199. }
  200. BOOL CompressFile(CString strCompressFile, BYTE** pBuffer, INT& nLen)
  201. {
  202. //////////////////////////////////////////////////////////////////////////
  203. // 压缩文件;
  204. //////////////////////////////////////////////////////////////////////////
  205. byte prop[5] = {0};
  206. size_t nPropSize = 5;
  207. FILE* fp = fopen(strCompressFile, "rb");
  208. if ( NULL != fp )
  209. {
  210. fseek(fp, 0, SEEK_END);
  211. size_t nSrcLen = ftell(fp);
  212. fseek(fp, 0, SEEK_SET);
  213. byte* pSrcData = (byte*)malloc(nSrcLen);
  214. fread(pSrcData, nSrcLen, 1, fp);
  215. fclose(fp);
  216. size_t nDesLen = nSrcLen;
  217. byte* pDesData = (byte*)malloc(nDesLen);
  218. #ifdef USE_LIB
  219. int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, (1<<24), 8, 0, 2, 32, 2);
  220. #else
  221. int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, (1<<24), 3, 0, 2, 32, 2);
  222. #endif
  223. if ( SZ_ERROR_OUTPUT_EOF == nRet )
  224. {//申请内存不足;
  225. free(pDesData);
  226. nDesLen += nSrcLen;
  227. pDesData = (byte*)malloc(nDesLen);
  228. #ifdef USE_LIB
  229. nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 5, (1<<24), 8, 0, 2, 32, 2);
  230. #else
  231. nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, (1<<24), 3, 0, 2, 32, 2);
  232. #endif
  233. }
  234. if ( SZ_OK == nRet )
  235. {//压缩完成,保存文件;
  236. nLen = sizeof(size_t)*2 + 5 + nDesLen;
  237. if ( *pBuffer != NULL )
  238. delete *pBuffer;
  239. *pBuffer = new BYTE[nLen];
  240. memcpy(*pBuffer, g_szLzma, strlen(g_szLzma));
  241. memcpy(*pBuffer, &prop, 5);
  242. memcpy(*pBuffer + 5, &nPropSize, sizeof(size_t));
  243. memcpy(*pBuffer + 5 + sizeof(size_t), &nSrcLen, sizeof(size_t));
  244. memcpy(*pBuffer + 5 + sizeof(size_t)*2, pDesData, nDesLen);
  245. }
  246. free(pDesData);
  247. free(pSrcData);
  248. if ( nRet != SZ_OK )
  249. return FALSE;
  250. }
  251. else
  252. {
  253. return FALSE;
  254. }
  255. return TRUE;
  256. }
  257. BOOL IsCompress(CString strUnCompressFile)
  258. {
  259. TCHAR szLzma[50] = {0};
  260. CString strLama = strUnCompressFile.Mid(0,strUnCompressFile.ReverseFind('.'));
  261. FILE* fp = fopen(strUnCompressFile, "rb");
  262. if ( NULL != fp )
  263. {
  264. // 获取压缩标记;
  265. fread(szLzma, strlen(g_szLzma), 1, fp);
  266. if ( _tcscmp(szLzma, _T("#LZMA#")) != 0 )
  267. {
  268. fclose(fp);
  269. return FALSE;
  270. }
  271. fclose(fp);
  272. }
  273. return TRUE;
  274. }
  275. BOOL Uncompress(CString strUnCompressFile)
  276. {
  277. //////////////////////////////////////////////////////////////////////////
  278. // 解压文件;
  279. //////////////////////////////////////////////////////////////////////////
  280. TCHAR szLzma[50] = {0};
  281. byte prop[5] = {0};
  282. size_t nPropSize = 5;
  283. size_t nOrgSize = 0;
  284. CString strLama = strUnCompressFile.Mid(0,strUnCompressFile.ReverseFind('.'));
  285. FILE* fp = fopen(strUnCompressFile, "rb");
  286. if ( NULL != fp )
  287. {
  288. // 获取压缩文件长度;
  289. fseek(fp, 0, SEEK_END);
  290. size_t nSrcLen = ftell(fp) - 5 - sizeof(size_t)*2 - strlen(g_szLzma);
  291. // 返回头部,创建压缩缓存;
  292. fseek(fp, 0, SEEK_SET);
  293. byte* pSrcData = (byte*)malloc(nSrcLen) ;
  294. // 获取压缩标记;
  295. INT nLzmaLen = strlen(g_szLzma);
  296. fread(szLzma, nLzmaLen, 1, fp);
  297. if ( _tcscmp(szLzma, _T("#LZMA#")) != 0 )
  298. {
  299. free(pSrcData);
  300. fclose(fp);
  301. return FALSE;
  302. }
  303. // 获取prop;
  304. fseek(fp, nLzmaLen, SEEK_SET);
  305. fread(prop, 5, 1, fp);
  306. // 获取nPropSize;
  307. fseek(fp,nLzmaLen + 5, SEEK_SET);
  308. fread(&nPropSize, sizeof(size_t), 1, fp);
  309. // 获取原文件大小;
  310. fseek(fp, nLzmaLen + 5 + sizeof(size_t), SEEK_SET);
  311. fread(&nOrgSize, sizeof(size_t), 1, fp);
  312. // 读取压缩内容;
  313. fseek(fp, 5 + 2*sizeof(size_t) + strlen(g_szLzma), SEEK_SET);
  314. fread(pSrcData, nSrcLen, 1, fp);
  315. fclose(fp);
  316. size_t nDesLen = nOrgSize;//1.1*nSrcLen + 16*1024;
  317. byte* pDesData = (byte*)malloc(nDesLen);
  318. #ifdef USE_LIB
  319. int nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  320. #else
  321. int nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  322. #endif
  323. if ( SZ_ERROR_INPUT_EOF == nRet )
  324. {//申请空间不足;
  325. free(pDesData);
  326. pDesData = (byte*)malloc(nDesLen);
  327. #ifdef USE_LIB
  328. nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  329. #else
  330. nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  331. #endif
  332. }
  333. if ( SZ_OK == nRet )
  334. {//解压完成;
  335. fp = fopen(strLama, "wb+");
  336. if ( NULL != fp )
  337. {
  338. fwrite(pDesData, nDesLen, 1, fp);
  339. fclose(fp);
  340. }
  341. else
  342. {
  343. nRet = SZ_ERROR_FAIL;
  344. }
  345. }
  346. free(pSrcData);
  347. free(pDesData);
  348. if ( nRet == SZ_OK )
  349. return TRUE;
  350. }
  351. return FALSE;
  352. }
  353. /************************************************************************/
  354. /* 函数:[1/26/2018 Jeff];
  355. /* 描述:;
  356. /* 参数:;
  357. /* [IN] :;
  358. /* [OUT] :;
  359. /* [IN/OUT] :;
  360. /* 返回:void;
  361. /* 注意:;
  362. /* 示例:;
  363. /*
  364. /* 修改:;
  365. /* 日期:;
  366. /* 内容:;
  367. /************************************************************************/
  368. BOOL Uncompress(IN CString strSaveName, IN BYTE *pData, IN const size_t& nlen)
  369. {
  370. if ( pData == NULL || nlen == 0 )
  371. return FALSE;
  372. //////////////////////////////////////////////////////////////////////////
  373. // 解压文件;
  374. //////////////////////////////////////////////////////////////////////////
  375. TCHAR szLzma[50] = {0};
  376. byte prop[5] = {0};
  377. size_t nPropSize = 5;
  378. size_t nOrgSize = 0;
  379. // 获取压缩文件长度;
  380. size_t nSrcLen = nlen - 5 - sizeof(size_t)*2 - strlen(g_szLzma);
  381. // 创建压缩缓存;
  382. byte* pSrcData = (byte*)malloc(nSrcLen) ;
  383. // 获取压缩标记;
  384. INT nLzmaLen = strlen(g_szLzma);
  385. memcpy(szLzma, pData, nLzmaLen);
  386. if ( _tcscmp(szLzma, _T("#LZMA#")) != 0 )
  387. {
  388. return FALSE;
  389. }
  390. // 获取prop;
  391. memcpy(prop, pData +nLzmaLen, 5);
  392. // 获取nPropSize;
  393. memcpy(&nPropSize, pData +nLzmaLen + 5, sizeof(size_t));
  394. // 获取原文件大小;
  395. memcpy(&nOrgSize, pData +nLzmaLen + 5 + sizeof(size_t), sizeof(size_t));
  396. // 读取压缩内容;
  397. memcpy(pSrcData, pData +nLzmaLen + 5 + sizeof(size_t)*2, nSrcLen);
  398. size_t nDesLen = nOrgSize;//1.1*nSrcLen + 16*1024;
  399. byte* pDesData = (byte*)malloc(nDesLen);
  400. #ifdef USE_LIB
  401. int nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  402. #else
  403. int nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  404. #endif
  405. while ( SZ_ERROR_INPUT_EOF == nRet )
  406. {//申请空间不足;
  407. free(pDesData);
  408. pDesData = (byte*)malloc(nDesLen);
  409. #ifdef USE_LIB
  410. nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  411. #else
  412. nRet = LzmaUncompress(pDesData, &nDesLen, pSrcData, &nSrcLen, prop, nPropSize);
  413. #endif
  414. }
  415. if ( SZ_OK == nRet )
  416. {//解压完成;
  417. FILE* fp = fopen(strSaveName, "wb+");
  418. if ( NULL != fp )
  419. {
  420. fwrite(pDesData, nDesLen, 1, fp);
  421. fclose(fp);
  422. }
  423. else
  424. {
  425. nRet = SZ_ERROR_FAIL;
  426. }
  427. }
  428. free(pSrcData);
  429. free(pDesData);
  430. if ( nRet == SZ_OK )
  431. return TRUE;
  432. return FALSE;
  433. }