為何不在一開始就建立
mfc工程呢?
可能有兩種原因:
1.在mfc
工程會產生很多嚮導生成的**以及資源檔案,如基於單文件的工程會有
view,doc
等類,很多時候我們並不需要這些東西,只需要乙個空工程就可以了。2.使用第三方框架建立的工程,我們很難更改它的工程屬性(如用firebreath開發瀏覽器外掛程式,通過指令碼檔案firebreath會自動幫我們生成vs下的工程)。
在非mfc工程中使用mfc的庫就需要包含相應的標頭檔案,經常會遇到下面這個問題: 1
. 2. fatal error c1189: #error :
windows.h already included.
對於第1個問題,很簡單:
選中工程名右鍵屬性(project),在properties\configuration properties\general\use of mfc中選擇use mfc in a shared dll
出現上面第2個問題主要是因為包含標頭檔案的順序不對。為什麼包含
windows.h
的時候會有順序要求,網上有一段傳播的非常廣泛解釋:
如果在mfc工程中#include ,那麼會有以下編譯錯誤(因為afxwin.h檔案中包含了afx.h,afx.h檔案中包含了afxver_.h,afxver_.h中包含了afxv_w32.h,而afxv_w32.h中包含了windows.h,請看以下分析):
compile error:
c:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) :
如果編譯器在編譯afxv_w32.h檔案之前編譯了windows.h檔案,編譯器會報上面的錯誤,因為在afxv_w32.h檔案中有下面的一句預編譯報警:
#ifdef _windows_
#endif
問題在於為什麼afxv_w32.h中要有這麼一句預編譯處理。看了afxv_w32.h和windows.h檔案就有點明白了。
在afxv_w32.h中有下面的預編譯語句:
... ...
#undef nologerror
#undef noprofiler
#undef nomemmgr
#undef nolfileio
#undef noopenfile
#undef noresource
#undef noatom
... ...
在afxv_w32.h中還有一句:
#include "windows.h"
而在windows.h檔案中有下面的預編譯語句:
... ...
#define noatom
#define nogdi
#define nogdicapmasks
#define nometafile
#define nominmax
#define nomsg
#define noopenfile
... ...
注意到在windows.h的開頭有防止windows.h被重複編譯的預編譯開關:
#ifndef _windows_
#define _windows_
這樣問題就明白了,雖然我不知道微軟為什麼要這麼做,但是我知道如果在afxv_w32.h沒有那句預編譯報警,那麼如果在編譯afxv_w32.h之前
編譯了windows.h,那麼在windows.h中#define的noatom等巨集就會被#undef掉,可能會導致相應的錯誤發生。
猜想原因可能如上所述,我的解決方法是,將包含有#include 「windows.h"的標頭檔案放在所有包含的標頭檔案的最後面,這樣使得對afxv_w32檔案
的編譯處理發生在先,這樣,由於在afxv_w32.h中已經包含了windows.h,那麼巨集_windows_將被定義,後繼的#include "windows.h"語句將形同虛設,
上面的編譯報警也不會發生了。我覺得這種處理要比將所有的#include "windows.h」語句刪掉要好一點。
一句話,編譯器必須在編譯windows.h之前編譯afxv_w32.h,因為我不是十分清除什麼時候afxv_w32.h會被編譯,所以我將可能包含有#include "windows.h"的標頭檔案放在其他標頭檔案之後#include。
解決這個問題的總體思路是:把#
include
的包含語句把到最前面。
sunshine1314 的博文《非
mfc工程使用mfc
庫時的問題及解決辦法》給出了一串行的解決方案,大家可能參考一下,也許能解決你們的問題。但我當時通過這一系列方法還是沒能解決我的問題。
我的問題是:用firebreath開發瀏覽器外掛程式,通過
fbgen.py
和prep2010.cmd
指令碼幫我們生成了基於vs2010的工程(這個工程中沒有stdaf.h),我們要在這個工程中獲得mfc中的hdc以及使用messagebox,於是就碰到了上面提到的問題。
解決方案:
1. 2.stdafx.h和stdafx.cpp這兩個檔案已建立並新增到工程,下面講講相關的配製。
2.1選中工程名,右鍵屬性(properties),在precompiled header/precompiled header中選擇use(/yu),precompiled header file中填stdafx.h。設定工程編譯時使用預編譯標頭檔案stdafx.h(在vs中檔名的大小寫不敏感,即stdafx.h和stdafx.h是等價的)。
2.2選中stdafx.cpp檔案,右鍵屬性(properties),在precompiled header/precompiled header中選擇create(/yc), precompiled header file中填stdafx.h。這樣設定的作用是:每次編譯stdafx.cpp檔案時建立.pch檔案(副檔名pch表示預編譯標頭檔案 )。
3.在stdafx.h的開發包含檔案:
#include 4.
這時在我們的main函式中寫入下面這句話,就可以彈出乙個訊息框:
afxmessagebox(l
"非mfc工程使用mfc庫"
, mb_ok, 0 );
(stdafx.h)
的原理》。
非MFC工程使用MFC庫小結
一般的非mfc工程可以在包含相關標頭檔案後 如afx.h 就可以使用裡面封裝的類了。1 afx.h中已經包含了windows.h標頭檔案,但是在非mfc工程中,也包含了了windows.h,因此會提示報錯。一般在stdafx.h中的windows.h注釋掉,然後寫上afx.h即可。2 部分巨集重複定...
非MFC工程使用MFC庫時的問題及解決辦法
非mfc工程使用mfc庫時的問題及解決辦法 最近正在寫乙個3ds max的模型匯入外掛程式,要求能夠將自定義格式的三維模型檔案匯入到max中進行編輯。max sdk提供了寫這種外掛程式的介面,可以在示例工程上直接進行修改,但這些工程都是標準c工程 未使用mfc 非 mfc工程建立時是不支援mfc特性...
非MFC工程使用MFC庫時的問題及解決辦法
peter lee 2005.08.20 一 問題由來 vc6和 vc71 的工程嚮導中都包含非 mfc的工程,諸如 win32 console project,win32 static library 非mfc 工程建立時是不支援 mfc特性的,然後我們在處理實際問題時有時會用到 mfc相關類,如...