質問

プログラムの起動時にクライアント コンピュータにインストールされている BPL (Rtl70.BPL、Indy70.bpl など) のバージョンを確認することはできますか?

コンピューター上の BPL がビルド マシン上の BPL と異なるため、いくつかのプログラムがクラッシュしました。
更新のたびに、使用する各 BPL をインストーラーに追加する必要がある場合、使用上のポイントの 1 つが無効になると思います。

Delphi 7、それが違いを生むなら


私が抱えていた問題のフォローアップです。
rtl70.bpl ファイルは、ビルド コンピューターとクライアントの間でわずかに異なっていました。

クライアントのコンピュータ:7.0.4.453 760 KB (778,240 バイト) 2002 年 8 月 20 日火曜日、午後 4 時 40 分 26 秒
コンピューターを構築する:7.0.4.453 760 KB (778,240 バイト) 2002 年 8 月 9 日金曜日、午後 11:30:00

私が使用していたアップデーターはそれらを同じものとして無視しました(ビルド番号は変更されませんでした)が、ファイルを手動で削除してコピーしたところ、すべてが機能したように見えました。

役に立ちましたか?

解決

残念だけど違う。アプリケーションに必要な .bpl ファイルからのインポートが欠落していることがクラッシュの原因である場合、クラッシュした実行可能ファイル自体内からそれらのパッケージを確認する方法は (Delphi RTL とリンカー自体を書き直す以外に) ありません。PatrickvL のソリューションはおそらくあなたの状況に最適です。

Neftalí のソリューションは選択肢になるかもしれません。もちろん、その代償として、RTL をパッケージ化し、多くのファイルを複製し、そもそもパッケージを用意するメリットの 1 つを失います。ただし、プライベート DLL を使用している場合 (つまり、プライベート バイナリ ディレクトリに DLL をコピーする場合)、実行可能ファイルと同じ名前で拡張子を追加した空のファイルも作成する必要があります。 。地元 それに、つまりのために メモ帳.exe を作成します notepad.exe.local. 。見る DLL リダイレクトに関する Raymond Chen の記事 詳細については。

他のヒント

プログラムがクラッシュする場合は、動的にリンクされているライブラリをロードできないことが原因である可能性があります。(あなたが言っているように、これはシステムが検索パスのどこにも必要なライブラリのコピーを見つけられない場合に発生します)。

問題は、これがアプリケーションの起動時に発生することです。これは、Windows OS が という API を介して実行します。 マップアンドロード (こちらも読んでください これ)。この API はアプリケーションが開始される前に呼び出されるため、これをインターセプトする方法がわかりません。

私ができる提案の 1 つは、ランチャーを使用することです (/no/ ライブラリがまったくない場合の問題を防ぐために、ランチャーを静的にリンクする必要があります)。このランチャーは、実際のアプリケーションを検査し、必要なインポートを確認し、環境をチェックして、エラーやトラブルシューティングに関する適切な提案ダイアログをユーザーに表示します。

プログラムの起動時に、クライアント コンピュータにどのバージョンの BPL (Rtl70.BPL、Indy70.bpl など) がインストールされているかを確認することはできますか?コンピューター上の BPL がビルド マシン上の BPL と異なるため、いくつかのプログラムがクラッシュしました。更新のたびに、使用する各 BPL をインストーラーに追加する必要がある場合、使用上のポイントの 1 つが無効になると思います。

BPL のコピー (開発版) (RTL70.bpl、INDY.BPL など) を、アプリケーションをインストールするのと同じディレクトリにインストールする必要があります。アプリケーションは最初に同じディレクトリにある BPL を検索し、その後パス内のディレクトリを検索します。マイナス点は、システムに同じ BPL のコピーが複数存在できることですが、プラス点は、同じファイルの異なるバージョンで問題が発生しないことです。

よろしく。

PD:私の下手な英語ですみません。

これらの bpl を使用する実行可能ファイルからこれを行うことはできませんが、bpl をチェックしてからメインの実行可能ファイルを呼び出す小さな起動プログラムを作成することはできます。

場合によっては、Delphi が次の行に自動的に追加することがあります。
{$R ' *.res'}
プロジェクトまたはパッケージのファイルに。

その行をコメント化 (//) して、再度コンパイルします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top