DLL

戻る

はじめに

DLLやSusieプラグインをコンパイルする場合、いくつか注意すべき点があります。
ここに、各コンパイラごとに記録しておきたいと思います。
なお、Susieプラグインは拡張子がSPIなだけで、中身はただのDLLです。


Microsoft Visual C++

1.DLLとしてコンパイルする

DLLであることを明示する必要があります。
Visual studioなら、プロジェクト作成時にDLLを指定してください。
コマンドラインなら、以下のようにします。

CL spi_api.cpp /LINK /OUT:if_spi.spi /DLL

/LINK以下、リンカオプションを指定できます。
/OUTで、出力ファイル名を指定します。


2.関数のエクスポート

DLLでは、エクスポートした関数のみ、外部から呼び出し可能になります。
関数をエクスポートするには、関数にWINAPI 修飾子(または、PASCAL, __stdcall。全部中身はいっしょ) を付加し、さらに以下のどちらかを指定する必要があります。

  1. _declspec(dllexport)
  2. DEFファイル

// エクスポート例
int WINAPI IsSupported(LPSTR filename, DWORD dw);

// dllexport使用例
// インポートと兼用するため、普通はtypedefします。長いし
int _declspec(dllexport) WINAPI IsSupported(LPSTR filename, DWORD dw);

VC++では、dllexportはお奨めできません。
関数に_declspec(dllexport)を付けるだけなのでお手軽ですが、
VC以外の環境(他のCコンパイラ、VBなど)からDLLを利用した場合に、
関数名がおかしくなるからです。

たいして手間もかかりませんので、DEFファイルを利用しましょう。
DEFファイルなら、こちらが指定した関数名で外部から呼び出すことができます。
単純なDEFファイルは、エクスポートする関数名を列挙するだけです。

なお、DEFファイルはリンカに指定する必要があります。
よく忘れてて焦ったりするので、要注意です
Visual Studioなら、リンカのモジュール定義ファイルに、DEFファイルを指定します。
コマンドラインなら、オプションで指定します。

/DEF:"spi_if.def"

EXPORTS
	;DEFファイルの例
	;セミコロンでコメント
	GetPluginInfo
	IsSupported
	GetPictureInfo
	GetPicture
	ConfigurationDlg

3.Cランタイムライブラリの選択

Cランタイムライブラリ(CRT:C標準ライブラリ+α)にはいろいろなバージョンがあり、
どれを選択するかでDLLのファイルサイズ、互換性などが変化します。

  1. マルチスレッド (-MT)
  2. マルチスレッド・DLL (-MD)
  3. シングルスレッド (-ML)
さらに、上の三つのデバッグバージョン(-MTdなど)がありますが、
リリース時は使用しません。

Susieプラグインの場合、Susie自体がマルチスレッド動作するので、
必ずマルチスレッド版を選択してください。
シングルスレッド版は、複数のスレッドからアクセスすると、誤動作することがあります。
おそらく、ライブラリが静的変数を持つためでしょう。

(-MT)だとCRTをDLLに取り込み、(-MD)を選択すると、
システムにあるCRTを動的にリンクするようになります。
(-MD)を選択するとDLLのファイルサイズが小さくなりますが、
利用者のシステムのバージョンが古いと動かないことがあるため、
互換性を考えるなら使用しない方法がよいでしょう。



Borland C++

1.DLLとしてコンパイル

コマンドラインで、以下のように指定します。
-tWDを指定しないと、ただのコマンドラインアプリとし扱われ、
main()関数がないと怒られます。
-eオプションで、出力ファイル名を指定します。

bcc32 -tWD -e"spi_if.spi"


2.関数のエクスポート

基本的に、VC++といっしょです。
VCの項を見てください。
BCCもdllexportが使えますが、互換性を考えるとやっぱりお勧めできません。
DEFファイルを使いましょう。

DEFファイル名(拡張子を除く)は、モジュール名といっしょにしてください。
自動でリンクされます。
if_spi.spiなら、if_spi.defです。


3.Cランタイムライブラリの選択

マルチスレッド版とシングルスレッド版があります。
Susieプラグインでは、Susie自体がマルチスレッド動作しますので、
マルチスレッド版を使用してください。

bcc32 -tWD -tWM -e"spi_if.spi"



戻る inserted by FC2 system