1

この質問が以前に尋ねられた場合はご容赦ください。しかし、広範囲に調べても何も見つからなかったことをお約束します (適切な検索用語を思い付かなかっただけかもしれません)。

状況は次のとおりです。クラスをエクスポートする MFC90 でビルドされた DLL があります (および、などのヘッダー ファイルで MFC オブジェクトを使用しますCString) 。POSITIONこの DLL をONEと呼びます。私は VS2010 にしかアクセスできないため、MFC ベースの DLL とアプリを MFC100 でビルドすることに制限されています。また、DLL ONEからエクスポートされたオブジェクトを使用する別の DLL をTWOと呼びます。これまでのところ問題なく動作しているように見えますが、MFC100 でビルドされた DLL を MFC90 でビルドされた DLL にリンクするときに、バグや奇妙な動作が本当に予想されるのか、それとも些細な問題なのかを知りたいです。


**注* *

  • DLL ONEを再構築するオプションがありませ
  • VS2010 を使用して MFC90 でアプリケーションをビルドする無料のオプションを探しましたが、解決策が見つかりませんでした。Windows SDK 6.01 を簡単にダウンロードできると読みましたが、Microsoft からダウンロードしたところ、MFC の痕跡はありませんでした。
  • VS2008 を使用するオプションがありませ(MFC に付属していない VS2008 Express を除く)。
  • これはすべて会社独自のコードであるため、ソース コードを投稿することはできません。


**編集* *

  • おそらく、DLL TWOは、DLL ONEによってエクスポートされたクラスへのポインターを引数として受け取る関数をエクスポートすることに言及する必要があります。
  • エクスポートされたクラスは、MFC オブジェクトから派生したものではありません。エクスポートされたクラスは、MFC オブジェクトをメンバー変数、メンバー関数の引数として、またはメンバー関数内部でのみ使用します。これを 100% 確実に言うことはできませんが、クラスがや&CStringのような POD 構造以上のものを利用しているとは思いません。POINTPOSITION
4

3 に答える 3

1

MFC 派生オブジェクト、または MFC オブジェクトへのポインター、および MFC によって割り当てられたメモリを渡すには、拡張 DLL をビルドする必要があります。MFC 拡張 DLL プロジェクトがあるとします。構造体に埋め込まれた CView のような複雑な MFC オブジェクトがある場合は、おそらく MFC オブジェクトへのポインターを埋め込んでいます。CRect のような、バージョンに依存しない既知のレイアウトを持つ MFC オブジェクトは、渡すことができます。

MFC 拡張 dll は、複数のバージョン間で移植できません。拡張 DLLのドキュメントから:

クライアント アプリケーションと拡張 DLL の両方で、同じバージョンの MFCx0.dll を使用する必要があります。

したがって、MFC 9 拡張 DLL を MFC 10 ライブラリにリンクすることはできません。作成者に MFC10 での再構築を依頼するか、VC9 を入手して MFC 9 ライブラリを入手する必要があります。

その理由は、V9 クラス定義と V10 クラス定義の間にメモリ レイアウトの不一致がある場合、MFC オブジェクトのメンバーのオフセットが異なる場合に異なる可能性があるため、両方を混在させようとすると、せいぜいメモリ リークが発生し、最悪の場合ランダム クラッシュが発生するためです。バージョン。Foo::memberA だと思ってアドレスに書き込むと、メモリ レイアウトが異なるため、Foo::memberB を上書きする可能性があります。また、静的変数はさまざまな場所に格納されます。おそらく、MFC のバージョンを混在させようとした場合に最初に気付く不一致は、MFC でかなり頻繁に呼び出されるランタイム クラス チェックでのデバッグ アサートです。

于 2012-10-06T00:09:06.417 に答える
1

DLL 自体がプロプライエタリであると仮定するソースがなければ (コード + MFC で使用されるか、またはいずれか一方のみ)、Microsoft が提供する任意の種類の DLL を利用するのと同じくらい風変わりなものになると思います。私の経験では、誰かが独自の DLL で WMPLib.DLL のラッパーを作成しました。ファイル API は根本的な問題を引き起こしませんでしたが、エラー処理はひどいものでした。XP から Vista への移植性。 7 は問題ではありませんでしたが、間違ったタイミングで間違った値を渡すことは問題でした。全体として、内部関数が MFC とのインターフェイスとして適切に作成されているかどうかが重要だと思います。

于 2012-10-03T02:26:15.350 に答える
0

箱から出してすぐに動作するはずです。MFC のバージョンが混在しているプロジェクトを見たことがあります。唯一の問題は展開です。MFC 8.0 および 9.0 にはマニフェストが必要です (WinSx に展開することが望ましい) のに対し、7.x および 10.x は実行可能ファイルと同じフォルダーに配置するだけです。

MFC/CRT 9.0 用のマージ モジュールがあれば、心配はいりません。

于 2012-10-03T07:28:03.157 に答える