2017-03-02 60 views
0

MFCプロジェクトに_AFX_NO_MFC_CONTROLS_IN_DIALOGSを定義したいとします。この定義は、実行可能なサイズをかなり減らすことになっています。詳細は、https://blogs.msdn.microsoft.com/vcblog/2012/02/06/reducing-the-size-of-statically-linked-mfc-applications-in-vc11/を参照してください。MFCアプリケーションサイズを小さくする

ウィザードを使用して「Mfcアプリケーション」を作成しました。私は「静的ライブラリでMFCを使用する」以外のすべてのデフォルトオプションを保持していました(これは私にとって必須です)。

この時点で、プロジェクトがビルドされます。

その後、私はSTDAFX.Hファイルに次の行を追加します。この時点で #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS

、私はいくつかのリンカエラーを取得:

1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "void __cdecl AfxRegisterMFCCtrlClasses(void)" ([email protected]@YAXXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "protected: void __thiscall CMFCControlContainer::PreUnsubclassControl(class CWnd *)" ([email protected]@@[email protected]@@Z) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 
1>uafxcwd.lib(afxctrlcontainer2.obj) : error LNK2005: "public: int __thiscall CMFCControlContainer::SubclassDlgControls(void)" ([email protected]@@QAEHXZ) already defined in afxnmcdd.lib(afxctrlcontainer2.obj) 

しかし、私はプロジェクトの設定に行けば文字セットをUnicodeからMulti-Byteに変更すると、すべてがうまくいきます。何が起こっているのか誰も知っていますか? この変更を大規模なものと古いもののMFCプロジェクトに統合する必要があるため、「Unicode文字セットを使用する」フラグを必ず保持する必要があります。

+0

コマンドライン([''/D'コンパイラスイッチ)(https://msdn.microsoft.com/en-us/library/)にグローバルフラグ( '_AFX_NO_MFC_CONTROLS_IN_DIALOGS'など)を渡す必要があります。 hhzbb5c8.aspx))。 – IInspectable

+0

ええ、私はstdafx.hとプリプロセッサ定義の両方で試しましたが、変更はありません。 – Michael

+1

このフラグが設定されていない他のファイルやライブラリはコンパイルされていないことを確認してください。 MFCを使用するすべてのLibとオブジェクトファイルは、このスイッチでコンパイルする必要があります。 – xMRi

答えて

2

_AFX_NO_MFC_CONTROLS_IN_DIALOGSを定義するだけでは十分ではありません。CDialogExCWinAppExなどの拡張MFCクラスを使用しないようにする必要があります(デフォルトでMFCアプリケーションウィザードで使用されます)。それらをCDialogCWinAppに置き換えてください。その後、さまざまなGUIの「マネージャ」インスタンスを初期化するコードからコンパイラエラーが発生する可能性があります。このコードを削除するだけです。

さらに簡単に、MFCアプリケーションウィザードを使用して新しいアプリケーションを作成する場合は、「拡張MFCコントロールなし」のチェックボックスをオンにします(ダイアログベースのアプリケーションでのみ使用できます)。その後、CDialogExCWinAppExを使用するコードは生成されず、_AFX_NO_MFC_CONTROLS_IN_DIALOGSも定義されると思います。

関連する問題