#使ったらよいライブラリ、プログラムソースなど
情報源のソースはありませんか?日本語希望。書籍でもOK。
質問者はそもそもWindowsの自己解凍形式としての.exeがどのような構造になっているのか、から知識がありませんのでその辺のソースもあるとうれしいです。
TAR.BZ2自己解凍モジュール for Win32 CUI(Windows95/98/Me / ユーティリティ):
http://www.vector.co.jp/soft/dl/win95/util/se363456.html
というのを見つけました(Visual StudioのCソースコードも付属しているようです).
これをWine(Linux上のWin32APIコード実行環境)
Wine - Wikipedia:
http://ja.wikipedia.org/wiki/Wine
上で実行してやればできると思います.
質問はバイナリレベルでexeファイルを作るという
趣旨に見えますが,これはなかなか厳しいのでは?
CodeZine:EXEファイルの内部構造(PEヘッダ)(EXEファイル, PEヘッダ, Windows, 実行ファイル):
http://codezine.jp/a/article.aspx?aid=412
この辺りの記事を読みながら地道にやるしかなさそうです.
すみませんが,追加回答となります.URLはほぼダミーです.
あれから,紹介したツールのソースコードを少し読みましたので.
以下,bzip2はzip/lzhでも同じことです.
自己解凍形式ファイルというのは,
自分自身のファイルの後ろにつけたデータ部(複数のファイルをtar.bzip2したファイル)
に対してbunzip2(解凍した後,tarで複数ファイルに展開する処理)を実行するexeファイルに過ぎないことが多いと思います.
上で紹介した「TAR.BZ2自己解凍モジュール 」は,
自分自身のファイル(引数arg[0])に対して,fopenした後,
fseekで(bunzip2.exeの大きさ分移動して)データ部まで移動し,bunzip2を適用していました.
|→ここからbunzip2をかける +-------------+---------------------+ | bunzip2.exe | データ部(tar.bzip2) | +-------------+---------------------+ 全体:ファイル名.exe
それなので,自己解凍形式(foo.exe)を作るためには,DOSシェルで,
$ copy /b bunzip2.exe + foo.tar.bzip2 foo.exe
として,tar.bzip2したディレクトリfooの前側にbunzip2.exeをくっつけてやるだけでよかったのでした.
たぶん,EXE内部に立ち入ったり,Wineを使うまでもなく,
bunzip2の処理を行うEXEをビルド(Windows上で作るのが手っ取り早い.他にはMINGWなどのクロスコンパイラとか)して,
cat, cpでtar.bzip2の前側にくっつけてやるだけでできると思います.
おおお、ありがとうございます!
さっそく開発陣に試してもらいます。
この通り行けば、非常にシンプルにできそうてですねえ。
テストして、結果ご報告致します。
(追記)2007/8/3
この件、最終的にはテスト着手する前に、今回は解決しました。
当初Linuxサーバで複数ファイルを.exeにアーカイブ化してダウンロード配布させる環境の構築が必要でした。
それが必要になった理由が、今回のシステムには元々.lzh形式にアーカイブ化してダウンロード配布させる機能は標準であったのですが、導入先のWin環境に解凍ソフトを配布するのが面倒、と先方にいわれてしまったからのでした。
しかしその後、先方が既にWinXPに統一されており、以下のサイトから入手できる「Windows Genuine Advantage 確認ツール」を導入済みだったので、導入の特典である「Microsoft 圧縮 (LZH 形式) フォルダ」が使える状態であることが判ったのでした。
http://www.microsoft.com/genuine/offers/
不幸中の幸いでした。
しかしどこかで.exe配布の実装には挑戦したいと思います。皆様情報ありがとうございました。
ありがとうございます。
今回の環境にWineがあるか確認したいと思います。
あと、Exeファイルの内容部構造の情報もありがとうございます。こちらも後学の為、勉強してみます。確かにいきなりバイナリで作るのは難しそう。
1)前者の手段で1ファイル分の自己解凍形式.exeを作成する
2)ヘッダ部分のみ流用して、後のデータ部を差し替えて使ってみる
というのは実装できないのだろうか・・・その辺が可能なのかが、多分Exeの内部構造の資料を読めば分かるのかもしれませんが(やっぱり私分かってませんかね?)