4

モノリシックな EXE を EXE といくつかのパッケージの組み合わせに分割しようとしています。これまでのところ、使用しようとしているパッケージが 1 つあります。EXE Codeguard を実行すると、起動時に次のエラーが表示されます。

CGエラー

2 つの異なる CRTLDLL がロードされます。CG が誤ったエラーを報告することがある
(C:\Windows\system32\CC32100MT.DLL)
(D:\Projects\Foo\Bar.bpl)

わかった   

私はこれを、2 つの異なるランタイム ライブラリが読み込まれていると読みました。

プログラムの実行を続けると、奇妙なエラーが表示されます。特に、クラス間でキャストしたり、EXE/DLL の境界を越えるメソッドのパラメーターとしてクラスへのポインターを渡したりしています。ただし、Codeguard 自体には、他のエラーはまったく表示されません。 編集:これは現在解決されており、関連していませんでした。プログラムは正しく実行されているように見えますが、Codeguard が表示する警告は依然として心配です。

これをどのように解決しますか?

いくつかの詳細

私たち (これに取り組んでいる開発者と私) がまとめて考えられる限り多くのことを検討しました。

  • 各プロジェクトは、ランタイム パッケージを使用してビルドされます。EXE ホストは、そのパッケージ リストに Bar をリストします。

  • 各プロジェクトは、動的 RTL でコンパイルするように設定されています。ただし、これを変更しても問題は解決しません。

  • パッケージは BPI ファイルを介して EXE にリンクされますが、LIB を介してリンクしても違いはありません。

  • EXE と BPL は同じプロジェクト設定でコンパイルされ、両方のタイプのプロジェクトに同じオプションが存在します。とにかく、私たちは考えます:)

  • システムには BPL と BPI のコピーが 1 つだけあります。これは間違いなく正しいものにリンクしています。

  • と を使用して EXE と BPL を調べると、Depends両方TDumpが を使用していることがわかりC:\Windows\system32\CC32100MT.DLLます。どちらも 1 つの RTL を使用する必要があります。

  • 新しいプロジェクト (プレーンな VCL フォーム アプリケーション) を作成し、(BPI を介して) BPL にリンクすると、正常に動作します。これを変更するために必要なコードを EXE に含めるすべてのファイルと LIB を追加する過程で何かが行われていますが、何が原因かはわかりません。

    • LIB はすべて、私たちが使用する DLL (フラット C インターフェイス、通常は MSVC でビルドされたかのように見えます) に対応するか、EXE にリンクする目的で lib にコンパイルされた、多数の関連ファイルを含む単純なプロジェクトです。これらはおおまかに対応しています。ちなみに、BPLに分割したいプログラムの領域に。見逃していない限り、RTL リンクに影響する LIB プロジェクトのプロジェクト オプションはないようです。

    • 私はDepends、EXE およびすべての DLL が参照するすべての RTL および CC32*.dll ファイルを徹底的に探し出して調べました。rtl140.bpl と CC32100MT.DLL はすべて同一です。完全修飾パスは、それらが同じファイルであることも示しています。すべてが 1 つの同じランタイム ライブラリを使用する必要があります。

編集: 最終的な EXE は複雑で、いくつかのライブラリ、いくつかの DLL などでビルドされています。これらはすべて、C++Builder でビルドすると、現在のバージョンでビルドされます。これらの DLL または LIB のいずれかに問題を引き起こす可能性のあるものがある可能性はありますか? RTL がどのようにリンクされているかについては、どこを見ればよいかを確認するのに十分な知識がありません... 私の (素朴な?) 仮定では、リンカは通常、RTL 関数の 1 つのセットにリンクしますが、もちろんそうではありません。起こっているようです...そして、パッケージを使用すると状況がどのように変化するかわかりません。パッケージのような動的なものを使用したことがないため、このエラーが常に存在し、Codeguard が以前にフラグを立てていなかった可能性はありますか?

おそらく別の質問は、パッケージが独自の RTL を持っているのはなぜですか、または Codeguard にとって「RTL DLL」とみなされる理由は何ですか?

私たちは困惑しています。絶対に困惑した。BPL を使用する際には他にも問題がありましたが (特に C++ を使用すると、驚くほどトリッキーなようです)、すべて解決することができました。これはまったく運がなかったので、洞察をいただければ幸いです:)

C++Builder 2010 を使用しています(実際には RAD Studio の一部ですが、コンポーネント以外に Delphi コードはほとんどありません)。

編集:賞金を開始しました。どうしても解決したい!

編集 2: David Deanの助けに感謝します (以下に回答としてマークされています)。電子メールで、彼はこの問題が他の誰かによって単純なテスト ケースで再現され、レポート 86335 として Embarcadero QC に記録されていることを指摘しました。現在のところ修正はありませんが、警告は本物の問題を示しているようには見えません (つまり、おそらく偽のエラーであり、実行時にダイアログをクリックして先に進む必要があるのは残念ですが、エラーで心配することは何もないことを願っています)。約。)

4

4 に答える 4

1

_TCHARをcharとして使用しているかどうかを確認しましたか。RAD Studioでも同様の問題が発生し、_TCHARをcharとして使用する回避策が見つかりました。1つのDLLまたはBPLプロジェクトがwchar_tでコンパイルされるとすぐに、このコードガードエラーが表示されます。

また、EXEプロジェクトはTCHAR = wchar_tで問題なくコンパイルできることもわかりました(主な関数はWIDEになります)。

この設定は、GUIがUNICODEを処理できるかどうかには影響しません。

于 2010-07-24T18:42:24.477 に答える
1

顧客が公開バグ追跡システムに同様のケースを記録し、バグが特定され、最新のリリースで修正されました。

于 2010-09-02T16:10:36.277 に答える
1

同様の問題がありました。「マルチスレッド」オプションなしで作成された (非 VCL) .cbproj まで追跡しました。

私が知る限り、このオプションを設定する機会が得られるのは、新しい .cbproj を作成するときだけであり、後で GUI を使用して変更することはできません。最終的に .cbproj を「ハッキング」して、以下を含めました。

<Multithreaded>true</Multithreaded>

問題の原因となっている dll を特定するには、CG メッセージが表示される直前に出力ウィンドウにロードされた最後の dll である必要があります。

于 2010-07-07T09:04:17.443 に答える
1

これらの 1 つは .bpl から来ているので、プロジェクト オプションで「ランタイム パッケージでビルド」をオフにしてみましたか?

于 2010-07-01T14:56:33.857 に答える