BDS2006のC++BuilderでWTL

成果物はhttp://panathenaia.halfmoon.jp/alang/sample-wtlbcb.7z
WTLは言うまでもなくMS謹製?の全部Templateでできた、中の構造丸見えのカプセル化とは逆を行くWindowsGUIライブラリです。MFCよりも評判は良さげですが、ATLを必要とするためATLを持って無いと使えません…はずなのですが、最近のPlatform SDKにはCRT(!)、MFC共々付属してきてます。これはSDK同梱の64ビット版cl.exe用でしょうか。よくわかりません。
とりあえずBDS2006ではincludeディレクトリの中にかなり古い版っぽいですがATLが存在します。Update1でオプションダイアログ弄れるようになったため試してみました。なお予告通りではあるのですがUpdate1、全部C++についてですね。
プロジェクトは新規作成の「コンソールアプリケーション - C++Builder」で作成します。その際コンソールアプリケーションのチェックを外せば空のWindowsアプリケーションのプロジェクトが作られます。謎です。
プロジェクトオプションでヘッダ検索パスにATLとWTLディレクトリを追加します。ついでにランタイムを静的リンクに、パッケージの使用をOFFにして、純粋な実行ファイルのサイズを見てみます。
プロジェクトにWTLサンプルプロジェクトのソースとリソースを放り込んでビルド…すると、コンパイラの挙動の違いからWTLのヘッダーにいくつかエラーが出ますのでちまちま修正します。とりあえず#define STRICTしてwindows.hに各種ハンドルの型をそれぞれ別物として定義させることは必須っぽいです。後は上記アーカイブの中に入れておいた差分でも参照してください。
コンパイルが通ると次はリンクエラーです。これも謎です。AnsiStringやFindCmdLineSwitchが要求されます。これはvcle.libをリンクすると通るのですが、実行ファイルを見ますと、500kb超、VCLを使うのと変わらないぐらいの巨大サイズとなっています。どこがVCLを要求しているのか…?
これはbcbatl.libの、具体的にはatlmod.hの実装が、アウトプロセスサーバではVCLを前提とする書き方がなされているからです。

#if !defined(__DLL__)
#define USING_VCL
#endif

…は、はぁ、そうですか…。
ActiveX以外にATLを使うなんてことは考えられてなかったのでしょーねー。
しょうがないのでbcbatl.libを自前のものを使うようにして、最低限必要なシンボルをちまちまコピーしてきました。bcbatllib_s.cppです。
これで、200kb前後の実行ファイルでwtlexplorer完成です。これでも期待したよりはサイズでかいなあなんて思ったのは秘密です。そもそもVC++ですとどれくらいのサイズなのかな…。
余談ですが、BDS2006でC++を使っていると、ヘルプが、Borlandのぶんと、.NET SDK中のManaged C++がごっちゃになって辛いです…。フィルタを使うとDinkumwareやPlatform SDKまで隠してしまいますし…Managed C++だけ器用に追い出す方法は無いでしょうか、きっとあるはずだ…。