C++Builder2006(無印)でTRichEditを実行時パッケージなしで動作不能な件

何もパッチを当てていない(確か)C++ Builder 2006 での話。バージョンはたぶん10.0.2151.25345。バージョン情報を見てもいっぱい表示されるので、どれを見ればよいのかわからないけどとりあえずそれっぽいのを採用。


それで、事の発端はTurboC++で作ったアプリをコンパイルしようとして、C++Builder側に持って行ってコンパイル&実行したときにエラーが発生したのが始まり。実行すると

WINSPOOL.DLL が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。

ってメッセージボックスが出てアプリが起動できない。でも実行時パッケージを使う設定でビルドしたやつは何も問題なく起動できる。なんじゃこりゃ。
「winspool.dll」でググりまくると海外の掲示*1

> The old winspool.lib contains entries that point to winspool.drv, not to some .dll
> You might want to check \Lib\PSDK\winspool.lib

とか何とか。どうも.libが間違えて.drvを.dllと言ってるっぽい。確かにwinspool.drvなら存在してる。試しに確認してみると

C:\work>tdump -em Project1.exe | grep -i -w winspool
File STDIN:
IMPORT:     WINSPOOL.DLL='ClosePrinter'
IMPORT:     WINSPOOL.DLL='DocumentPropertiesA'
IMPORT:     WINSPOOL.DLL='EnumPrintersA'
IMPORT:     WINSPOOL.DLL='OpenPrinterA'


C:\work>tdump \BDS\4.0\lib\psdk\winspool.lib*2
0004C1 COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h)
    Dynamic link import (IMPDEF)
      Imported by: name
      Internal Name: ClosePrinter
      Module Name: WINSPOOL.dll
000C6E COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h)
    Dynamic link import (IMPDEF)
      Imported by: name
      Internal Name: DocumentPropertiesA
      Module Name: WINSPOOL.dll
0010F9 COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h)
    Dynamic link import (IMPDEF)
      Imported by: name
      Internal Name: EnumPrintersA
      Module Name: WINSPOOL.dll
001620 COMENT  Purge: Yes, List: Yes, Class: 160 (0A0h), SubClass: 1 (01h)
    Dynamic link import (IMPDEF)
      Imported by: name
      Internal Name: OpenPrinterA
      Module Name: WINSPOOL.dll

確かに.libが.dllを指しているので.exe側も.dllを見に行くように見える。
試しに

C:\work>implib winspool.lib c:\WINDOWS\system32\winspool.drv

で作った.libをプロジェクトに追加してみたけどダメだった。さらにググってみると他の掲示*3で「TRichEditが原因」とか「バージョン古くね?上げてみれば?」的な内容が書いてある気がする。英語ですらないので雰囲気で読んだ感じだけど…


それで試しにTRichEditをTMemoに置き換えてみたら現象は発生しなくなった。確かにTRichEditが参照しているらしい。ヘッダファイルとかを追いかけようとしたけど、途中でわからなくなったのでそっちはあきらめた。
とりあえず原因っぽいのは判明したので公式サイトからパッチを落とすことにした。「C++ Builder Hotfix」でググって見つけたサイト*4から「ID: 25624, Update 2 for Borland Developer Studio 2006 (Pro, Japanese)」*5を見つけて、ログイン、ダウンロード、zip解凍、インストールと実施した。バージョンは10.0.2288.42451にあがってTRichEditを入れていても大丈夫になった。リンク先を確認すると

C:\work>tdump -em Project1.exe | grep -i -w winspool
File STDIN:
IMPORT:     WINSPOOL.DRV='ClosePrinter'
IMPORT:     WINSPOOL.DRV='DocumentPropertiesA'
IMPORT:     WINSPOOL.DRV='EnumPrintersA'
IMPORT:     WINSPOOL.DRV='OpenPrinterA'

てな感じでちゃんと.drvを指してる。
他にもパッチはあったけど、最低限update2だけ当てれば今回の現象は出なくなるっぽい。