realbios
@realbios (Real Bios)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Access violationエラー発生時の対処方法(解消済)

前提・実現したいこと

使用言語:Delphi+C#
IDE:Rad Studio10.2で構築されたプロジェクトを10.4に移行して開発。
C#はクラスライブラリとして生成し、COM相互運用はOFFに、COM参照可能にチェックボックスONにしてビルド。
OS:Windows10
Rad Studio10.4でビルドしたモジュール'xxxxxx.exe'を実行したら、下記エラーが表示され処理ができません。
上記エラーが発生した場合の確認方法や確認手段、疑うべき部分、手順などを教えて下さい。

発生している問題・エラーメッセージ

Access violation at address 0066472F in module 'xxxxxx.exe'.Read of addres 0000007C.

該当のソースコード

Delphi(XXX.pas)の画面部品初期化(イニシャライズ)部分で発生。

試したこと

メインモジュールの表示処理で、「メインモジュールのuses句で結合している『インストール済設計時パッケージ』」の一部がnilになり、nilになった結果、nil部品の内部プロパティをセットしようとし、「Access violation」が出力されているところまで分かったが、
・問題のある設計時パッケージはRad Studio10.4で正常インストールされており、「設計時パッケージ一覧に表示されている」
・問題のあるパッケージを直接プロジェクトファイルをRad Studio10.4で開いてクリーンアップ&ビルド正常終了
・Rad Studio10.4でデバッグ実行時に、「Access violation」エラー発生
・Rad Studio10.4でビルドしたモジュールexeを起動させた場合も、「読み取り違反」エラーが発生
・今回の問題の発生直前で変更したポイントは「Rad Studioを10.2⇒10.4に変更」(ビルド端末には.NET3.5.2と4系では.NET4.6までが導入されいてる)
・「Access violation」エラーが発生した際、デバッガでコンポーネントの追加をモジュール画面から行ったが「読み込めなかった」
・当該モジュールのコンパイル指定はRad Studio2007のコンパイルバージョンが最高値(VCL4)だった。Rad Studio10.4で再ビルドしたがエラー解消せず。
・今回の問題の発生直前で変更したポイントは「Rad Studioを10.2⇒10.4に変更」(ビルド端末には.NET3.5.2と4系では.NET4.6までが導入されいてる)
・「Access violation」エラーが発生した際、デバッガでコンポーネントの追加をモジュール画面から行ったが「読み込めなかった」
・当該モジュールのコンパイル指定はRad Studio2007のコンパイルバージョンが最高値(VCL4)だった。Rad Studio10.4で再ビルドしたがエラー解消せず。
・OracleクライアントのDLLなど他のモジュールは読み込めている。
・データベースアクセスを行うpasモジュールをデザイナで開こうとすると『TQueryがない』旨の、Rad Studioのエラーポップアップ表示
・問題が起きているモジュールはRad Studio10.2、.NET3.5では「ビルド後のモジュールで起動、動作できていた」
・Rad Studio10.4にバージョンアップ、設計時パッケージ一覧をエンバカデロ提供「移行ツール」で移行した。
・問題発生後、「設計時パッケージ一覧」から項目削除、当該モジュールをクリーンアップ&ビルド後にパッケージのインストールで正常登録を確認。
・クリーンアップ&ビルド後に再度デバッガで起動確認を行ったところ、当該モジュールのインスタンスをセットしているタイミングで、セットの元の中身がnilだった。
・BDEを再インストール後、RadStudioにパッケージインストール、再ビルドを行ったが実行時エラーは変わらず。

0

2Answer

Access violationは、通常C#等の.NETプログラミングでは発生し得ないエラーなので、ネイティブDLL等を呼び出している処理があれば、それらを疑ってみた方がよいでしょう。

0Like

Comments

  1. @realbios

    Questioner

    ご助言ありがとうございます。
    確かにC#をDLL化したモジュールをRadStudio10.4で.NETアセンブリの取込機能を用いてプロジェクトに追加しています。
    実稼働機へは、ビルドモジュールコピー後、RegAsm.exeを行い、DLLを稼働端末に登録しています。

事象解消
原因はDelphiで作成されるファイルの内、.pasにのみ定義があり、.dfmファイルは外部コンポーネントが一時的に読み込み不可となった際に表示されるエラーポップアップで無視ボタンを押下したか、定義が消えておりました。
上記状態で、起点が存在しないため、pas上ではtype宣言してもnilになってしまう。ということでした。
クラスファイルは手順として、デザイン画面でフォーム上に載せる、という手順回避となりました。
ご助言いただいた方々、本当に、本当に、ありがとうございました。

0Like

Your answer might help someone💌