0

TADOConnection を共有するいくつかの TDataModules を含む lib があります。一部のアプリケーションでデータモジュールを作成および削除します。

データモジュールを削除すると、EAccessViolation エラーが発生します。これは、データモジュールが共有されている TADOConnection を削除したいという事実によるものだと思います。

デストラクタが呼び出されたときに tdatamodule->tbquery->Connection プロパティを NULL に設定しようとしましたが、うまくいきませんでした。

エラーが TADOConnection にあると思うのはなぜですか? ライブラリなしでアプリケーションをビルドすると、問題なくデータモジュールを作成および削除できるためです。また、独自の接続を持つデータモジュールを使用してライブラリを作成しても、問題はありません。

何か助けはありますか?前もって感謝します!

エラー: http://oi60.tinypic.com/noyc6x.jpg

コール スタック: http://oi61.tinypic.com/sgljx5.jpg

4

2 に答える 2

0

borlndmm.dll解決策は、ライブラリまたは dll を使用してアプリケーションのプロジェクト フォルダに追加することです。

Borland C++ Builder の dll/lib プロジェクトから:

//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------
于 2014-02-18T12:12:50.753 に答える
0

のみが所有するTDataModuleものを解放します。TADOConnection複数のインスタンスで 1 つのインスタンスを共有している場合TDataModule、すべてのインスタンスがそれを所有することはできません。ただし、所有者を解放していて、TADOConnection解放されていることを他のインスタンスに通知していない可能性があります。VCL には、その目的のためのメカニズム、つまりTComponent::FreeNotification()メソッドがあります。オブジェクトTDataModuleは仮想Notification()メソッドをオーバーライドしFreeNotification()てから、TADOConnection. そうすれば、TADOConnectionが解放された場合TDataModule、ローカル ポインターを NULL に設定するなど、それを使用しているすべてのユーザーがそれに応じて動作し、TADOConnectionがなくなったことを知ることができます。

于 2014-01-31T17:10:32.120 に答える