TEventLogger.LogMessageでイベント出力されない症状について

Abstract: 発生している症状に関する解決方法について説明します。

dummy

対象となるIDE製品のバージョン

・XE3 ~ XE7

対象となるターゲット環境

・Windows 2012 Server + IIS 8.0

・DataSnap、WebBroker(64ビット)

dummy

    問題

特定の環境(例えば、Windows 2012 Server+IIS8.0)で動作するISAPI DLL(64ビット)を作成し、そのアプリケーションからTEventLogger.LogMessageメソッドを呼び出しても

イベントが出力されない症状が発生します。

この症状は、TEventLogger. LogMessageメソッドの中で、Windows APIのRegisterEventSource関数を呼び出し、イベントログの登録済みハンドルを取得しているのですが、このハンドルを保持するTEventLoggerクラスのメンバー変数(FEventLog)の型がTHandleではなく、Integerとして定義されているために生じます。

この不具合(定義の間違い)は、32ビットアプリでは潜在的な問題はあったものの実行には支障はありませんでしたが、64ビットアプリの実行でその問題が顕在化されました。

dummy

    解決

この問題を解決するには、TEventLogger. LogMessageメソッドを利用せず、Windows APIを呼び出すか、Vcl.SvcMgr.pasの該当箇所を修正し、自身のプロジェクトへ組み込んでください。

dummy

Vcl.SvcMgr
=======================
(修正前) 
type
  { TEventLogger }

  TEventLogger = class(TObject)
  private
    FName: String;
    FEventLog: Integer;
..

(修正後) 
type
  { TEventLogger }

  TEventLogger = class(TObject)
  private
    FName: String;
    FEventLog: THandle;
..