IJG JPEG ライブラリの DLL 化
最終更新日:2000/03/01
  実は、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) でも十分でしょう。

|HOME|戻る|