昨日の今日で恐縮ですが、唯一コンパイル不可であったFileHandlerのビルドが成功しましたので報告いたします。
元々FileHandlerはFindFirstFile()、FindNextFile()、FindClose()を使ったツリービュ―にディスクの内容を表示するもの(現在はサンプルのTradFilerとして公開)でしたが、webサイトで見たshell serviceを利用してExplorerっぽくしたものです。この開発にあたり、元々のVisual Studioベースのものは、
#define WM_SHELLCHANGE WM_APP
#include <shlobj.h>
#include <shlwapi.h>
#pragma comment (lib, "shell32.lib")
となっていたのですが、Embargadero C++ではうまくコンパイルできず、試行錯誤のうちに、
#define WM_SHELLCHANGE WM_APP
#include <Winapi.ShlObj.hpp>
#include <Winapi.ShLwApi.hpp>
#pragma comment (lib, "shlwapi.lib")
でコンパイルできたのでこのようにした、という経緯がありました。
今回bcc32cでコンパイルした際に発出したエラーが、
Turbo Incremental Link 6.91 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Fatal: Unable to open file 'RTLE.LIB'
bcc32c.exe: error: linker command failed with exit code 2 (use -Xdriver -v to see invocation)
であったことから、「これはどうもC++ Builder用のライブラリーじゃないか?」ということで、もう一度bcc102\lib\release\psdkの内容を調べ、shell service関係のlib(特にshlwapi.lib)を確認して、オリジナル(上記↑のベースのもの)に戻してコンパイルを行なってみました。
その結果、リンカ―の「"RTLE.lib"ファイルが開けない」というエラーはなくなりましたが、今度は、
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.
Error: Unresolved external 'ILFindLastID' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'ILCombine' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'SHBindToParent' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'SHChangeNotifyDeregister' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'SHChangeNotification_Lock' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'ILIsParent' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'ILFree' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'ILIsEqual' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'ILClone' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'SHChangeNotification_Unlock' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unresolved external 'SHChangeNotifyRegister' referenced from C:\USERS\YSAMA\APPDATA\LOCAL\TEMP\FILEHANDLER-557043.O
Error: Unable to perform link
という「DLLに関数が無いよ」という大量のエラーの合唱が発生しました。
しかし、これは逆にどこかのshell関係のライブラリーにこれらの関数のヘッダー情報がある、という確信となり、普遍的な名前でサイズの大きめのshell32.libに当りを付けて#pragma commentでshlwapi.libと共に明示的にリンク先指定を行いました。
#define WM_SHELLCHANGE WM_APP
#include <shlobj.h>
#include <shlwapi.h>
#pragma comment (lib, "shell32.lib") //これを追加した
#pragma comment (lib, "shlwapi.lib")
その結果(まぁ、試行錯誤だけなんですけど)、目出度くきれいにビルドされ、正常稼働させることができました。
これでやっとbcc32c.exeによるコンパイリングの本来の目的である新しめのshell サービス(FileHandler)やCOMサービス(TextToSpeech)を使ったプログラム開発ができることが証明され、「打率100%」に満足しています。
新しいFileHandlerのファイルも本日差し替えましたので、ダウンロードしていただければ本日からビルド可能になります。これでやっと20年ブランクの肩の荷が下りた気分です。
ps. おそらくFileHandlerにライブラリーのコードを取り込まず、dllで処理しているのか、bcc32によるファイルサイズが186KBだったのに対し、bcc32cによるファイルサイズは116KBと初めて小さくなりました。
