MFCでzlib.libを使用する方法

[戻る]
ブヒブヒ 2010/04/02(金) 16:48:53
いつもお世話になっております。
ブヒブヒでございます。

開発環境
WindowsXP SP3
Visual C++ 2005 SP1 MFC

VC++ 2005 MFCでzlib1.2.4を使用する方法を
教えていただけないでしょうか。

見よう見まねで組み込んでみたのですが、
LINKエラーが発生してビルドが成功しません。
zlibとMFCで使用しているDLLが異なっているため
のようですが私には解決方法がわかりませんでした。

#階層を保持したままファイルをアーカイブして
#リソースとしてExeに持たせ、実行時に
#任意のパスに解凍したいのです。
#特にzlibにこだわっているわけではないので
#他に良い方法があれば教えていただけないでしょうか。

大変申し訳ありませんが、
よろしくお願いいたします。

aetos 2010/04/02(金) 18:12:35
zlib1.dll をダイナミックリンクするのではなく、スタティックリンクしたいというこ
とでしょうか?

まず、http://zlib.net/ から「zlib source code, version 1.2.4, zipfile format」
を落としてきて解凍します。
その中にある projects/visualc6/zlib.dsw を開いて変換します。
アクティブなソリューション構成を「LIB Release」にしてビルドをかければいいはずで
す。

ただ、zlib というのは、単にバイトデータを圧縮・展開する機能しかありませんので、
ディレクトリツリーを丸ごとという場合は、ファイルの列挙、読み込み、圧縮したデー
タの保存はアプリでやる必要がありますし、複数のファイルを一つに固めたときのファ
イルフォーマットも設計しなければなりません。
それよりは、zip のようなフォーマットを採用した方が楽だと思いますが。

zip の場合は、http://sourceforge.net/projects/infozip/files/ から zip30.zip と 
unzip60.zip をダウンロードして展開します。
zip の方は windll/visualc/lib/zip32z64.dsw を、unzip の方は 
windll/vc8/unzip32.sln を開いて、それぞれ Release でビルドすればよいでしょう。

あと、リソースへの埋め込み・リソースからの展開は自前で書く必要があります。当
然。

ブヒブヒ 2010/04/02(金) 18:55:24
[[解決]]
aetos様
早速のお返事ありがとうございます。

zlibのみで階層を維持したまま、
フォルダを圧縮することができないのですか。。。
情報の収集不足でした。
zipフォーマットを採用すると言うことで進めていきます。

>zlib1.dll をダイナミックリンクするのではなく、スタティックリンクしたいというこ
>とでしょうか?
出来れば、Exe1個のみの構成にしたいので、DLLではなく、
スタティックリンクで考えています。
#しかし、ライセンスフリーのDLLでInとOutのパスを指定するだけで
#解凍してくれるものがあるのなら、DLLもありかな〜と考えています。

>あと、リソースへの埋め込み・リソースからの展開は自前で書く必要があります。当
>然。
はい、リソースの埋め込みと展開は以前やったことがあるので大丈夫です。

もし、zipフォーマットでわからないところが出てきたら
よろしくお願いいたします。
ブヒブヒ

subaru 2010/04/03(土) 03:09:48
>出来れば、Exe1個のみの構成にしたいので、DLLではなく、
>スタティックリンクで考えています。
ではCAB形式を採用してはいかがですか。
XPならOS標準の機能でCABファイルの圧縮/解凍ができますよ。
http://www.eternalwindows.jp/installer/cabinet/cabinet07.html

#Windows 7 ならネイティブの Packaging API の機能を
#使うのもありかもしれませんね(^^

ブヒブヒ 2010/04/04(日) 23:08:42
subaru 様
お返事ありがとうございます。

CAB形式について調べました。
Win2k以降だと、Cabinet.dllが標準でインストールされている
とのことなので、Cabinet.dllを利用しようかなと
考えております。

ただ、CallBackがよくわからないので勉強が必要ですが。

#Info-zipは企業で使用するにはライセンス関連で
#問題がおきると面倒なのであきらめました。

古いスレッドには追加発言できません。