VC++.NETになって、ソースコード内での__interfaceキーワードによるインターフェース定義やその属性の定義が自動的にIDLに、そしてタイプライブラリに反映されるようになった。(関係ないけど、MIDLにconstメソッドがサポートされたのは喜ばしい)。私としてはIDLを書くのは嫌いじゃないし、やっぱり自由がきくのでいいと思うんだけど。まぁ、最近の流行はこういうやりかたみたい。XDocletは確かに便利だしね。J2SE5.0も属性をサポートしたしね。
ところが、なんだかよく分からないけど、一部のインターフェースがIDLに反映されなくて困った。散々悩んで、実験して、結局よく分からないけどSOAPが関係してるらしい。
- ソースコードからIDLへの反映は各オブジェクトファイルの.idlsymセクションをマージすることで行われるので、interfaceであれ、coclassであれ、IDLに反映されるには少なくとも1つの翻訳単位に含まれなくてはならない。
- ところが、その翻訳単位にsproxyが生成したSOAPプロキシヘッダを#includeしていると、この反映が行われない。オブジェクトファイルの解析はしてないけど、.idlsymセクションが作られないのか……。
したがって、coclassの実装にsproxyの生成したプロキシを使用する場合、解決策としては
- IDLを自力で書いて、MIDLに掛けて、tlbをリンクするように設定する。これ、やり方がよく分からなかった。リソースに含まれるんだよね? どこで設定すりゃいいの?
- IDL生成用の翻訳単位と、実装用の翻訳単位を分ける。生成用翻訳単位では単にインターフェースやcoclassの宣言を#incldueするだけで、何もしない。余計なものも#includeしない。