InfoZip.cpp
Upload User: hzweiye
Upload Date: 2022-05-26
Package Size: 4688k
Code Size: 9k
Development Platform:

Visual C++

  1. // InfoZip.cpp: implementation of the CInfoZip class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "InfoZip.h"
  6. #include <winbase.h>
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CInfoZip::CInfoZip()
  16. {
  17. m_ZipDllHandle       = NULL;
  18. m_ZipDllExec         = NULL;
  19. m_GetZipDllVersion   = NULL;
  20. m_UnzipDllHandle     = NULL;
  21. m_UnzipDllExec       = NULL;
  22. m_GetUnzipDllVersion = NULL;
  23. }
  24. CInfoZip::~CInfoZip()
  25. {
  26. Finalize();
  27. }
  28. int CInfoZip::GetZipDllVersion()
  29. {
  30. if (GetInitializedZip())
  31. return m_GetZipDllVersion();
  32. else
  33. {
  34. SetLastError(ZERROR_NOT_INITIALIZED);
  35. return 0;
  36. }
  37. }
  38. int CInfoZip::GetUnzipDllVersion()
  39. {
  40. if (GetInitializedUnzip())
  41. return m_GetUnzipDllVersion();
  42. else
  43. {
  44. SetLastError(ZERROR_NOT_INITIALIZED);
  45. return 0;
  46. }
  47. }
  48. void CInfoZip::SetLastError(UINT uiError)
  49. {
  50. m_uiLastError = uiError;
  51. }
  52. UINT CInfoZip::GetLastError()
  53. {
  54. return m_uiLastError;
  55. }
  56. BOOL CInfoZip::Initialize()
  57. {
  58. return InitializeZip() && InitializeUnzip();
  59. }
  60. BOOL CInfoZip::GetInitialized()
  61. {
  62. return GetInitializedZip() && GetInitializedUnzip();
  63. }
  64. BOOL CInfoZip::Finalize()
  65. {
  66. return FinalizeZip() && FinalizeUnzip();
  67. }
  68. void CInfoZip::SetDefaultValues(CZipParams * pParams)
  69. {
  70. pParams->m_hwndHandle = NULL;
  71. pParams->m_pCaller = NULL;
  72. pParams->m_liVersion = GetZipDllVersion();
  73. pParams->m_pfCallbackFunction = DefaultZipCallback;
  74. pParams->m_bTraceEnabled = FALSE;
  75. /*============== Begin Zip Flag section ============== */
  76. pParams->m_pszZipPassword = NULL;
  77. pParams->m_bSuffix = FALSE;
  78. pParams->m_bEncrypt = FALSE;
  79. pParams->m_bSystem = FALSE;
  80. pParams->m_bVolume = FALSE;
  81. pParams->m_bExtra = FALSE;
  82. pParams->m_bNoDirEntries = FALSE;
  83. pParams->m_bDate = FALSE;
  84. pParams->m_bVerboseEnabled = FALSE;
  85. pParams->m_bQuiet = FALSE;
  86. pParams->m_bLevel = 9;
  87. pParams->m_bComprSpecial = FALSE;
  88. pParams->m_bCRLF_LF = FALSE;
  89. pParams->m_bJunkDir = FALSE;
  90. pParams->m_bRecurse = FALSE;
  91. pParams->m_bGrow = TRUE;
  92. pParams->m_bForce = FALSE;
  93. pParams->m_bMove = FALSE;
  94. pParams->m_bDeleteEntries = FALSE;
  95. pParams->m_bUpdate = FALSE;
  96. pParams->m_bFreshen = FALSE;
  97. pParams->m_bJunkSFX = FALSE;
  98. pParams->m_bLatestTime = FALSE;
  99. /*============== End Zip Flag section ============== */
  100. for (int j=0; j<8; j++)
  101. pParams->m_cDate[j] = 0;
  102. pParams->m_liFileCount = 0;
  103. pParams->m_pszArchiveFileName = NULL;
  104. pParams->m_liSeven = 7;
  105. // char *PFileNames[MAX_PATH+1];
  106. }
  107. BOOL CInfoZip::Execute(CZipParams * pParams)
  108. {
  109. if (!GetInitializedZip())
  110. return FALSE;
  111. m_ZipDllExec(pParams);
  112. return TRUE;
  113. }
  114. BOOL CInfoZip::AddFiles(const char *pszArchive, char ** paFiles, int iFileCount)
  115. {
  116. CZipParams zpParams;
  117. SetDefaultValues(&zpParams);
  118. //  seting archive name
  119. zpParams.m_pszArchiveFileName = (char*)malloc(strlen(pszArchive)+1);
  120. ZeroMemory(zpParams.m_pszArchiveFileName, strlen(pszArchive)+1);
  121. //strcpy(zpParams.m_pszArchiveFileName, pszArchive);
  122.     memcpy(zpParams.m_pszArchiveFileName, pszArchive,strlen(pszArchive));
  123. // seting file count
  124. zpParams.m_liFileCount   = iFileCount;
  125. //  seting file names
  126. for (int i=0; i<iFileCount; i++)
  127. {
  128. zpParams.m_pszFileNames[i] = (char*)malloc(MAX_PATH+1);
  129. ZeroMemory(zpParams.m_pszFileNames[i], MAX_PATH+1);
  130. // strcpy(zpParams.m_pszFileNames[i], paFiles[i]);
  131. memcpy(zpParams.m_pszFileNames[i], paFiles[i],strlen(paFiles[i]));
  132. }
  133. //  executing command
  134. int iProcessedCount = m_ZipDllExec(&zpParams);
  135. ReleaseParams(&zpParams);
  136. return (iProcessedCount == iFileCount);
  137. }
  138. BOOL __stdcall DefaultZipCallback(CZipCallbackData *pData)
  139. {
  140. if (pData->m_liErrorCode)
  141. {
  142. char pszErrorCode[1024];
  143. sprintf(pszErrorCode, "Zip error %d:n%s", pData->m_liErrorCode, pData->m_pszFileNameOrMsg);
  144. AfxMessageBox(pszErrorCode);
  145. }
  146. return FALSE;
  147. }
  148. void CInfoZip::ReleaseParams(CZipParams * pParams)
  149. {
  150. free(pParams->m_pszArchiveFileName);
  151. for (int i=0; i<pParams->m_liFileCount; i++)
  152. free(pParams->m_pszFileNames[i]);
  153. }
  154. BOOL CInfoZip::GetInitializedZip()
  155. {
  156. return m_ZipDllHandle && m_GetZipDllVersion && m_ZipDllExec;
  157. }
  158. BOOL CInfoZip::GetInitializedUnzip()
  159. {
  160. return m_UnzipDllHandle && m_GetUnzipDllVersion && m_UnzipDllExec;
  161. }
  162. BOOL CInfoZip::InitializeZip()
  163. {
  164. BOOL bInitialized = GetInitializedZip();
  165. if (GetInitializedUnzip())
  166. return TRUE;
  167. m_ZipDllHandle = LoadLibrary("ZIPDLL.DLL");
  168. if (!m_ZipDllHandle)
  169. {
  170. SetLastError(ZERROR_DLL_NOT_FOUND);
  171. return FALSE;
  172. }
  173. m_GetZipDllVersion  = (CGetZipDllVersion)GetProcAddress(m_ZipDllHandle, "GetZipDllVersion");
  174. if (!m_GetZipDllVersion)
  175. {
  176. SetLastError(ZERROR_DLL_FOUNCTION_NOT_FOUND);
  177. return FALSE;
  178. }
  179. m_ZipDllExec = (CZipDllExec)GetProcAddress(m_ZipDllHandle, "ZipDllExec");
  180. if (!m_ZipDllExec)
  181. {
  182. SetLastError(ZERROR_DLL_FOUNCTION_NOT_FOUND);
  183. return FALSE;
  184. }
  185. return TRUE;
  186. }
  187. BOOL CInfoZip::InitializeUnzip()
  188. {
  189. BOOL bInitialized = GetInitializedUnzip();
  190. if (GetInitializedUnzip())
  191. return TRUE;
  192. if(access("UNZDLL.DLL",0)!=0)
  193. {
  194. printf("没有找到UNZDLL.DLL!");
  195. return FALSE;
  196. }
  197. m_UnzipDllHandle = LoadLibrary("UNZDLL.DLL");
  198. if (!m_UnzipDllHandle)
  199. {
  200. SetLastError(ZERROR_DLL_NOT_FOUND);
  201. return FALSE;
  202. }
  203. m_GetUnzipDllVersion  = (CGetUnzipDllVersion)GetProcAddress(m_UnzipDllHandle, "GetUnzDllVersion");
  204. if (!m_GetUnzipDllVersion)
  205. {
  206. SetLastError(ZERROR_DLL_FOUNCTION_NOT_FOUND);
  207. return FALSE;
  208. }
  209. m_UnzipDllExec = (CUnzipDllExec)GetProcAddress(m_UnzipDllHandle, "UnzDllExec");
  210. if (!m_UnzipDllExec)
  211. {
  212. SetLastError(ZERROR_DLL_FOUNCTION_NOT_FOUND);
  213. return FALSE;
  214. }
  215. return TRUE;
  216. }
  217. BOOL CInfoZip::FinalizeZip()
  218. {
  219. if (GetInitializedZip())
  220. {
  221. FreeLibrary(m_ZipDllHandle);
  222. m_ZipDllHandle       = NULL;
  223. m_ZipDllExec         = NULL;
  224. m_GetZipDllVersion   = NULL;
  225. }
  226. return TRUE;
  227. }
  228. BOOL CInfoZip::FinalizeUnzip()
  229. {
  230. if (GetInitializedUnzip())
  231. {
  232. FreeLibrary(m_UnzipDllHandle);
  233. m_UnzipDllHandle       = NULL;
  234. m_UnzipDllExec         = NULL;
  235. m_GetUnzipDllVersion   = NULL;
  236. }
  237. return TRUE;
  238. }
  239. BOOL CInfoZip::Execute(CUnzipParams * pParams)
  240. {
  241. if (!GetInitializedUnzip())
  242. return FALSE;
  243. m_UnzipDllExec(pParams);
  244. return TRUE;
  245. }
  246. void CInfoZip::ReleaseParams(CUnzipParams * pParams)
  247. {
  248. free(pParams->m_pszArchiveFileName);
  249. for (int i=0; i<pParams->m_liFileCount; i++)
  250. free(pParams->m_pszFileNames[i]);
  251. }
  252. void CInfoZip::SetDefaultValues(CUnzipParams * pParams)
  253. {
  254. pParams->m_wndHandle          = NULL;
  255. pParams->m_pCaller            = NULL;
  256. pParams->m_liVersion          = GetUnzipDllVersion();
  257. pParams->m_pfCallbackFunction = DefaultZipCallback;
  258. pParams->m_bTraceEnabled = FALSE;
  259. pParams->m_bPromptToOverwrite = FALSE;
  260. pParams->m_pszZipPassword     = NULL;
  261. pParams->m_bTest              = FALSE;
  262. pParams->m_bComments          = FALSE;
  263. pParams->m_bConvert           = FALSE;
  264. pParams->m_bQuiet             = FALSE;
  265. pParams->m_bVerboseEnabled    = FALSE;
  266. pParams->m_bUpdate            = FALSE;
  267. pParams->m_bFreshen           = FALSE;
  268. pParams->m_bDirectories       = TRUE;
  269. pParams->m_bOverwrite         = TRUE;
  270. pParams->m_liFileCount        = 0;
  271. pParams->m_pszArchiveFileName = NULL;
  272. pParams->m_liSeven            = 7;
  273. }
  274. BOOL CInfoZip::ExtractFiles(const char * pszArchive, const char * pszTargetFolder)
  275. {
  276. char pszCurrentDir[MAX_PATH+1],pszArchivee[MAX_PATH+1];
  277. int iProcessedCount;
  278. CUnzipParams uzpParams;
  279. /////////
  280. ZeroMemory(pszCurrentDir, MAX_PATH+1);
  281. GetCurrentDirectory(MAX_PATH+1, pszCurrentDir);
  282. SetCurrentDirectory(pszTargetFolder);
  283.    
  284. /////check pszArchive
  285. ZeroMemory(pszArchivee, MAX_PATH+1);
  286. memcpy(pszArchivee, pszArchive,strlen( pszArchive));
  287. if(access(pszArchivee,0)!=0)
  288. {
  289. ZeroMemory(pszArchivee, MAX_PATH+1);
  290. sprintf(pszArchivee,"%s\%s",pszCurrentDir,pszArchive);
  291. }
  292. if(access(pszArchivee,0)!=0)
  293. {
  294. printf("找不到文件:%s",pszArchive);
  295. return false;
  296. }
  297. //////
  298. SetDefaultValues(&uzpParams);
  299.     /////seting archive name
  300. uzpParams.m_pszArchiveFileName = (char*)malloc(strlen(pszArchivee)+1);
  301. ZeroMemory(uzpParams.m_pszArchiveFileName, strlen(pszArchivee)+1);
  302. memcpy(uzpParams.m_pszArchiveFileName, pszArchivee,strlen( pszArchivee));
  303.     //seting file count
  304. uzpParams.m_liFileCount = 1;
  305.     //seting file names
  306. uzpParams.m_pszFileNames[0] = (char*)malloc(MAX_PATH+1);
  307. ZeroMemory(uzpParams.m_pszFileNames[0], MAX_PATH+1);
  308. memcpy(uzpParams.m_pszFileNames[0], "*.*",3);
  309.     //executing command
  310. iProcessedCount = m_UnzipDllExec(&uzpParams);
  311. ReleaseParams(&uzpParams);
  312. SetCurrentDirectory(pszCurrentDir);
  313. if(iProcessedCount==0)
  314. {
  315. printf("解压错误(%s ===>>> %s)",pszArchivee,pszTargetFolder);
  316. return false;
  317. }
  318. return TRUE;
  319. }