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だけ当てれば今回の現象は出なくなるっぽい。