2012/03/07

自作Becky!プラグインがBecky!に認識されない

Becky!プラグインを作ってみてるんだけど、
自前プラグインがBecky!に認識されなくて困ったのでメモ。

IDE: Visual Studio 2010 Express
OS: Windows 7 Pro SP1
Becky!: 2.60.01


【現象】
ここを参考に作ってみるが、Becky!のシステムフォルダに「PlugIns」を作ってDLL突っ込んでも、起動時に認識してくれない。

【解消法】
Visual Studio のDLLプロジェクト設定で、
構成プロパティ>リンカー>入力
を表示し、「モジュール定義ファイル」に.defファイルを指定してあげる。


【経緯】
ここを参考に作ってみて、とりあえずDLLは作成できたけど、Becky!で認識しない。
モジュールの依存関係を表示できるソフト「Dependency Walker」でDLL関数がエクスポートされているかチェックしたところ、全然されてない(Becky! SDKのWinヘルプによると、Becky!は起動時に少なくともBKC_OnPlugInInfo(LPBKPLUGININFO)でszPluginNameとszVendorが設定されないとそのプラグインを無視するらしいので、関数すらエクスポートされてなきゃ無視されるんだろう。)
 んで、DLLの関数エクスポートには.defファイルを使用することまではMSのページでわかったんだけど、.defファイルはちゃんとプロジェクトに追加している。
むー、と思って、Becky!公式ページに置いてあるBecky! S/MIME plug-in Ver.1.10のソースを取ってきて、VisualStudioのプロジェクトファイル(BkSMIME.vcproj)を見てみると、以下の記述が・・・。

<Tool
Name="VCLinkerTool"
AdditionalDependencies="crypt32.lib"
OutputFile=".\Release/BkSMIME.dll"
LinkIncremental="1"
SuppressStartupBanner="true"
ModuleDefinitionFile=".\BkSMIME.def"
ProgramDatabaseFile=".\Release/BkSMIME.pdb"
SubSystem="2"
ImportLibrary=".\Release/BkSMIME.lib"
TargetMachine="1"
/>

あれー、プロジェクトに追加するだけじゃなくてリンカの設定に入れるのか!
ってことで【解消法】に書いた通り設定すると、ちゃんとエクスポートされた。


ちなみに.defファイルに関して。。。

  • MSのページには、.defファイルには少なくとも"LIBRARY"の記述が必要であると書いてあるが、無くてもいける(Becky! SDKのサンプル("Template.def")にも書いてない)。
  • "DESCRIPTION"の記述があると("Template.def"には書いてある)、Visual Studioがwarningを出す(↓)。なんで?
Sample.def(1): warning LNK4017: DESCRIPTION ステートメントはターゲット プラットフォームでサポートされていません。無視しました。


あ、あと、デフォルトではmsvcr100.dllが必要になっちゃうので、ここを参考に依存しないようにした。


0 件のコメント:

コメントを投稿