12

私の一般的な質問は、「どれだけクリーンアップして再コンパイルしても、消えない依存関係が原因で BPL がロードされない」のトラブルシューティング方法です。 更新クリーンに再コンパイルされたシステムを持っていると思うかもしれませんが、Windows とそのファイル システム仮想化の誤機能という逆の奇跡のおかげで、そうではありません。

デザインタイムパッケージ(この場合は という名前dclFsTee.bpl)を Delphi IDE(高速レポート 4 ティーチャート ラッパー コンポーネント パッケージ)にロードしようとすると、次のようにエラーが表示されます。

The program can't start because tee7100.bpl is missing from your computer. Try reinstalling ...

それtee7100.bplは、私が知っているシステム上のどの DCP または DCU ファイルでも参照されていません。しかし、明らかに何かがおかしいので、問題が見つかりません。

すべての Delphi ユーザーは、BPL に関する「コンパイルできない、または読み込まれない」問題に直面しています。何をすべきかと尋ねられたときの一般的なリフレインは、コンピューターをクリーンアップすることです。

しかし、私は今、何時間もかけてコンピューターのクリーンアップを行ってきました。すべてのファイルがコンパイルされている間に、古いバージョンの何かがどこかに隠れていることは明らかです。数日前にこのシステムから削除した TeeChart BPL と、見つけたすべての痕跡。

私が削除した Delphi 2007 の TeeChart の痕跡には、$(BDS)\Lib および $(BDS)\Lib\debug フォルダー内のすべてと、システム上のすべての DCP および BPL フォルダーが含まれています。また、すべての TeeChart ユニット名の dcu ファイルがなくなりました。

道の終わりにたどり着いたら、次に何を試しますか? (ハードドライブをフォーマットし、新しいコンピュータを購入してください。) マジで。私は頭の良い人だと思いますが、1 TB のハード ドライブ、80 以上のフォルダーに実行されるライブラリ パス、およびよく整理されているように見えるソース コード リポジトリを持っていますが、明らかに何かが隠れています。それを見つける。

完全なソース コードを含む TeeChart Standard 2012 を使用しています。私の知る限り、私の開発マシンには、デルファイに同梱されている「ティー チャート tee7100.bpl」バージョンの古い TeeChart BPL または DCP ファイルが含まれていません。

Teechart に付属の "recompile.exe" ウィザードを実行しました。これは、tee.inc ファイルに {$DEFINE x} 宣言を記述した後、MSBuild を実行してパッケージをビルドするように見えます (ソースには 2 つあります)。分布)。

しかし、どういうわけか、パッケージの 1 つへの暗黙的なインポートの 1 つが、再構築されていない古いファイルを描画しているように見えます。そのため、tee7100.bpl をロードしようとします。新しい bpl 名は、tee911.bpl です。

かなり具体的な高速レポートの質問をするのではなく、Delphi での開発中に何十回も直面した一般的な傷の世界の特定の例として言及しているだけです。

高速レポートの詳細のみを提供しているので、これは実際には、依存関係のあるコンポーネント ソース コードまたはパッケージ、またはパッケージのセットを扱うときに Delphi IDE 内で時々直面する一般的な問題の特定のインスタンスであることがわかります。 . コードがビルドされるようにコンピューターをクリーンアップするのは難しい場合があります。

だから、ここに私のDelphiパッケージからパッケージへの依存関係解決の質問があります:

  1. 私のコード(問題なくビルドおよびコンパイルされます!)が実際に Delphi IDE にロードされるように、不要になった BPL の暗黙的なロードの問題を見つけたり追跡したりする最も効果的な方法は何ですか。Recompile を実行した結果の BPL ファイルは、適切な DCP ファイルに正しくリンクしているように見え、古い/古い DCP または DCU ファイルは存在しません。たとえば、新しい DCP ファイル名は、tee911.dcp です。

  2. どうにかして、どのパッケージが実際に古くなっているか、.bpl がリンクされているときに何が読み取られ、リンクされ、静的にインポートされているかについて、何らかの考えを得ることができますか? (BPL ファイル用の特別な MAP のようなファイルのように考えているのでしょうか?)

更新これと何時間も格闘し、私が知っているすべてのトリックを使用した後、Windows 7 のファイル仮想化に起因するいくつかの関連する問題を確認しVirtualStoreていないことに気付きました.つまり、Windows 7 はその上で実行されるプログラムに嘘をついている. それはあなたが望むものではない別のバージョンのファイルを提供します。これはいくつかの点で致命的です。1; BPL を再コンパイルしますが、それはロードされません。私を殺していた BPL は、VirtualStore の一部である SysWow64 フォルダーにありました。仮想ストアは、基本的に、Win7/64 ビットの Delphi 2007 のように、特定の「権限の低い」プログラムである場合にのみ存在するファントム ファイルを表示することに注意してください。現在のユーザー アカウントの SysWow64 VIRTUALSTORE フォルダーにある BPL ファイルを削除するには:

   del %HOMEPATH%\AppData\Local\VirtualStore\Windows\SysWow64\*.bpl

... Windows アーキテクチャが嫌いな日もあります。とにかく、私は上記を答えにするつもりはありません.

4

3 に答える 3

12

他の誰も答えなかったので、将来の人に役立つようにこれをここに置きます:

-- TeeChart、FastReport、Indy などの古いバージョンの DLL が含まれる壊れたシステムをクリーンアップするときは、Windows VirtualStore を覚えておいてください。これらは「デルファイに同梱されているアウト オブ ボックス パッケージ」として存在する可能性があるため、混乱に巻き込まれる傾向があります。ベンダーから直接購入してインストールした場合はアップグレード バージョンとして頻繁にインストールされます。

-- 重複または期限切れの BPL を検索する場合、Windows でファイル検索を実行しても仮想ストアが検索されないため、プロセス、ユーザー、またはプログラムの仮想ストア領域全体を手動で見つけてザッピングする必要があります。

この問題の第 2 レベルは次のとおりです。

FastReports の依存関係グラフは複雑です。

  • それは Indy に依存し、独自のバージョンの Indy を持っている可能性があります。また、Delphi 自体にも独自のバージョンがあり、ハード ドライブ上の他のものには独自の Indy のコピーがある場合があります。

  • Delphi に付属のバイナリを含む、TeeChart のさまざまなエディションをサポートしています。おそらく、Steema から購入した TeeChart の標準バージョンまたはその他の購入バージョンもサポートしています。

  • プリコンパイル済みヘッダー インクルード ファイルを使用してコンパイルを行い、同じ名前のインクルード (.inc) ファイルの 1 つだけではなく 2 つの異なるコピーを使用します。

  • 独自のコンパイラ ツール (FastReport を再コンパイル) を使用すると、かなり確実に動作しますが、単一のビルド スクリプトからプロジェクト内のすべてをビルドする場合には最適ではないため、問題の原因となります。

  • 重要なのは、膨大なパッケージの山にあるすべてのコンポーネントの依存関係について知っておくべきことをすべて学び、古いもの (Indy や TeeChart の bpls、dcp、または dcu など) がないようにシステムをきれいに整理することです。ファイル) が横たわっています。自分が何をしているのかわからない場合、それを片付けるのは非常に複雑な作業です。

    • システムに同梱されている Indy と TeeChart のバージョンのすべての痕跡を実際に削除するためのユーティリティと、FastReports の「Embarcadero エディション」は、この状況を解決するための鍵です。一般的なヒントは、「X のバージョンが Delphi に同梱されていて、新しいバージョンをインストールしようとしている場合は、システムが完全にクリーンアップされるまで、苦労する準備をしてください」というものです。

    • このがらくたをすべて回避するための本当に驚くべきテクニックは、最初の Delphi IDE のインストール中に Indy、FastReport、または TeeChart をインストールせず (チェックを外すかスキップする)、ソースから 1 つずつ自分でインストールすることです。バージョンが Delphi にプリインストールされているからといって、それは良いことではありません。(更新: インストール中に Indy の選択を解除することはできなくなりました。これは、少なくとも Delphi XE8 以降の基本的な Delphi 製品の一部です。組み込みの Indy を Delphi 独自の lib ディレクトリから削除するためのクリーンアップ ユーティリティは、独自のものを構築するすべての人に必要です。 .)

    • もう 1 つの非常に驚くべき手法は、商用コンポーネントのインストーラーを仮想マシンで実行し、Pascal ソース コードを収集してクリーンな開発マシンに転送し、自分でビルドすることです。そうすれば、BPL などをシステムに散らばらせたり、C:\Windows\System32(32 ビット システムの場合) やC:\Windows\SysWow64(64 ビット システムの同等のパス) にインストールしたりするときに発生する恐ろしい事態を回避できます。

于 2013-01-22T16:45:17.527 に答える
1

これを引き起こす可能性のあるもう 1 つの問題は、.bpl ファイルを保存したフォルダーがシステム パスにないことです。

これは、Delphi が WinAPI 関数 LoadLibrary を絶対パスではなくファイル名で呼び出そうとするために発生します。したがって、Windows がファイルを見つけられない場合、Delphi はそのファイルをロードできません。

詳細については、このフォーラムの投稿を参照してください。

これは、Windows 10 ではなく、Windows 7 の問題のようです。

于 2016-05-03T13:37:38.140 に答える