[D言語][Regnessem] GetInfoサービスのラップ
無能くんは相手や状況によって辞書ファイルを自動的に切り替えることを
目標に開発されてるので、コネクションやセッションの情報を取得しないといけません。
でこんなの書いてみた。
module session; (略) public: // System/Session/GetInfoサービスをラップする関数 int GetInfo(HNsmSession hSession, int nInfoKey, char[] string) { if ( !hGetInfo ) hGetInfo = GetService(NMS_SYSTEM_SESSION_GETINFO); if ( hGetInfo ) { TNsmInfo nsmInfo; nsmInfo.nType = NMIT_STRING; nsmInfo.lpBuffer = (LPBYTE)string; nsmInfo.nBufferSize = DEFAULT_BUFFERSIZE; TNsmSessionInfo sessionInfo; sessionInfo.cbSize = sessionInfo.size; sessionInfo.nInfoKey = nInfoKey; sessionInfo.lpInfo = &nsmInfo; return (int)CallService(hGetInfo, (WPARAM)hSession, (LPARAM)&sessionInfo); // 正常終了 } return 0; // 異常終了 } int GetInfo(HNsmSession hSession, int nInfoKey, wchar[] wstring) { if ( !hGetInfo ) hGetInfo = GetService(NMS_SYSTEM_SESSION_GETINFO); if ( hGetInfo ) { TNsmInfo nsmInfo; nsmInfo.nType = NMIT_WIDESTRING; nsmInfo.lpBuffer = (LPBYTE)wstring; nsmInfo.nBufferSize = DEFAULT_BUFFERSIZE; TNsmSessionInfo sessionInfo; sessionInfo.cbSize = sessionInfo.size; sessionInfo.nInfoKey = nInfoKey; sessionInfo.lpInfo = &nsmInfo; return (int)CallService(hGetInfo, (WPARAM)hSession, (LPARAM)&sessionInfo); // 正常終了 } return 0; // 異常終了 } int GetInfo(HNsmSession hSession, int nInfoKey, out int integer) { if ( !hGetInfo ) hGetInfo = GetService(NMS_SYSTEM_SESSION_GETINFO); if ( hGetInfo ) { TNsmInfo nsmInfo; nsmInfo.nType = NMIT_INTEGER; nsmInfo.lpBuffer = (LPBYTE)&integer; nsmInfo.nBufferSize = integer.size; TNsmSessionInfo sessionInfo; sessionInfo.cbSize = sessionInfo.size; sessionInfo.nInfoKey = nInfoKey; sessionInfo.lpInfo = &nsmInfo; return (int)CallService(hGetInfo, (WPARAM)hSession, (LPARAM)&sessionInfo); // 正常終了 } return 0; // 異常終了 } (以下略)
オーバーロードの使い方ってこれでいいんだろうか…(^^;
これで、セッションのプロトコル名を取得するときは
char[64] protocol; // 64は てきとう session.GetInfo(hSession, NMSI_PROTOCOL, protocol);
コネクションハンドルを取得するときは
int hConnection; session.GetInfo(hSession, NMSI_CONNECTION, hConnection);
でいけます。intのときはout修飾子をつけて、文字列でもコネクションハンドルでも
ポインタを意識せずに同じ書き方で取得できるようにしてみた。
でも本来HNsmConnection型をしているはずのものがint型なのが気に入らない。
最初は
int GetInfo(HNsmSession hSession, int nInfoKey, out HNsmConnection hConnection)
も作ってたんだけど、
「char* と void* を区別できません」ってコンパイルエラーが出て(そりゃそうだ)、
プロトコル名の取得に支障が出ちゃいました。
char[]は暗黙にchar*にキャストされます… でしたね。
ただ nBufferSize = integer.size としてるから、
void* が64bitになったときに通用しなくなるかもね。うひょ。
いや、おいらもちゃんとここは読んでるんですよ。
おいらよりよっぽどよいラップの仕方をしていると思います…
もっとDelphiわかるようにならんとダメだね。。。
ちなみにconnection.GetInfo()もおんなじノリで作ってみた。
ソースはほぼ同じ。