2

このDelphiラッパーと一緒に「7za.dll」を利用しようとしています-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

によって返されたものを破棄する必要がありますがCreateOutArchivescoped_ptr不適切です。代わりに、組み込みSystem::DelphiInterfaceクラスを使用します。

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

次に、他の COM インターフェイスと同じように、そのオブジェクトのメソッドを呼び出します。(Delphi の.演算子を->に置き換えれば、ほぼ完了です。) オブジェクトは、参照カウントがゼロに達すると破棄されます。これは通常Arch、スコープ外に出るときに発生します。

于 2013-01-14T15:56:20.650 に答える