0

ランタイム パッケージでビルドされたアプリケーションがあります。実行可能ファイルが起動すると、必要なパッケージ (.bpl) が自動的に読み込まれます。

最近、ターミナル サービスとして使用する Windows 2008 R2 サーバーをインストールしました。

次のように、アプリケーションのいくつかの古いコンパイル済みバージョンをさまざまなパスに保持します。

c:\app\version_1\common.bpl
c:\app\version_1\app.exe

c:\app\version_2\common.bpl
c:\app\version_2\app.exe

Common.bpl は、app.exe が依存するランタイム パッケージです。

問題:

起動する"c:\app\version_2\app.exe"とロードされます"c:\app\version_2\common.bpl"。を開始する"c:\app\version_1\app.exe"と、間違った bpl (version_2 から) が読み込まれます。

パス"c:\app\version_2\"がシステム検索パスにありません。

Windows2003 サーバーでは、この問題は発生しません。

これを解決するにはどうすればよいですか?

ありがとう!


Process Explorer (microsoft sysinternals) をダウンロードし、各実行可能ファイルのロード済みモジュールを確認しましたが、すべて正しいです!

しかし、私は別の問題に気付きました。2 番目のバージョンを開始した後、entry-not-found-error が発生し、いずれかのバージョンにのみ存在するユニットの初期化エントリ ポイントが見つからなかったことを通知します。

何かがとても奇妙です。ProcessExplorer は、プロセスが正しいモデルをロードしていることを教えてくれますが、それらが実行されているとき、これは起こっていないようです。

アプリケーションがロードされたモジュールを共有しているようです。


解決した

FindVCLWindow を使用する MouseHook があり、これが AV を生成していました。

ご不便をおかけして申し訳ありません。ありがとうございます。

4

1 に答える 1

2

BPL がEXE に静的にリンクされている場合、および EXE の実行version_2時に BPL が既にメモリ内にある場合version_1、Windows はメモリ内の既存の BPL を再利用し、他の BPL の新しいコピーを再読み込みしません。これは文書化された動作です:

lpFileName にパスが含まれておらず、同じ基本名と拡張子を持つ複数の読み込まれたモジュールがある場合、関数は最初に読み込まれたモジュールへのハンドルを返します。

静的リンクを使用する場合、パス情報がないため、OS ローダーはファイル名を自分で取得する必要があります。

試みていることを行うには、各 EXE の .local ファイルを作成して互いに分離し、それぞれの DLL を並行してロードできるようにする必要があります。

Windows での DLL/COM リダイレクト

ダイナミック リンク ライブラリのリダイレクト

于 2012-10-10T21:59:49.230 に答える