非MFC工程中使用MFC庫

2021-07-08 20:51:56 字數 3413 閱讀 1594

為何不在一開始就建立

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相關類,如...