こんにちは
今、簡易インストーラー的なものを作ろうと考えています。
以前リソースを追加/読み出すやり方をご教授いただき、
それを応用してみようかな・・・と使ってみたところ、
ファイルの重さが一定を超えると、なぜかエラーが返ってきます。
なので、ABのサンプルの本についていたdivide.dllの関数を借りて、
1MBずつに分割し、リソースとして追加してみたところ、うまくいきまし。
しかし、メモリーやCPUをものすごく使い、動作が遅くなってしまいます。
(しかも復元したらなぜかファイルが0KBとなってしまいますし・・・)
Lhaplusの、exe圧縮のような感じの物にしたいと思っているのですが、
どういう仕組みになっているのでしょうか。
ご存知の方がいらっしゃいましたら、知識をお貸しください
ファイルの展開
「自己解凍書庫 仕組み」でググってみた所、実行ファイルの後ろにバイナリファイルをくっつけて保持するのが楽なようです。
http://oshiete1.goo.ne.jp/qa3579677.html
http://q.hatena.ne.jp/1168512848
かったるいので検証していませんが、エラーになるのはどのくらいのサイズからか分かりますか?
あと書く時と読む時のどちらでエラーになりますか?
#4GB以上のファイルを埋め込もうとしても無理。
http://oshiete1.goo.ne.jp/qa3579677.html
http://q.hatena.ne.jp/1168512848
かったるいので検証していませんが、エラーになるのはどのくらいのサイズからか分かりますか?
あと書く時と読む時のどちらでエラーになりますか?
#4GB以上のファイルを埋め込もうとしても無理。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Re:ファイルの展開
返信ありがとうございます。
大体400MBを越えたあたりから、書き込み時にエラーが出てきました。
理由は分かりません・・・
ですが、リソースとして埋め込むのでしょうか?実行ファイルの後ろにバイナリファイルをくっつけて
ですが、エラーになるのはどのくらいのサイズからか分かりますか?
あと書く時と読む時のどちらでエラーになりますか?
大体400MBを越えたあたりから、書き込み時にエラーが出てきました。
理由は分かりません・・・
文字通り実行ファイルにくっつける。リソースとは違う方法。
1.インストーラ兼ファイル展開ソフトを作る
2.展開するファイルを実行ファイルにくっつける
3.実行時にくっつけたファイルを読み込んでインストール先に出力する
コードにするとこんな感じかと。
1.インストーラ兼ファイル展開ソフトを作る
2.展開するファイルを実行ファイルにくっつける
3.実行時にくっつけたファイルを読み込んでインストール先に出力する
コードにするとこんな感じかと。
[ここをクリックすると内容が表示されます]コマンドプロンプトでと打ち込むとA.exeとB.binを結合したC.exeが作れます。
コード: 全て選択
Const EXESIZE=1024*36'素のexeファイルのサイズ
#prompt
Extract("ext.bin")
Sub Extract(dest As *Byte)
Assert("start:ファイルを抽出します。")
Dim hFile As HFILE,name As *Byte
name=malloc(MAX_PATH)
GetModuleFileName(0,name,MAX_PATH)
hFile=CreateFile(name,GENERIC_READ,FILE_SHARE_READ Or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hFile=INVALID_HANDLE_VALUE then
Assert("error:何らかの理由により自分自身にアクセスできませんでした。")
free(name)
Exit Sub
End If
Dim fSize As DWord,fSizeHigh As DWord
fSize=GetFileSize(hFile,VarPtr(fSizeHigh))
If fSize=EXESIZE And fSizeHigh=0 then
Assert("error:ファイルが埋め込まれていませんでした。")
CloseHandle(hFile)
free(name)
Exit Sub
End If
If fSizeHigh then
Assert("warn:FAT32システムを使用している場合は、4GB以上のファイルは展開できません。")
Assert("hint:上手く行かない場合はNTFS形式に変換してみましょう。")
End If
Dim hOutFile As HFILE
hOutFile=CreateFile(dest,GENERIC_WRITE,FILE_SHARE_READ,ByVal 0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Assert("error:出力先が既に存在してるか、又はドライブへの書き込みアクセスが出来ません。")
Assert("error:ファイルが存在する場合は削除してください。")
CloseHandle(hFile)
free(name)
Exit Sub
End If
SetFilePointer(hFile,EXESIZE,0,FILE_BEGIN)
SetFilePointer(hOutFile,0,0,FILE_BEGIN)
Dim CopySuccess As Long
CopySuccess=CopyTo(hOutFile,hFile)
If CopySuccess=0 then
Assert("error:何らかの理由で出力先への書き込みができなかった可能性があります。")
Assert("error:ディスクが一杯でないか確認した後、再実行してください。")
CloseHandle(hFile)
CloseHandle(hOutFile)
free(name)
Exit Sub
End If
CloseHandle(hFile)
CloseHandle(hOutFile)
free(name)
Assert("success:抽出に成功しました。")
End Sub
Const COPY_BLOCKSIZE=1024
Function CopyTo(dest As HFILE,src As HFILE) As Long
Dim buffer As *Byte,ReadSize As DWord
Dim ReadSuccess As Long,WriteSuccess As Long
Dim WroteSize As DWord
buffer=malloc(COPY_BLOCKSIZE)
Do
ReadSuccess=ReadFile(src,buffer,COPY_BLOCKSIZE,VarPtr(ReadSize),ByVal 0)
If ReadSuccess then
If ReadSize=0 then Exit Do
WriteSuccess=WriteFile(dest,buffer,ReadSize,VarPtr(WroteSize),ByVal 0)
If WriteSuccess=FALSE or ReadSize<>WroteSize then
CopyTo=0
free(buffer)
Exit Function
End If
Else
CopyTo=0
free(buffer)
Exit Function
End If
Loop
free(buffer)
CopyTo=-1
End Function
Sub Assert(buf As *Byte)
Print MakeStr(buf)
End Sub
コード: 全て選択
copy /B A.exe+B.bin C.exe
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。