ab.com コミュニティ https://www.activebasic.com/forum/ |
|
ファイルの展開 https://www.activebasic.com/forum/viewtopic.php?t=2590 |
ページ 1 / 1 |
作成者: | 水波形 [ 2009年8月30日(日) 20:33 ] |
記事の件名: | ファイルの展開 |
こんにちは 今、簡易インストーラー的なものを作ろうと考えています。 以前リソースを追加/読み出すやり方をご教授いただき、 それを応用してみようかな・・・と使ってみたところ、 ファイルの重さが一定を超えると、なぜかエラーが返ってきます。 なので、ABのサンプルの本についていたdivide.dllの関数を借りて、 1MBずつに分割し、リソースとして追加してみたところ、うまくいきまし。 しかし、メモリーやCPUをものすごく使い、動作が遅くなってしまいます。 (しかも復元したらなぜかファイルが0KBとなってしまいますし・・・) Lhaplusの、exe圧縮のような感じの物にしたいと思っているのですが、 どういう仕組みになっているのでしょうか。 ご存知の方がいらっしゃいましたら、知識をお貸しください |
作成者: | konisi [ 2009年8月31日(月) 22:54 ] |
記事の件名: | |
「自己解凍書庫 仕組み」でググってみた所、実行ファイルの後ろにバイナリファイルをくっつけて保持するのが楽なようです。 http://oshiete1.goo.ne.jp/qa3579677.html http://q.hatena.ne.jp/1168512848 かったるいので検証していませんが、エラーになるのはどのくらいのサイズからか分かりますか? あと書く時と読む時のどちらでエラーになりますか? #4GB以上のファイルを埋め込もうとしても無理。 |
作成者: | 水波形 [ 2009年8月31日(月) 23:28 ] |
記事の件名: | Re:ファイルの展開 |
返信ありがとうございます。 引用: 実行ファイルの後ろにバイナリファイルをくっつけて
ですが、リソースとして埋め込むのでしょうか?引用: エラーになるのはどのくらいのサイズからか分かりますか?
ですが、あと書く時と読む時のどちらでエラーになりますか? 大体400MBを越えたあたりから、書き込み時にエラーが出てきました。 理由は分かりません・・・ |
作成者: | konisi [ 2009年9月09日(水) 07:46 ] |
記事の件名: | |
文字通り実行ファイルにくっつける。リソースとは違う方法。 1.インストーラ兼ファイル展開ソフトを作る 2.展開するファイルを実行ファイルにくっつける 3.実行時にくっつけたファイルを読み込んでインストール先に出力する コードにするとこんな感じかと。 [ここをクリックすると内容が表示されます]
コード: 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と打ち込むとA.exeとB.binを結合したC.exeが作れます。 |
作成者: | 水波形 [ 2009年9月13日(日) 23:11 ] |
記事の件名: | |
返信送れて申し訳ありません。 しばらくサーバーに接続が出来なくて・・・・ それと、コードのサンプルありがとうございます! チラッと見させていただきましたが、自分の知識が少ないので、 何をしているのかさっぱりです・・・ 頑張って理解していきます。 ありがとうございました! |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |