非MFC工程使用MFC库时的问题及解决办法

来源:互联网 发布:linux rpm安装路径 编辑:程序博客网 时间:2024/05/21 22:13

 

MFC工程使用MFC库时的问题及解决办法

 

最近正在写一个3ds max的模型导入插件,要求能够将自定义格式的三维模型文件导入到max中进行编辑。Max SDK提供了写这种插件的接口,可以在示例工程上直接进行修改,但这些工程都是标准C工程(未使用MFC)。非MFC工程创建时是不支持MFC特性的,也就是说在这些工程中不能使用MFC库中的类,如CString,CArray等等;然而我们在处理实际问题时却常常会有使用这些类的希望,因为很多时候它们可以使事情更加简单化,例如,要从指定的目录中搜索满足条件的文件,用CFileFind类将会非常方便。可能有人会说,为何不在一开始就创建MFC工程呢?问题在于MFC工程会产生很多向导生成代码,如基于单文档的工程会有View,Doc等类,很多时候我们只需要一个空工程就可以了;而且,我们可能经常会在已有的工程上直接进行修改、再加工。

MFC工程使用MFC库时最常见的问题就是windows.h重复包含错误,具体如下:

fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #i nclude <windows.h>

 

1工程à设置中,将MFC的使用由原来的“no using MFC(不使用MFC)”改为“Use MFC in a shared dll(在共享DLL中使用MFC)

2头文件包含

不同的MFC类需包含的头文件是不一样的。

常用的类,如CString, CEdit 等,包含afxwin.h就可以了,CFileFind需要包含afx.h,即#i nclude <afx.h>

如果不清楚包含什么头文件的话,可以同msdn进行查询,msdn中,对于MFC类的介绍中,都会给出相应的header file requirement.

3include 语句一定要写在首行

这一点很重要,通常出现前面讲到的windows.h重复包含错误,都是因为#i nclude 语句没有写在首行。

另外还要注意的是,如果#i nclude语句是在一个头文件里,那么对应头文件的包含也要写在首行。示例如下:

=============

test.h文件的内容如下:

include <afxwin.h> //保证该语句在首行

include …

 

test.cpp的文件内容如下:

#i nclude “test.h” //同样也要保证该语句在首行

include …

=============

4. error LNK2005: _DllMain@12 already defined

只需要在工程设置里面,把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL
中的_USRDLL,删除,就可以正确编译了