ファイルシステムに依存するバグ
昨日書かなかったstrrscモジュールをば。
module strrsc; import std.string; private import win32.ansi.windows; import nsmsgs.types; import nsmsgs.consts; import system; // NsmInitInfoが宣言されてるところ //------------------------------------------------------------------------------------------// // グローバル変数の宣言 HNsmService hGetLocalStr; //------------------------------------------------------------------------------------------// // AddIn/StrRsc/GetLocalStrをラップする関数 extern (Windows) int GetLocalStr(LPCTSTR lpPluginName, LPCTSTR lpSectionName, LPCTSTR lpMessageTag, LPCTSTR lpDefaultStr, int nBufferSize, LPBYTE lpBuffer) { if ( !hGetLocalStr ) hGetLocalStr = NsmInitInfo.GetService(toStringz(NMS_ADDIN_STRRSC_GETLOCALSTR)); if ( hGetLocalStr ) { TNsmStrRsc strRsc; strRsc.cbSize = strRsc.size; strRsc.lpPluginName = lpPluginName; strRsc.lpSectionName = lpSectionName; strRsc.lpMessageTag = lpMessageTag; strRsc.lpDefaultStr = lpDefaultStr; strRsc.nBufferSize = nBufferSize; strRsc.lpBuffer = lpBuffer; NsmInitInfo.CallService(hGetLocalStr, (WPARAM)&strRsc, (LPARAM)0); return 1; // 正常終了 } // サービスの呼び出しに失敗したのでデフォルト文字列を渡す lstrcpyW( (LPCWSTR)lpBuffer, (LPCWSTR)lpDefaultStr ); return 0; // 異常終了 } // module strrsc;
昨日のuiモジュールより改善されてる点は、モジュール自身でサービスハンドルを取得して記憶していること。
ぢつはこれ、プラグインの読み込まれる順序が不定なことと関係してるんだよね。
昨日、ずっとC:ドライブでテストしててたんだけど、
F:ドライブ(USBメモリ)に本体ごと移して起動したとたん、
UIサービス名の表示がおかしくなっちゃった。
原因はOnModulesLoaded()内でサービスハンドルを取得してたからみたい。
それより先にUIプラグインがNSMUI_GETCAPTIONを呼び出しちゃうこともあるのだ。
C:ドライブでうまくいってたのは、たまたま自分で作ったプラグインが
UIプラグインより先に読み込まれてただけだったんだよね。。。
UIプラグインは自分のOnModulesLoaded()内でNMUI_GETCAPTIONを呼び出します。
機能メニューをクリックしたときぢゃないんだなあ。
(一昨日気づいたことだよ! アフォだなあ)
ちなみにC:ドライブはNTFS、F:ドライブはFAT32だった。
ファイルシステムに依存するバグって見つけにくい…かも。