2

Delphi 2007 アプリケーションで、標準 VCL ユニット Controls.pas の TControl.Perform メソッドで定期的なアクセス違反が発生しています。コール スタックは次のようになります。

exception message : Access violation at address 00000000. Read of address 00000000.

Main ($1cac):
00000000 +000 ???
004cd644 +024 mainexe.exe  Controls  5021   +5 TControl.Perform
004ce705 +015 mainexe.exe  Controls  5542   +2 TControl.CMMouseEnter
004cd9b7 +2bb mainexe.exe  Controls  5146  +83 TControl.WndProc
004d19bb +4fb mainexe.exe  Controls  7304 +111 TWinControl.WndProc
004a8ff8 +06c mainexe.exe  StdCtrls  3684  +13 TButtonControl.WndProc
004cd644 +024 mainexe.exe  Controls  5021   +5 TControl.Perform
004d182b +36b mainexe.exe  Controls  7255  +62 TWinControl.WndProc
004a8ff8 +06c mainexe.exe  StdCtrls  3684  +13 TButtonControl.WndProc
004d10e4 +02c mainexe.exe  Controls  7073   +3 TWinControl.MainWndProc
0048af08 +014 mainexe.exe  Classes  11583   +8 StdWndProc
75ce7bc5 +00a USER32.dll                       DispatchMessageA
004ecaf4 +0fc mainexe.exe  Forms     8105  +23 TApplication.ProcessMessage
004ecb2e +00a mainexe.exe  Forms     8124   +1 TApplication.HandleMessage
004ece23 +0b3 mainexe.exe  Forms     8223  +20 TApplication.Run
0136cac7 +383 mainexe.exe  mainexe    326  +45 initialization
75563398 +010 kernel32.dll                     BaseThreadInitThunk

オフィスで再現することはできないため、MadExcept を介して顧客から直接コール スタックを取得するだけです。

原因を診断または特定し、この方法で発生した障害を修正する方法がわかりません。誰かがこの「TControl.Perform」スタイルのアクセス違反を見て、根本的な原因について何らかの考えを持っていることを願っています。

私の一番の疑いは、コードの他の領域によってフォームが「解放」されたこと、ウィンドウ メッセージが処理されていること、および TControl (実際のフォームの実際のコントロールの基本クラスとして) が単に失敗していることです。 Self が nil であるか、ウィンドウ ハンドルなどのリソースが無効であるためです。

Delphi デバッガーにアクセスせずにクライアントのコンピューターで実行できる、この問題の診断に役立つ手法を探しています。私が考えていたのは、いくつかのログを追加すること (しかし何?) や、クライアントのマシンで WinDbg (Windows SDK デバッガー ツール) を実行することです。

4

1 に答える 1

0

上記の問題は、TMS StringGrid コントロールの古いバージョンが原因で発生し、問題のコードは WM_MOUSEMOVE で実行されていましたが、責任は TMS ではなく、私にありました。 TMS コンポーネント フォルダのクリーン アップデートを実行します。

新しいバージョンのコードで再構築しDCU、アプリケーションにリンクされていた古いファイルを削除すると、問題はなくなりました。

要するに、アプリにあると思うソース コードがありDCU、ライブラリまたはプロジェクトの検索パスに古いフォルダーがある場合、リリース ビルド用に、コードに不思議なプリコンパイル済みのものがあります。古い DCU をそのままにしておくことを可能にするような方法でプロジェクトを構成するべきではなく、バージョン管理システムに DCU を含めるべきではないことは既に知っていましたが、これは私をすり抜けてしまいました。

于 2013-01-22T16:39:15.477 に答える