昨日の今日で恐縮ですが、唯一コンパイル不可であった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と初めて小さくなりました。