VC++.NETの属性からIDLへの反映

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しない。