11

静的 Win32 ライブラリの場合、「MFC を使用する」オプションが設定されていることをどのように検出できますか?

すなわち

#ifdef ---BuildingForMFC---
....
#else
...
#endif
4

3 に答える 3

12

シンボル _MFC_VER が定義されていることを常に確認しています。

これは使用されている MFC のバージョン番号です 0x0700 = 7.0

MSDNの「定義済みマクロ」にあります

于 2009-07-28T21:38:09.073 に答える
4

Win32 コンソールのみを対象とする元のプロジェクトで Visual Studio 2013 を確認したので、MFC サポートを (プロジェクト ウィザードを使用せずに) もう一度追加する必要があります。以下は私の発見です:

  • マクロ _MFC_VER は、afx.h に含まれる afxver_.h で定義されます。したがって、.cpp ファイルに afx.h を直接または間接的に含めない場合、_MFC_VER マクロが定義されていません。たとえば、afx.h を含まないソース .cpp をプロジェクトに含めると、ファイルは _MFC_VER マクロの定義なしでコンパイルされます。したがって、MFC ライブラリの使用を検出し、オプションで MFC ライブラリをサポートするために C++ コード (たとえば、外部ライブラリ) を適合させることは役に立ちません。

  • MFC の使用を手動で有効にする場合 (ソリューション エクスプローラーでプロジェクトを選択し、右クリックして [構成プロパティ] -> [全般] -> [MFC の使用] を選択)、次の 2 つの可能性があります。

    • A) [共有 DLL で MFC を使用する] オプションを選択します。これにより、コマンド ライン パラメータが実際に更新され、_AFXDLL の定義がプリプロセッサ マクロ リストに追加されます。
    • B) 「スタティック ライブラリで MFC を使用する」オプションを選択します。これにより、定義された _AFXDLL マクロが実際に削除されますが、マクロ定義は追加されないため、MFC が実際に使用されているかどうかはわかりません。

したがって、私のテスト活動では、ビルド中のプロジェクトに MFC ライブラリが含まれているかどうかを理解するために有効に使用できるのはモード A だけです。

私は、多くのプラットフォーム (Mac OSx、WinX コンソール、WinX MFC、iOS、Unix、Android) をサポートする C++ クロスプラットフォーム ライブラリを維持しており、動的 DLL で MFC を有効にすることが、MFC の存在を透過的に検出する唯一の方法です。たとえば、次のようになります。

#if defined(_AFXDLL)
#    include <afx.h>
#endif

明らかに、プロジェクト プリプロセッサ リストに手動でマクロ定義 (_AFX) を追加できます。

于 2015-04-27T18:44:43.067 に答える
2

シンボル_AFXは通常、MFC プロジェクトに対して定義されます。

于 2009-07-28T21:30:09.557 に答える