複数バージョンが共存する環境で、TClientDataSetでモジュール'dsnapXXX.bpl'のAccessViolation(アクセス違反)が発生することがある

提供: Support
移動先: 案内検索

問題

同一PC内に複数のDelphi/C++Builderをインストールし、共存させて利用しています。

(例えば、旧バージョンのプロジェクトを移行するため、Delphi 2007とDelphi 11を同一PCにインストール)


以下は、複数バージョンを共存したPCで、エラーが発生する例です。

  1. Delphi 11.0 起動
  2. [ファイル] → [新規作成] → [Windows VCL アプリケーション - Delphi]
  3. TClientDataSetをForm1に貼り付け
  4. TClientDataSet FieldDefsプロパティで項目追加
  5. TClientDataSetを右クリック[データセット作成]
  6. 以下のエラーが表示される
    モジュール'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)を用意してインストールしてください。