在WIN32 DLL中使用MFC


最近用WIN32 DLL,為了方便要用到MFC的一些庫,又不想轉工程,就網上找了很多方法,發現沒有詳細的介紹,有的也行不通,現在成功在WIN32 DLL中使用了MFC,記錄一下以防以后用到忘記

 

一、修改預編譯頭文件(stdafx.h)

在stdafx.h文件中添加下面代碼,包含一些MFC的頭文件,這些可以在一個MFC工程中復制過來

復制代碼
 1 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS    // 某些 CString 構造函數將為顯式的
2
3 #include <afxwin.h> // MFC 核心組件和標准組件
4 #include <afxext.h> // MFC 擴展
5
6 #ifndef _AFX_NO_OLE_SUPPORT
7 #include <afxole.h> // MFC OLE 類
8 #include <afxodlgs.h> // MFC OLE 對話框類
9 #include <afxdisp.h> // MFC 自動化類
10 #endif // _AFX_NO_OLE_SUPPORT
11
12 #ifndef _AFX_NO_DB_SUPPORT
13 #include <afxdb.h> // MFC ODBC 數據庫類
14 #endif // _AFX_NO_DB_SUPPORT
15
16 #ifndef _AFX_NO_DAO_SUPPORT
17 #include <afxdao.h> // MFC DAO 數據庫類
18 #endif // _AFX_NO_DAO_SUPPORT
19
20 #include <afxdtctl.h> // MFC 對 Internet Explorer 4 公共控件的支持
21 #ifndef _AFX_NO_AFXCMN_SUPPORT
22 #include <afxcmn.h> // MFC 對 Windows 公共控件的支持
23 #endif // _AFX_NO_AFXCMN_SUPPORT
復制代碼


二、修改編譯配置

我使有的是VS2003

1、項目->屬性->常規->MFC的使用->在靜態庫中使用MFC(動態或靜態都可以)

2、鏈接器->輸入->

    因為編譯的時候會因為鏈接的順序問題導致鏈接錯誤,所以這里要改兩個LIB的鏈接順序

    先在‘忽略指定庫中’忽略掉這兩個DLL,分別是uafxcw.lib和libcpmt.lib,如果是DEBUG工程,還需要填入libcmt.lib

    再在'附加依賴項'中以uafxcw.lib libcpmt.lib的順序填入

 

三、在你的主文件中加入代碼

在最前面加入

復制代碼
#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入口點

 

只是在鏈接那一塊還是出了幾個錯誤,
error LNK2005: "private: __thiscall type_info::type_info。。。

最后用的:
附加依賴項:msvcrtd.lib LIBCMTD.lib
忽略特定庫:LIBCMTD.lib;msvcrtd.lib

編譯通過了,MFC的類編譯器也認識了

 

 

謝謝觀看!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM