16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:CAB形式のファイル圧縮・解凍"
この発言は #00814 河邦 正 さんのCAB形式のファイル圧縮・解凍 に対するコメントです
nifty:FDELPHI/MES/16/814 の「CAB形式のファイル圧縮・解凍」の
内容の一部(解凍の利用例)を訂正します。
CabinetExtractFile を以下のように訂正します。
type
TMyParam = record
Item: string;
ExtractName: string;
end;
function fnFDINotify(fdint: TFDINOTIFICATIONTYPE;
pfdin: PFDINOTIFICATION): Integer; cdecl;
var
os: OFSTRUCT;
Param: ^TMyParam;
begin
Param := pfdin.pv;
begin
case(fdint)of
fdintCOPY_FILE:
if CompareText(pfdin^.psz1, Param^.Item) = 0 then
Result := OpenFile(PChar(Param^.ExtractName), os, OF_CREATE)
else
Result := 0;
fdintCLOSE_FILE_INFO:
begin // 本来はここでファイルの属性などを設定します
_lclose(pfdin^.hf);
pfdin^.cb := 1; // continue
Result := 1; // こっちが continue の指定?
end;
else // できれば他の NotificationType にも応答する方が良いはず
Result := 0;
end;
end;
end;
procedure CabinetExtractFile(Cabinet, Item, ExtractName: string);
var
fdi: THandle;
erf: TERF;
Param: TMyParam;
begin
ZeroMemory(@erf, sizeof(erf));
// コンテキストの構築にコールバック関数を用います
fdi := FDICreate(@fnAlloc, @fnFree, @fnOpen, @fnRead, @fnWrite,
@fnClose, @fnSeek,-1, erf);
if fdi <> 0 then
try
Param.Item := Item;
Param.ExtractName := ExtractName;
FDICopy(fdi, PChar(ExtractFileName(Cabinet)),
PChar(ExtractFilePath(Cabinet)), 0, @fnFDINotify, nil,
@Param);
finally
// 使用済みコンテキストの破棄
FDIDestroy(fdi);
end;
end;
※変更点は、ユーザー定義の情報のコールバック関数への受け渡し方法
を、関数内関数による親関数の引数参照から、本来あるべき方式(コー
ルバック関数のアドレスを引数で渡す際に、同じく引数で渡される構造体
に含める)にしたことです。
2001/06/07、河邦 正(GCC02240@nifty.com)
(http://homepage2.nifty.com/kht0000/、NIFTY外へ私作のComponentの
公開用)
Original document by 河邦 正 氏 ID:(GCC02240)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|