繁体   English   中英

使用C ++ Builder中的7zip Delphi包装器

[英]Using 7zip Delphi wrapper from C++ Builder

我正在尝试将“ 7za.dll”与此Delphi包装器一起使用-http://www.progdigy.com/?page_id =13

在将此代码转换为C ++和理解包装器本身方面遇到困难:

procedure TMainForm.ExtractAllClick(Sender: TObject);
  var Arch: I7zOutArchive;
begin
  Arch := CreateOutArchive(CLSID_CFormat7z);
  // add a file
  Arch.AddFile('c:\test.bin', 'folder\test.bin');
  // add files using willcards and recursive search
  Arch.AddFiles('c:\test', 'folder', '*.pas;*.dfm', true);
  // add a stream
  Arch.AddStream(aStream, soReference, faArchive, CurrentFileTime, CurrentFileTime, 'folder\test.bin', false, false);
  // compression level
  SetCompressionLevel(Arch, 5);
  // compression method if <> LZMA
  SevenZipSetCompressionMethod(Arch, m7BZip2);
  // add a progress bar ...
  Arch.SetProgressCallback(...);
  // set a password if necessary
  Arch.SetPassword('password');
  // Save to file
  Arch.SaveToFile('c:\test.zip');
  // or a stream
  Arch.SaveToStream(aStream);
end;

我已经制作了包装Delphi单元的附加包装器,当包含在C ++代码中时,该包装器就可以正常工作了。 现在,我想进一步使用它-直接在C ++代码中调用上面的代码。

如何在C ++中正确初始化,构造和释放此I7zOutArchive接口?

是否需要销毁上述代码中的(空闲内存),还是在超出范围时自动删除(我通常使用boost::scoped_ptr来完成这项工作,此处需要类似的东西)吗?

您确实需要销毁CreateOutArchive返回的CreateOutArchive ,但是scoped_ptr不合适。 而是使用内置的System::DelphiInterface类:

System::DelphiInterface<I7zOutArchive> Arch = CreateOutArchive(CLSID_CFormat7z);

然后,对该对象上的调用方法与其他任何COM接口相同。 (用->替换Delphi的.运算符,您就可以使用它的大部分方式。)当引用计数达到零时,对象将被销毁,通常在Arch超出范围时发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM