複数バージョンが共存する環境で、TClientDataSetでモジュール'dsnapXXX.bpl'のAccessViolation(アクセス違反)が発生することがある
問題
同一PC内に複数のDelphi/C++Builderをインストールし、共存させて利用しています。
(例えば、旧バージョンのプロジェクトを移行するため、Delphi 2007とDelphi 11を同一PCにインストール)
以下は、複数バージョンを共存したPCで、エラーが発生する例です。
- Delphi 11.0 起動
- [ファイル] → [新規作成] → [Windows VCL アプリケーション - Delphi]
- TClientDataSetをForm1に貼り付け
- TClientDataSet FieldDefsプロパティで項目追加
- TClientDataSetを右クリック[データセット作成]
- 以下のエラーが表示される
モジュール'dsnap280.bpl'のアドレス5133E6DFでアドレス000000000に対する 読み取り違反が起きました。
プロジェクトのビルドができますが、プログラムを実行すると
TClientDataSetのデータ作成がされないため、
「データセットは閉じているため、この操作は実行できません」の
エラーが発生し、正常に動作させることができません。
解決
TClientDataSetコンポーネントは、実行時にmidas.dllという外部モジュールを参照しているのですが、 同一PC内に複数バージョンのDelphi/C++Builderがインストールされている場合、Delphi 11用のmidas.dllではなく、古いバージョンのmidas.dllをIDEやアプリケーションを参照することで意図しない動作が発生し、その結果、実行時にAccess Vilolationが発生する可能性があります。
Delphi/C++Builderの各バージョンごとに、midas.dllという同じ名前のファイルがインストールされています。
midas.dllが複数存在するかどうかは、ご利用のPCでmidas.dllというファイルを検索し、このファイルが配置されているフォルダを確認してください。アプリケーション実行時にDLLをロードする順序は、MicrosoftのWindowsの仕様に準拠します。
特にシステムフォルダにmidas.dllが存在する場合は、ご注意ください。
原則、同一PC内の複数バージョンのDelphi/C++Builderの共存はトラブルに繋がることが多いため、上級者を除いて同一PC内の複数バージョンのDelphi/C++Builderの共存は推奨していません。
複数バージョンのDelphi/C++Builderを同時に利用される場合は、それぞれのバージョンを別々のPC、あるいは仮想環境(VM)を用意してインストールしてください。