TEventLogger.LogMessageでイベント出力されない症状
対象となるIDE製品のバージョン
- Delphi XE3 ~ XE7
対象となるターゲット環境
- Windows 2012 Server + IIS 8.0
- DataSnap、WebBroker(64ビット)
問題
特定の環境(例えば、Windows 2012 Server+IIS8.0)で動作するISAPI DLL(64ビット)を作成し、そのアプリケーションからTEventLogger.LogMessageメソッドを呼び出してもイベントが出力されない症状が発生します。この症状は、TEventLogger. LogMessageメソッドの中で、Windows APIのRegisterEventSource関数を呼び出し、イベントログの登録済みハンドルを取得しているのですが、このハンドルを保持するTEventLoggerクラスのメンバー変数(FEventLog)の型がTHandleではなく、Integerとして定義されているために生じます。
この不具合(定義の間違い)は、32ビットアプリでは潜在的な問題はあったものの実行には支障はありませんでしたが、64ビットアプリの実行でその問題が顕在化されました。
解決
本件は、XE8以降で修正済みです。
XE8以前のバージョンでこの問題を解決するには、TEventLogger. LogMessageメソッドを利用せず、Windows APIを呼び出すか、Vcl.SvcMgr.pasの該当箇所を修正し、自身のプロジェクトへ組み込んでください。
Vcl.SvcMgr.pas
//(修正前)
type
{ TEventLogger }
TEventLogger = class(TObject)
private
FName: String;
FEventLog: Integer;
..
//(修正後)
type
{ TEventLogger }
TEventLogger = class(TObject)
private
FName: String;
FEventLog: THandle;
..