実は、IJG のコードを利用する前に、すでに、DLL 化して、
簡単に使えるようになったものが無いか探したのですが、
日本国内では容易に見つける事は出来ませんでした。
install.doc の中には、DLL 化について、説明した項目があります。
それによれば、注意点は書かれていますが、出来ない事は無いようです。
ただ、VisualBasic から簡単に利用するような"ラッパー"は、
このバージョンの時点ではサポートされていないようです。
まず、DLL として使えるかどうかを調べました。
install.doc にあるように、WIN16 はちょっと、問題外として
考慮しない(使わない)事にします。
WIN32 については、jmorecfg.h の中の記述を
#define GLOBAL(type) __declspec(dllexport) type
#define EXTERN(type) extern __declspec(dllexport) type
と変更するだけのようです。
コンパイルについては説明が見あたらないようですが、
たぶん、普通で良いからでしょう。
makefile で、link のところで、/DLL を入れる事にします。
libjpeg.lib: $(LIBOBJECTS)
$(RM) libjpeg.lib
link /DLL /out:libjpeg.dll $(LIBOBJECTS)
~~~~~~~~~~~~~~~~~~~~~
実際には、DLL だけでなく、インポート用のライブラリ(.lib)も出来るので、
これで良いかと思います。
make し直して、問題なく、DLL が作成されました。
付属のユーティリティも、一応、ビルドと起動はするようです。
(動作上は、MS-Windows 環境、特有の問題があります)
【 DLL を使ったアプリケーションの作成 】
手順は同じですから、前に作った、サンプルがそのまま動くと思うかも
しれません。
ところが動きません。
これには、install.doc の中で、以下のように述べられています。
------------------ install.doc より抜粋 ----------------------------
2. Microsoft C cannot pass file pointers between applications and DLLs.
(See Microsoft Knowledge Base, PSS ID Number Q50336.) So jdatasrc.c and
jdatadst.c don't work if you open a file in your application and then pass
the pointer to the DLL. One workaround is to make jdatasrc.c/jdatadst.c
part of your main application rather than part of the DLL.
2.Microsoft C はアプリケーションと DLL の間で、ファイルポインタを
渡す事ができません。(Microsoft Knowlege Base、PSS ID 番号 Q50336を参照)
従って、jdatasrc.c とjdatadst.c は、アプリケーションでファイルを開き、
そのポインタを DLL に渡すならば動きません。
一つの方法は、DLLの一部ではなく、あなたのメインアプリケーション側に
jdatasrc.c/jdatadst.c の部分を作る事です。
--------------------------------------------------------------------
Q50336 という記述は MS のサイトを探しても、現在は見つからないのですが、
この記述の内容は、今(Windows95)でも生きているようです。
なお、DLL-DLL 間でも受け渡しは無理のようです。
この為、DLL 化して使うには、次の事が考えられます。
(1) libjpeg を DLL 化して汎用的に使う
(2) 必要な機能ごとに、スタティックな libjpeg を含む、DLL を作成する
(1) の方法は、使う資源が最小になるので、望ましいのですが、
libjpeg 内にある、入出力マネージャを、必ず置き換える必要があります。
(2) は、(1) に比べ、私の環境で、数100KB 程度大きくなります。
現在のマシンのスペックから見れば、(2) でも十分でしょう。
|