d7zipは、7z.dllを使って7z書庫形式のファイルを読み書きするライブラリです。
このライブラリはクラスの設計が上手で、参考になります。
たとえば、次のように使用します。
{ d7zipで書庫を解凍するサンプルコード }
with CreateInArchive(CLSID_CFormatZip) do
begin
OpenFile('c:\test.zip');
ExtractTo('c:\test');
end;
CreateInArchive関数の返値はI7zInArchive型です。
実際の返値はTInterfacedObjectを継承しているT7zInArchive型のインスタンスです。
CreateInArchive関数は以下の点において、優れていると思います。
- T7zInArchiveを直接Createせず、オブジェクトを生成する専用の関数を用意していること
- オブジェクト生成関数がインターフェースを返すこと
これによって、
- Freeを呼ぶ必要がない。(参照カウンタによって自動的に破棄される)
- Freeを呼んでオブジェクトが二重に破棄される問題が発生いない
というメリットがあります。
(オブジェクトが二重に破棄される問題については「Delphi/interfaceを使おう/何が問題になるか? – TOBY SOFT wiki」の「問題となる例1」をご覧ください。)
そして、T7zInArchiveクラスはimplementation部で宣言されています。
ライブラリの利用者がT7zInArchiveクラスを直接使用することはできません。
CreateInArchive関数によって、簡潔でトラブルが発生しにくいコードを書くことができるようになっています。