DLLやSusieプラグインをコンパイルする場合、いくつか注意すべき点があります。
ここに、各コンパイラごとに記録しておきたいと思います。
なお、Susieプラグインは拡張子がSPIなだけで、中身はただのDLLです。
DLLやSusieプラグインをコンパイルする場合、いくつか注意すべき点があります。
ここに、各コンパイラごとに記録しておきたいと思います。
なお、Susieプラグインは拡張子がSPIなだけで、中身はただのDLLです。
1.DLLとしてコンパイルする
DLLであることを明示する必要があります。
Visual studioなら、プロジェクト作成時にDLLを指定してください。
コマンドラインなら、以下のようにします。
/LINK以下、リンカオプションを指定できます。
/OUTで、出力ファイル名を指定します。
2.関数のエクスポート
DLLでは、エクスポートした関数のみ、外部から呼び出し可能になります。
関数をエクスポートするには、関数にWINAPI 修飾子(または、PASCAL, __stdcall。全部中身はいっしょ)
を付加し、さらに以下のどちらかを指定する必要があります。
// エクスポート例 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ファイルを指定します。
コマンドラインなら、オプションで指定します。
EXPORTS ;DEFファイルの例 ;セミコロンでコメント GetPluginInfo IsSupported GetPictureInfo GetPicture ConfigurationDlg
3.Cランタイムライブラリの選択
Cランタイムライブラリ(CRT:C標準ライブラリ+α)にはいろいろなバージョンがあり、
どれを選択するかでDLLのファイルサイズ、互換性などが変化します。
Susieプラグインの場合、Susie自体がマルチスレッド動作するので、
必ずマルチスレッド版を選択してください。
シングルスレッド版は、複数のスレッドからアクセスすると、誤動作することがあります。
おそらく、ライブラリが静的変数を持つためでしょう。
(-MT)だとCRTをDLLに取り込み、(-MD)を選択すると、
システムにあるCRTを動的にリンクするようになります。
(-MD)を選択するとDLLのファイルサイズが小さくなりますが、
利用者のシステムのバージョンが古いと動かないことがあるため、
互換性を考えるなら使用しない方法がよいでしょう。
1.DLLとしてコンパイル
コマンドラインで、以下のように指定します。
-tWDを指定しないと、ただのコマンドラインアプリとし扱われ、
main()関数がないと怒られます。
-eオプションで、出力ファイル名を指定します。
2.関数のエクスポート
基本的に、VC++といっしょです。
VCの項を見てください。
BCCもdllexportが使えますが、互換性を考えるとやっぱりお勧めできません。
DEFファイルを使いましょう。
DEFファイル名(拡張子を除く)は、モジュール名といっしょにしてください。
自動でリンクされます。
if_spi.spiなら、if_spi.defです。
3.Cランタイムライブラリの選択
マルチスレッド版とシングルスレッド版があります。
Susieプラグインでは、Susie自体がマルチスレッド動作しますので、
マルチスレッド版を使用してください。