アドレスに対する読み込み違反の解決方法

解決


studio-take  2012-07-22 17:50:20  No: 42655

Form付DLLを使っているんですが、気がついたら、DLLフォーム終了後アドレス読み込みエラーが出るようになっていました。
メインフォーム起動時にすべてのフォームとデータモジュールをCreateし、
メインフォームのCloseイベントで、全部Freeしています。
Closeイベントをステップ実行で追ってみたんですが、

procedure TMain.FormClose();
begin
DataModule.Free;
SubForm1.Free;
SubForm2.Free;
MainForm.Free;
Application.Handle := 0;
end;

で最後まで通ってエラーが出ます。
MainFormとDatamoduleだけのときは出てなかったので、やっぱりSubFormを使わない仕様に戻していき、確認するしかないのでしょうか?


studio-take  2012-07-22 19:16:18  No: 42656

Form付DLLを20くらい作ってるんですが、そのいくつかに起動・終了を繰り返すとアドレス読み込みエラーが出ると分かりました。

4回目で出るのもあれば、2回目で出るのもあります。
おなじDLLでもXPだと2回目、Win7だと1回目の終了時から出たりします。

これは、プロジェクトのファイルが壊れてるのか、Delhiの方が壊れているのか、検討もつきません。

While文で無限ループに入って強制終了したり開発が荒っぽくなるので、どうしてもそっちも心配になります。

環境はwinXP + Delphi7entです。


igy  2012-07-23 00:51:44  No: 42657

>プロジェクトのファイルが壊れてるのか、Delhiの方が壊れているのか、

アドレスに対する読み込み違反 なら、それらの可能性は低い気がします。(断言はできませんけど・・)

>Form付DLLを20くらい作ってるんですが、そのいくつかに起動・終了を繰り返すとアドレス読み込みエラーが出ると分かりました。

シンプルな Form付DLL をテスト用にいくつか作成して、それを
起動・終了を繰り返してもエラーが表示しますか?

そのコードでエラーが表示するなら、そのテスト用のコードをここに挙げてみるのはいかがですか?


studio-take  2012-07-23 05:57:19  No: 42658

ちょっと気分転換してるうちに気づいたのですが、
StringGridのOnDrawCellで、入力されたキーコードでDataModuleのクエリーから表示用の名称を引っ張ってくる仕様にしていました。
それが自動の処理だから、先にDataModuleを解放するとアドレスエラーになるのではと思い、

DataModule.Free;
MainForm.Free;
Application.Handle := 0;

から
MainForm.Free;
DataModule.Free;
Application.Handle := 0;

に代えてみました。
案の定、アドレスエラーが格段に減りました。
といっても、2回めエラーから5回目エラーになった程度ですが、
フォームが抱えている自動処理をしらみつぶししてみようと思います。


studio-take  2012-07-23 07:00:31  No: 42659

ちなみにエラーの出るリアルソースです。
//////////////////////////////////////////////////////////////////
//DLL呼び出し
function AcceptOrderCreate(hWnd: THandle; User,Password:PChar):WordBool; stdcall;
begin
  Result := False;
  //引数処理
  Application.Handle := hWnd;
  UserCode := User;
  SQLPassword:=Password;
  //サイドフォーム管理
  dmDatabase       := TdmDatabase.Create(Application);
  frmSectionSelect := TfrmSectionSelect.Create(Application);
  frmDayMissFollow := TfrmDayMissFollow.Create(Application);
  frmOrderCheck    := TfrmOrderCheck.Create(Application);

  //自分
  frmMain := TfrmMain.Create(Application);
  frmMain.Show;
end;

exports AcceptOrderCreate;
/////////////////////////////////////////////////////////////////////
//終了処理
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //更新があったら
  if QualifeCheck then
  begin
    if MessageDlg('情報が更新されています。保存してもいいですか?',mtConfirmation ,[mbYes, mbNo], 0) = mrYes then
      actDBAddExecute(Sender);
  end;

  WriteIni;
  //解放
  frmMain.Free;
  frmSectionSelect.Free;
  frmDayMissFollow.Free;
  frmOrderCheck.Free;
  
  dmDataBase.Free;

  Application.Handle := 0;
end;

グリッドを使わないカード型の入力フォームはエラーでないんです。


igy  2012-07-23 07:18:20  No: 42660

フォームの解放は、Freeメソッドではなく、Release メソッドを使用しても同じですか?


studio-take  2012-07-23 07:43:38  No: 42661

治りました!

何回起動してもアドレスエラーが出ません。
データモジュールはFreeのままで、フォームはReleaseにしました。


studio-take  2012-07-23 07:45:53  No: 42662

igyさん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加