私はDLL(A.dll)を使用してATLのものを使用しており、その中にMFCを持つことはできません。しかし、MFCで必要なものがいくつかありますので、B.dllと呼ばれるMFC regular DLLを作成し、実行時にA.dll(インポートライブラリ経由)によって自動的にロードされます。通常のDLLと拡張DLL
ニーズがB.DLLで定義されたクラス(FOO)であり、クラスはMFCを使用することでいくつかのものを持っていることB.DLLの一部。 A.dllでfooオブジェクトを作成できましたか? Bは代わりに拡張DLLでなければならないのですか?
標準DLLページは言う:
レギュラーDLL内のすべてのメモリ割り当てが DLL内にとどまるべきです。 DLLは、に渡すべきではないか、 は、以下のいずれかの呼び出し実行 から受け取る:MFCに
ポインタMFC
によって割り当てられたメモリへ
ポインタオブジェクト拡張DLLページには、
と記載されていますクライアント実行可能ファイルは、定義された_AFXDLLでコンパイルされたMFCアプリケーションでなければならず、A.dllはMFCアプリケーションではありません。
この場合には、通常のDLLを使用するには問題ですか?
おかげで、
ブライアン
私はもともとBで定義されたMFCオブジェクトを作成していました。それがヒープエラーを引き起こしていたと思います。私は今、オブジェクトのライフタイムがBによって管理され、Aアクセスがエクスポートされた関数を介して機能するように変更しました。 これはcomオブジェクトではありません。インポートライブラリは、コンパイラまたはリンカによって生成された.libファイル、または何かを__declspec(dllexport)またはdefファイルに指定したときに生成されます。そして、それをインポートしてインポートライブラリにリンクするものは、実行時に自動的にdllをロードします。 – bdwain
OKです。はい、dll境界をまたいで新規/削除を混ぜると、時々予期しない結果が出ることがありますある時点でdllが他のdllとヒープを共有し、CRTの更新がインストールされると、それは(マニフェストの設定に応じて)独自のヒープを使用し始める可能性によって悪化します。私は共通の知恵は、他のモジュールによって割り当てられたモジュールの空きメモリを決して持つことではないと思います。言い換えれば、各モジュールに独自のメモリ管理があると言います。私が正しく覚えていれば、_USRDLL/_AFXDLLのDLLは、MFC固有のことを行うために、すべて別のヒープを持っています。 – Roel