在WIN32 DLL中使用MFC

最近用WIN32 DLL,为了方便要用到MFC的一些库,又不想转工程,就网上找了很多方法,发现没有详细的介绍,有的也行不通,现在成功在WIN32 DLL中使用了MFC,记录一下以防以后用到忘记
  1. 修改预编译头文件(stdafx.h)

    在stdafx.h文件中添加下面代码,包含一些MFC的头文件,这些可以在一个MFC工程中复制过来

    #define VC_EXTRALEAN		// Exclude rarely-used stuff from Windows headers
    #include <afxtempl.h>       // MFC templates模板支持,在使用CArray时要引入
    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS    // 某些 CString 构造函数将为显式的
    
    #include <afxwin.h>         // MFC 核心组件和标准组件
    #include <afxext.h>         // MFC 扩展
    
    #ifndef _AFX_NO_OLE_SUPPORT
    #include <afxole.h>         // MFC OLE 类
    #include <afxodlgs.h>       // MFC OLE 对话框类
    #include <afxdisp.h>        // MFC 自动化类
    #endif // _AFX_NO_OLE_SUPPORT
    
    #ifndef _AFX_NO_DB_SUPPORT
    #include <afxdb.h>            // MFC ODBC 数据库类
    #endif // _AFX_NO_DB_SUPPORT
    
    #ifndef _AFX_NO_DAO_SUPPORT
    #include <afxdao.h>            // MFC DAO 数据库类
    #endif // _AFX_NO_DAO_SUPPORT
    
    #include <afxdtctl.h>        // MFC 对 Internet Explorer 4 公共控件的支持
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h>            // MFC 对 Windows 公共控件的支持
    #endif // _AFX_NO_AFXCMN_SUPPORT
  2. 修改编译配置:VS2003
    1. 项目->属性->常规->MFC的使用->在静态库中使用MFC(动态或静态都可以)
    2. 链接器->输入->

      先在‘忽略指定库中’忽略掉这两个DLL,分别是uafxcw.lib和libcpmt.lib,如果是DEBUG工程,还需要填入libcmt.lib

      再在'附加依赖项'中以uafxcw.lib libcpmt.lib的顺序填入

  3. 在你的主文件中加入代码:在最前面加入
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    #define new DEBUG_NEW
    
    /////////////////////////////////////////////////////////////////////////////
    // global data
    
    // The following symbol used to force inclusion of this module for _USRDLL
    #ifdef _X86_
    extern "C" { int _afxForceUSRDLL; }
    #else
    extern "C" { int __afxForceUSRDLL; }
    #endif

    这样不用从CWinApp中派生一个类再外部定义来使用MFC的入口点,可以直接使用原来的写好的DllMain入口点

    否则:在WIN32 DLL中使用MFC类库的话可以不声明DLLMain()函数,如果有操作要放在DLL加载时初始化的话就从CWinApp派生一个类,在项目文件里声明这个对象,在这个CWinApp类的InitInstance()成员函数中做初始化工作

  4. 解决链接器错误:

     只是在链接那一块还是出了几个错误, error LNK2005: "private: __thiscall type_info::type_info。。。

    最后用的: 附加依赖项:msvcrtd.lib LIBCMTD.lib 忽略特定库:LIBCMTD.lib;msvcrtd.lib 编译通过了,MFC的类编译器也认识了