2

我正在尝试将“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++ 代码中调用上面的代码。

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

是否需要在上面的代码中销毁(空闲内存),还是在超出范围时自动销毁(我通常boost::scoped_ptr用来做这项工作,这里是否需要这样的东西)?

4

1 回答 1

4

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

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

然后,像调用任何其他 COM 接口一样调用该对象上的方法。(将 Delphi 的.运算符替换为->,您就大功告成了。)当引用计数达到零时,对象将被销毁,这通常发生在Arch超出范围时。

于 2013-01-14T15:56:20.650 回答