こんばんはぺろりです。
今回は前回の記事で触れた、DLL名でハマったもう一つのネタを紹介します(忘れないうちに)。

これは筆者のやり方がまずかったというだけなんですが(汗)、自作のExtensionのDLLをどこに置いてテストやデバッグをするかがポイントになります。
筆者はSWSにならって、REAPERのインストールフォルダにあるPluginsフォルダにDLLをコピーして実行&デバッグを行っていました。
(このあたりはSWSのプロジェクト設定(ビルドイベント)を見ると参考になります)

で、しばらくは特に何も問題ありませんでした。

突如問題になったのは、ActionListのいくつかのSectionにActionを追加してみようとしたところからです(今までは通常のMainセクションのみの登録ばかりでした)。
DLLのエントリポイントでActionをMIDIEditorセクションなどに登録しようとするのですが、これも問題なく成功します(ActionIDなどもREAPERから発行されるのをデバッガで確認済み)。
やったー、とREAPERがそのまま起動した後、ActionListでMIDIEditorセクションを見ると
「あれ・・・?」
さっき登録できたActionが一切登録されていない・・・

しばらくいろいろ試した後、同じことをSWSのプロジェクトでやってみると、うまく登録できてしまいました。
このへんでぺろりの頭もだいぶ混乱気味。

仕方がないので食パンを切ってピザトーストにして美味しくいただきました(ただの夕食)。
頭をクリアにしていろいろ筆者のDLLとSWSの何が違うのか検討していった結果、ピンと来ました。
「もしかして・・・実はまだファイル名の規則か何かをミスってるのか?」
試しにSWSと似たような名前(reaper_sws2.dllとか)に変えて試すとうまくいってしまいました。

ここでハッとして Pluginsフォルダを俯瞰してみたところ、
「もしや初期化順・・・!?」

当時自分で作っていたテスト用のDLLはreaper_dbg.dllとかてきとーなファイル名にしていたのですが、これがまずかったようです。
推測ですが、REAPERはプラグインDLLを名前の順に読み込んで初期化を行っている模様。
そして、自分のDLLをreaper_midi.dllよりも前になる名前にしてしまうと、DLLロード時にMIDIEditorセクションに登録したコマンドがreaper_midi.dllロード時に失われてしまうのではないかと。
実際、reaper_midi.dllより後ろになる名前(reaper_nnn.dllとか)にしてやったら問題なくMIDIEditorセクションへAction登録したものが残りました。
これでDLLの名前を変えることで、やっと問題を回避することが出来た訳です。

今回の件はREAPERインストールフォルダのPluginディレクトリにDLLを配置したことによる弊害なので、実はREAPERのリソースフォルダにあるUserPluginsにDLLを配置すれば問題ありませんでした。
(おそらくREAPERのPluginが全て初期化された後にUserPlugins側が読み込まれるのではないかと)

ただ、置き場所や名前に依存して動いたり動かなかったりするプログラムは気持ちが悪いので、あらかじめ今回の問題にひっかからないような名前にしておくのが良いかと思います。
ちなみに自分は"reaper_x"をDLL名のプレフィックスとして付けるようにしています。
(例えば reaper_xpelori.dll など)

ということで、今回はハマった事例の経緯をぐだぐだと説明してしまいましたが、これを見て皆さんはハマらないようにしてくださいね。