トップへ(mam-mam.net/)

Delphi2009からUNLHA32.DLLを使いたい(UNLHA32.DLLはH, Micco様の著作物です)

検索:

「Delphi2009からUNLHA32.DLLを使いたい(UNLHA32.DLLはH, Micco様の著作物です)」

エンバカデロ社のDelphi2009からUNLHA32.DLLを使いたいのですが、どうすればいいですか?
(UNLHA32.DLLはH, Micco様の著作物です)

回答

DelphiからDLLを扱うことは、静的リンク、動的リンクともに可能です。
UNLHA32.DLL(UNLHA32.DLLはH, Micco様の著作物です)を使う場合は
UNLHA32.DLLをどのような使いたいかによって使用方法が変わりますので、
今回は必要なファイルはすべて1つのフォルダに入れてしまった後にそのフォルダを圧縮するとします。
また、UNLHA32.DLLファイルはパスの通った
フォルダ(Windowsフォルダ、System32フォルダなど)にあるものとします。

ソース

unit Unit2;

interface
uses windows;

Type
  TUnlhaA=function(
    const _hwnd: HWND;
          _szCmdLine: PAnsiChar;
          _szOutput: PAnsiChar;
    const _wSize: longint): integer; stdcall;
  TUnlhaW=function(
    const _hwnd: HWND;
          _szCmdLine: PChar;
          _szOutput: PChar;
    const _wSize: longint): integer; stdcall;
  TUnlha=TUnlhaA;

//AnsiString(SJIS)用の関数
function UnLhaCompress(Handle:THandle;path,srcFolder, DestFile: AnsiString):AnsiString;
//String(Unicode)用の関数
function UnLhaCompressW(Handle:THandle;path,srcFolder, DestFile: string):String;

implementation

function UnLhaCompress(Handle:THandle;path,srcFolder, DestFile: AnsiString):AnsiString;
var lhaHandle:THandle;
    r:AnsiString;
    comm:AnsiString;
    Unlha:TUnlha;
begin
  lhaHandle:=LoadLibrary('UNLHA32.DLL');//動的リンク
  if lhaHandle=0 then
  begin
    result:='UNLHA32.DLLファイルがありません。';
    exit;
  end
  else
  begin
    @Unlha:=GetProcAddress(lhaHandle,'Unlha');
    if @Unlha=nil then
    begin
      result:='UNLHA32.DLLのバージョンが古い等のエラー';
      FreeLibrary(lhaHandle);
      lhaHandle:=0;
      exit;
    end;
  end;
  comm:='a "'+DestFile+'" -x1r2a2 "'+path+'" "'+srcFolder+'"';
  setlength(r,1024);
  Unlha(Handle,PAnsiChar(comm),PAnsiChar(r),1023);
  result:=PAnsiChar(r);
  if lhaHandle<>0 then
    FreeLibrary(lhaHandle);
  if Pos('Frozen',r)=0 then
  begin
    result:='指定したフォルダが無い、ファイルが生成できない等のエラー';
  end;
end;

function UnLhaCompressW(Handle:THandle;path,srcFolder, DestFile: string):String;
var lhaHandle:THandle;
    r:String;
    comm:String;
    UnlhaW:TUnlhaW;
begin
  lhaHandle:=LoadLibrary('UNLHA32.DLL');
  if lhaHandle=0 then
  begin
    result:='UNLHA32.DLLファイルがありません。';
    exit;
  end
  else
  begin
    @UnlhaW:=GetProcAddress(lhaHandle,'UnlhaW');
    if @UnlhaW=nil then
    begin
      result:='UNLHA32.DLLのバージョンが古い等のエラー';
      FreeLibrary(lhaHandle);
      lhaHandle:=0;
      exit;
    end;
  end;
  comm:='a "'+DestFile+'" -x1r2a2 "'+path+'" "'+srcFolder+'"';
  setlength(r,1024);
  UnlhaW(Handle,PChar(comm),PChar(r),1023);
  result:=PChar(r);
  if lhaHandle<>0 then
    FreeLibrary(lhaHandle);
  if Pos('Frozen',r)=0 then
  begin
    result:='指定したフォルダが無い、ファイルが生成できない等のエラー';
  end;
end;
end.


//上記関数の使い方
//  Handle:ウィンドウハンドル
//    アイコンが時計になるウィンドウ
//    指定できないときは0を指定
//  path:圧縮するフォルダの存在するフォルダ
//    (例)c:\windows\system32 フォルダを圧縮する場合は
//          c:\windows\
//          と指定する[最後の\を必ず指定すること]
//  srcFolder:圧縮するフォルダを指定する
//    (例)c:\windows\system32 フォルダを圧縮する場合は
//          system32
//          と指定する
//  DestFile:圧縮フォルダ名をフルパスで指定する
//    (例)c:\abc.lzh
//
//C:\Test\テストフォルダ を圧縮して、C:\圧縮後ファイル.LZH ファイルを生成する場合
//最初の引数のHandleはウィンドウハンドルです。ウィンドウハンドルを渡すと、圧縮中に
//マウスカーソルがちゃんと時計になります。
//渡さない場合は0を指定。
procedure TForm1.Button1Click(Sender: TObject);
begin
  //ファイルを事前に消さないと、アーカイブへの追加・更新になります。
  DeleteFile('C:\圧縮後ファイル.LZH');
  showmessage(
    UnLhaCompressW(Self.Handle,'C:\Test\','テストフォルダ','C:\圧縮後ファイル.LZH')
  );
end;