動的に作成されたすべてのデータ モジュールを TList にロードするアプリケーションがあります。アプリケーションは Windows XP OS で実行されています。アプリケーションの閉じるボタンからアプリケーションを閉じると、コードが正しく実行されます。ただし、タスクバー メニューからアプリケーションを閉じると、無効なポインター操作が発生します。さまざまな方法でアプリケーションを閉じると、同じコードでも動作が異なります。
データモジュールの破棄を担当するコード
for iPos := 0 to FDatamodules.Count - 1 do //FDataModules is of type TList
if FDatamodules.Items[iPos] <> nil then
TDatamodule(FDatamodules.Items[iPos]).Free;
そしてスタック
:7c812a6b kernel32.RaiseException + 0x52
System.TObject.FreeInstance
System.ErrorAt(2,$4A7FEFC)
System.Error(reInvalidPtr)
System.TObject.FreeInstance
System._ClassDestroy(???)
Classes.TDataModule.Destroy
System.TObject.Free
RBAFORM.TRBABaseForm.Destroy
LE: タスクバー メニューからアプリケーションを閉じると、アプリケーションに HALT(0) が送信され、データ モジュールが解放されるようです。次の画像では、左側が通常の閉じるアクションのスタックで、右側がタスクバー メニューからアプリケーションを閉じるスタックです。