【问题标题】:Using 7zip Delphi wrapper from C++ Builder使用 C++ Builder 中的 7zip Delphi 包装器
【发布时间】:2013-01-14 15:17:52
【问题描述】:

我正在尝试将“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 来完成这项工作,这里需要类似的东西吗)?

【问题讨论】:

  • 那不是将 C++ 代码的 Delphi 包装器的 C++ 包装器吗?为什么不使用 7zip C++ SDK?
  • 我知道,这并不理想。但是速度不是问题,我进行了搜索,但找不到可以在 C++ Builder 中使用的一些像样的文档简单示例(它们都用于 Visual Studio)。 7za.dll 使用的 COM 接口不是标准的 Windows COM,但有些不同。如果您有一个基本上可以完成上述操作的简短示例,我将非常感激学习新事物,但现在这行得通。
  • 速度不是我想到的问题。只是它的笨拙。不明白为什么 VS 示例在 C++ Builder 中不起作用。无论如何,这只是我的想法。

标签: delphi wrapper c++builder 7zip


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,一切正常,调试器还在函数退出时显示 7za.dll 的模块卸载,所以我想一切都已清理干净,只是一个小错字,它是接口而不是 Iterface :)
猜你喜欢
  • 2013-04-11
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多