7Z源码分析——7zAlloc.h和7zAlloc.c

7zAlloc.h声明了四个函数,用来申请和释放内存,其中输入参数ISzAllocPtr p的类型在头文件7zTypes.h中定义。
7zAlloc.c中实现了7zAlloc.h中声明的四个函数,该文件中还定义了全局变量g_allocCount和g_allocCountTemp,其实这两个全局变量只是方便调试(从打印的变量信息来观测程序是否正常),功能上没有实际意义。

void *SzAlloc(ISzAllocPtr p, size_t size)
{
  UNUSED_VAR(p);
  if (size == 0)
    return 0;
  #ifdef _SZ_ALLOC_DEBUG
  fprintf(stderr, "\nAlloc %10u bytes; count = %10d", (unsigned)size, g_allocCount);
  g_allocCount++;
  #endif
  return malloc(size);
}

void SzFree(ISzAllocPtr p, void *address)
{
  UNUSED_VAR(p);
  #ifdef _SZ_ALLOC_DEBUG
  if (address != 0)
  {
    g_allocCount--;
    fprintf(stderr, "\nFree; count = %10d", g_allocCount);
  }
  #endif
  free(address);
}

void *SzAllocTemp(ISzAllocPtr p, size_t size)
{
  UNUSED_VAR(p);
  if (size == 0)
    return 0;
  #ifdef _SZ_ALLOC_DEBUG
  fprintf(stderr, "\nAlloc_temp %10u bytes;  count = %10d", (unsigned)size, g_allocCountTemp);
  g_allocCountTemp++;
  #ifdef _WIN32
  return HeapAlloc(GetProcessHeap(), 0, size);
  #endif
  #endif
  return malloc(size);
}

void SzFreeTemp(ISzAllocPtr p, void *address)
{
  UNUSED_VAR(p);
  #ifdef _SZ_ALLOC_DEBUG
  if (address != 0)
  {
    g_allocCountTemp--;
    fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp);
  }
  #ifdef _WIN32
  HeapFree(GetProcessHeap(), 0, address);
  return;
  #endif
  #endif
  free(address);
}

上述函数是对malloc函数和free函数,HeapAlloc函数和HeapFree函数的封装,都是为了申请和释放内存,关于两者有何区别,可以参考内存分配详解 malloc, new, HeapAlloc, VirtualAlloc,GlobalAlloc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用7z的解压函数来完成解压操作。下面是一个简单的示例代码,实现从tar.gz压缩包解压出所有文件: ```c++ #include <iostream> #include <Windows.h> #include "7z.h" #include "7zFile.h" #include "7zAlloc.h" int main() { const wchar_t* archivepath = L"path/to/your/archive.tar.gz"; const wchar_t* outdir = L"path/to/output/directory"; HANDLE hArchive = CreateFileW(archivepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hArchive == INVALID_HANDLE_VALUE) { std::cerr << "Failed to open archive: " << GetLastError() << std::endl; return 1; } CFileInStream archiveStream; archiveStream.file = hArchive; archiveStream.s.Read = [](void* p, void* buf, size_t size, size_t* processedSize) -> SRes { HANDLE handle = ((CFileInStream*)p)->file; if (!ReadFile(handle, buf, (DWORD)size, (DWORD*)processedSize, NULL)) { return SZ_ERROR_READ; } return SZ_OK; }; CArchiveLink archiveLink; archiveLink.InStream = &archiveStream.s; archiveLink.InStream->Seek(&archiveStream.s, 0, SEEK_SET); archiveLink.Arc.LibOpen = [](const wchar_t* name, int mode) -> void* { return NULL; // no need to open shared library on Windows }; archiveLink.Arc.LibClose = [](void* lib) -> int { return 0; // no need to close shared library on Windows }; archiveLink.Arc.LibSym = [](void* lib, const char* name) -> void* { return NULL; // no need to get function address on Windows }; ISzAlloc allocImp = { SzAlloc, SzFree }; ISzAlloc tempAllocImp = { SzAllocTemp, SzFreeTemp }; CMyComPtr<IInArchive> archive; HRESULT hr = CreateObject(CLASS_CFormat7z, &IID_IInArchive, (void**)&archive); if (hr != S_OK) { std::cerr << "Failed to create archive object: " << hr << std::endl; CloseHandle(hArchive); return 1; } hr = archive->Open(&archiveLink.Arc, &allocImp, &tempAllocImp); if (hr != S_OK) { std::cerr << "Failed to open archive: " << hr << std::endl; CloseHandle(hArchive); return 1; } UInt32 numItems = 0; hr = archive->GetNumberOfItems(&numItems); if (hr != S_OK) { std::cerr << "Failed to get number of items in archive: " << hr << std::endl; CloseHandle(hArchive); return 1; } for (UInt32 i = 0; i < numItems; i++) { CMyComPtr<IArchiveExtractCallback> extractCallback = new CArchiveExtractCallback(outdir); hr = archive->Extract(&i, 1, false, extractCallback); if (hr != S_OK) { std::cerr << "Failed to extract item " << i << " from archive: " << hr << std::endl; } } archive->Close(); CloseHandle(hArchive); return 0; } ``` 这段代码包含了7z库的头文件以及函数调用,需要在编译时链接7z库。可以使用以下命令来编译: ``` g++ -o extract extract.cpp -l7z ``` 其extract.cpp是保存上述代码的文件名,extract是可执行文件的名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值