2011-06-30 32 views
2

私は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を使用するには問題ですか?

    おかげで、

    ブライアン

  • 答えて

    1

    たぶん私は誤解だけど、Aは、MFCを使用できない場合、およびBは、どのようにあなたがAでオブジェクトをインスタンス化できないクラスを提供しますか?あなたは、オブジェクトを作成し、それをポインタを介してAに渡すファクトリ関数をBに持たせようとしていますか?その場合、Bが2つの異なるヒープを持つため、BがAではなくdelete()を呼び出すようにする必要があります。

    これはCOMオブジェクトですか、「インポートライブラリ」はどういう意味ですか? .libのスタブ、または 'インポートライブラリ' .tlbを使用して、通常のdll方法を話していますか? (私が思うのは問題ではない、私は状況を描写しようとしている)。

    +0

    私はもともとBで定義されたMFCオブジェクトを作成していました。それがヒープエラーを引き起こしていたと思います。私は今、オブジェクトのライフタイムがBによって管理され、Aアクセスがエクスポートされた関数を介して機能するように変更しました。 これはcomオブジェクトではありません。インポートライブラリは、コンパイラまたはリンカによって生成された.libファイル、または何かを__declspec(dllexport)またはdefファイルに指定したときに生成されます。そして、それをインポートしてインポートライブラリにリンクするものは、実行時に自動的にdllをロードします。 – bdwain

    +0

    OKです。はい、dll境界をまたいで新規/削除を混ぜると、時々予期しない結果が出ることがありますある時点でdllが他のdllとヒープを共有し、CRTの更新がインストールされると、それは(マニフェストの設定に応じて)独自のヒープを使用し始める可能性によって悪化します。私は共通の知恵は、他のモジュールによって割り当てられたモジュールの空きメモリを決して持つことではないと思います。言い換えれば、各モジュールに独自のメモリ管理があると言います。私が正しく覚えていれば、_USRDLL/_AFXDLLのDLLは、MFC固有のことを行うために、すべて別のヒープを持っています。 – Roel

    0

    通常のDLLが正しい選択であると思われます。

    通常のDLLの主な懸念事項は、MFCアプリケーションに読み込まれた場合、MFCとすべてのメタデータの2つの独立したコピーが存在することです。見つけたアドバイスは、メタデータ検索が間違ったコピーにならないようにするために書かれています。あなたのシナリオでは問題ありません。

    関連する問題