⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testlib.cpp

📁 由7-zip提供的压缩、解压缩程序
💻 CPP
字号:
#include "StdAfx.h"// #include "../../../Common/MyInitGuid.h"#include "../../../Common/ComTry.h"#include "../../ICoder.h"#include "../../Common/FileStreams.h"#include "Windows/PropVariant.h"#include "../../Archive/IArchive.h"#include "Common/MyCom.h"#include "7zip/PropID.h"#include "Common/String.h"/* #include "7zHandler.h" */#include <vector>#include "../../Common/FileStreams.cpp"const UInt64 kMaxCheckStartPosition = #ifdef _WIN321 << 20;#else1 << 22;#endifUInt64 ConvertPropVariantToUInt64(const PROPVARIANT &propVariant){  switch (propVariant.vt)  {    case VT_UI1:      return propVariant.bVal;    case VT_UI2:      return propVariant.uiVal;    case VT_UI4:      return propVariant.ulVal;    case VT_UI8:      return (UInt64)propVariant.uhVal.QuadPart;    default:      #ifndef _WIN32_WCE      throw 151199;      #else      return 0;      #endif  }}STDAPI CreateObject(    const GUID *classID,     const GUID *interfaceID,     void **outObject);STDAPI GetHandlerProperty(PROPID propID, PROPVARIANT *value);class CExtractCallback : public IArchiveExtractCallback , public CMyUnknownImp{CMyComPtr<IInArchive> _archiveHandler;public:  // MY_UNKNOWN_IMP ;  virtual LONG QueryInterface (const GUID & iid, void **outObject) {   return ((LONG)0x80004002L);  }  virtual ULONG AddRef() { return ++__m_RefCount; }  virtual ULONG Release() {      if (--__m_RefCount != 0) return __m_RefCount;     delete this;     return 0;   }  //  CExtractCallback(IInArchive *archive)  {    _archiveHandler = archive;  }  STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream,       Int32 askExtractMode)   {	NWindows::NCOM::CPropVariant propVariant;	HRESULT res = _archiveHandler->GetProperty(index, kpidPath, &propVariant);	if (res != S_OK) return res;	if (propVariant.vt == VT_BSTR)	{		UString fullPath;		fullPath = propVariant.bstrVal;		*outStream = 0;		res = _archiveHandler->GetProperty(index, kpidSize, &propVariant);		if (res == S_OK)		{			UInt64 newFileSize = ConvertPropVariantToUInt64(propVariant);			printf("GetStream(%d)='%ls' (%ld)\n",index,&fullPath[0],(long)newFileSize);		} else {			printf("GetStream(%d)='%ls' (no size)\n",index,&fullPath[0]);		}		return S_OK;	}	printf("GetStream : E_FAIL !\n");	return E_FAIL;   }  // GetStream OUT: S_OK - OK, S_FALSE - skeep this file  STDMETHOD(PrepareOperation)(Int32 askExtractMode)   {		printf("PrepareOperation(%d)\n",askExtractMode);		return S_OK;   }  STDMETHOD(SetOperationResult)(Int32 resultEOperationResult)   {		printf("SetOperationResult(%d)\n",resultEOperationResult);		return S_OK;   }  STDMETHOD(SetTotal)(UInt64 total)   {		printf("SetTotal(%ld)\n",(long)total);		return S_OK;   }  STDMETHOD(SetCompleted)(const UInt64 *completeValue)   {		printf("SetCompleted(%ld)\n",(long)(*completeValue));		return S_OK;   }};static void showProperty(const char *name,PROPID propID){	NWindows::NCOM::CPropVariant prop;	if (GetHandlerProperty(propID, &prop) == S_OK)	{		if (prop.vt == VT_BSTR)		{			printf("%s:'%ls'\n",name,(const wchar_t *)prop.bstrVal);		}		prop.Clear();	}}static void showBoolProperty(const char *name,PROPID propID){	NWindows::NCOM::CPropVariant prop;	if (GetHandlerProperty(propID, &prop) == S_OK)	{		if (prop.vt == VT_BOOL)		{			printf("%s: %s\n",name,(prop.boolVal == VARIANT_FALSE ? "False" : "True"));		}		prop.Clear();	}}int main(int argc,char *argv[]){	if (argc != 2) {		printf("usage : %s archive.7z\n",argv[0]);		exit(EXIT_FAILURE);	}	showProperty("NArchive::kName",NArchive::kName);	showProperty("NArchive::kExtension",NArchive::kExtension);	// ? showProperty("NArchive::kAddExtension",NArchive::kAddExtension);	showBoolProperty("NArchive::kUpdate",NArchive::kUpdate);	showBoolProperty("NArchive::kKeepName",NArchive::kKeepName);	// BSTR showProperty("NArchive::kStartSignature",NArchive::kStartSignature);	// GUID showProperty("NArchive::kClassID",NArchive::kClassID);	NWindows::NCOM::CPropVariant prop;	CLSID ClassID;	CMyComPtr<IInArchive> archive;	if (GetHandlerProperty(NArchive::kClassID, &prop) == S_OK)	{		if (prop.vt == VT_BSTR)		{			ClassID = *(const GUID *)prop.bstrVal;		}		prop.Clear();	}		HRESULT result = CreateObject(&ClassID, &IID_IInArchive,(void **)&archive);	if (result == S_OK)	{		const char *filePath=argv[1];		printf("ArchiveIn : OK\n");		CInFileStream *fileSpec = new CInFileStream;		CMyComPtr<IInStream> file = fileSpec;		if (!fileSpec->Open(filePath))		{			printf("error : '%s' (%d)\n",filePath,GetLastError());		} else {			printf("Opening : '%s'\n",filePath);			result = archive->Open(file, &kMaxCheckStartPosition, 0 /* openArchiveCallback*/ );			if (result == S_OK)			{				UInt32 numItems;				result = archive->GetNumberOfItems(&numItems);				if (result == S_OK)				{					printf("GetNumberOfItems : %d\n",(int)numItems);					std::vector<UInt32> tabIndex;					for(UInt32 index = 0; index < numItems ; index++)					{						result = archive->GetProperty(index, kpidPath, &prop);						if (prop.vt == VT_BSTR)						{							printf("%d :'%ls'\n",index,(const wchar_t *)prop.bstrVal);						}						prop.Clear();						result = archive->GetProperty(index, kpidIsFolder, &prop);						if (prop.vt == VT_BOOL)						{							printf("\tIsFolder %s\n",(prop.boolVal == VARIANT_FALSE ? "False" : "True"));							if (prop.boolVal == VARIANT_FALSE) tabIndex.push_back(index);						}						prop.Clear();					}					if (tabIndex.size() >= 1)					{						printf("Testing %d files\n",(int)tabIndex.size());						CExtractCallback * extractCallbackSpec = new CExtractCallback(archive);						// 1 : test mode						// 0 : extract						result = archive->Extract(&tabIndex[0], (UInt32)tabIndex.size(),1,extractCallbackSpec);						if (result == S_OK) printf(" Extract : OK\n");						else                printf(" Extract : BAD\n");						// extractCallbackSpec is already deleted by archive->Extract					}					} else {					printf("ERROR in GetNumberOfItems\n");				}			} else {				printf("ERROR in archive->Open\n");			}		}	}	return 0;}/*UI/Common/Extract.cppDecompressArchive*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -