自己解凍書庫の作り方
OrangeArchiverには自己解凍書庫のソースは付いてません(^^;;
Oar32.dll のほうには付いています(自己解凍書庫の実質的な内容は同じ)。
ところで、自己解凍書庫を自作するときには解凍部分のアルゴリズムを書かなければなりません(ライブラリを使ってもかまいませんが、別途外部DLL等を必要とするものであってはいけません。環境依存しない、Windowsプレインストール時に入っているようなDLLならOK)。
アルゴリズム部分はここでは省いて、流れだけ解説しておきます。
(自己解凍書庫は基本的に EXEの部分 + 書庫の部分 に分けることができます)
●自己解凍書庫のEXEの部分を作成する
1. GUIでもCUIでもOKなので、解凍先のパスを入力してもらえるようにコーディング。
2. 解凍がリクエストされたら
a. 自分自身のファイル名を GetModuleFileName() で取得し、それを引数に指定して GetEXESize() を呼び出す(自分自身のEXE部分だけのサイズが得られる)。
●自己解凍書庫の作成
EXE部分と目的の書庫を結合するだけです。
結合部分のコードは省略します。
簡単な流れはこんな感じです。
Oar32.dll のほうには付いています(自己解凍書庫の実質的な内容は同じ)。
ところで、自己解凍書庫を自作するときには解凍部分のアルゴリズムを書かなければなりません(ライブラリを使ってもかまいませんが、別途外部DLL等を必要とするものであってはいけません。環境依存しない、Windowsプレインストール時に入っているようなDLLならOK)。
アルゴリズム部分はここでは省いて、流れだけ解説しておきます。
(自己解凍書庫は基本的に EXEの部分 + 書庫の部分 に分けることができます)
●自己解凍書庫のEXEの部分を作成する
1. GUIでもCUIでもOKなので、解凍先のパスを入力してもらえるようにコーディング。
2. 解凍がリクエストされたら
a. 自分自身のファイル名を GetModuleFileName() で取得し、それを引数に指定して GetEXESize() を呼び出す(自分自身のEXE部分だけのサイズが得られる)。
GetEXESize() のコード [ここをクリックすると内容が表示されます]
b. 自分自身を CreateFile() 等を使ってオープンし、aで取得したサイズ分だけ SetFilePointer() でファイルポインタを進めた後(このときファイルポインタは書庫の先頭を指している)、解凍処理。コード: 全て選択
Function GetEXESize(FileName As String) As DWord
Dim hFile As HANDLE,TI As Word,Base As Word,Dummy As DWord
Dim TB As Byte,i As DWord,j As DWord
'ファイルチェック
hFile=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,ByVal NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0)
If hFile=INVALID_HANDLE_VALUE Then
GetEXESize=0
Exit Function
End If
'MZヘッダを確認
ReadFile(hFile,VarPtr(TI),SizeOf(Word),VarPtr(Dummy),ByVal NULL)
If TI<>&H5A4D Then '「MZ」か?
CloseHandle(hFile)
GetEXESize=0
Exit Function
End If
'PEヘッダを確認
SetFilePointer64(hFile,&H3C,FILE_BEGIN)
ReadFile(hFile,VarPtr(TI),SizeOf(Word),VarPtr(Dummy),ByVal NULL)
Base=TI
SetFilePointer64(hFile,TI,FILE_BEGIN)
ReadFile(hFile,VarPtr(TI),SizeOf(Word),VarPtr(Dummy),ByVal NULL)
If TI<>&H4550 Then
CloseHandle(hFile)
GetEXESize=0
Exit Function
End If
SetFilePointer64(hFile,Base+6,FILE_BEGIN)
ReadFile(hFile,VarPtr(TB),SizeOf(Byte),VarPtr(Dummy),ByVal NULL)
SetFilePointer64(hFile,Base+(TB-1)*40+&HF8+16,FILE_BEGIN)
ReadFile(hFile,VarPtr(i),SizeOf(DWord),VarPtr(Dummy),ByVal NULL)
ReadFile(hFile,VarPtr(j),SizeOf(DWord),VarPtr(Dummy),ByVal NULL)
CloseHandle(hFile)
GetEXESize=i+j
End Function
●自己解凍書庫の作成
EXE部分と目的の書庫を結合するだけです。
結合部分のコードは省略します。
簡単な流れはこんな感じです。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/