這個(gè)DLL的例子(屬于靜態(tài)鏈接到MFC 的規(guī)則DLL)中提供了一個(gè)如圖11所示的對(duì)話框。
(下載本工程
附件):

圖11 MFC規(guī)則DLL例子
在DLL中添加對(duì)話框的方式與在MFC應(yīng)用程序中是一樣的。
在圖11所示DLL中的對(duì)話框的Hello按鈕上點(diǎn)擊時(shí)將MessageBox一個(gè)“Hello,pconline的網(wǎng)友”對(duì)話框,下面是相關(guān)的文件及源代碼,其中刪除了MFC向?qū)ё詣?dòng)生成的絕大多數(shù)注釋。
第一組文件:CWinApp繼承類的聲明與實(shí)現(xiàn)
// RegularDll.h : main header file for the REGULARDLL DLL
#if !defined(AFX_REGULARDLL_H__3E9CB22B_588B_4388_B778_B3416ADB79B3__INCLUDED_)
#define AFX_REGULARDLL_H__3E9CB22B_588B_4388_B778_B3416ADB79B3__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // main symbols
class CRegularDllApp : public CWinApp
{
public:
CRegularDllApp();
DECLARE_MESSAGE_MAP()
};
#endif
// RegularDll.cpp : Defines the initialization routines for the DLL.
#include "stdafx.h"
#include "RegularDll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CRegularDllApp, CWinApp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRegularDllApp construction
CRegularDllApp::CRegularDllApp()
{
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CRegularDllApp object
CRegularDllApp theApp;
分析:
在這一組文件中定義了一個(gè)繼承自CWinApp的類CRegularDllApp,并同時(shí)定義了其的一個(gè)實(shí)例theApp。乍一看,您會(huì)以為它是一個(gè)MFC應(yīng)用程序,因?yàn)镸FC應(yīng)用程序也包含這樣的在工程名后添加“App”組成類名的類(并繼承自CWinApp類),也定義了這個(gè)類的一個(gè)全局實(shí)例theApp。
我們知道,在MFC應(yīng)用程序中CWinApp取代了SDK程序中WinMain的地位,SDK程序WinMain所完成的工作由CWinApp的三個(gè)函數(shù)完成:
virtual BOOL InitApplication( );
virtual BOOL InitInstance( );
virtual BOOL Run( ); //傳說(shuō)中MFC程序的“活水源頭”
但是MFC規(guī)則DLL并不是MFC應(yīng)用程序,它所繼承自CWinApp的類不包含消息循環(huán)。這是因?yàn)椋琈FC規(guī)則DLL不包含CWinApp::Run機(jī)制,主消息泵仍然由應(yīng)用程序擁有。如果DLL 生成無(wú)模式對(duì)話框或有自己的主框架窗口,則應(yīng)用程序的主消息泵必須調(diào)用從DLL 導(dǎo)出的函數(shù)來(lái)調(diào)用PreTranslateMessage成員函數(shù)。
另外,MFC規(guī)則DLL與MFC 應(yīng)用程序中一樣,需要將所有 DLL中元素的初始化放到InitInstance 成員函數(shù)中。
第二組文件 自定義對(duì)話框類聲明及實(shí)現(xiàn)(點(diǎn)擊查看附件)
分析:
這一部分的編程與一般的應(yīng)用程序根本沒(méi)有什么不同,我們照樣可以利用MFC類向?qū)?lái)自動(dòng)為對(duì)話框上的控件添加事件。MFC類向?qū)д諛訒?huì)生成類似ON_BN_CLICKED(IDC_HELLO_BUTTON, OnHelloButton)的消息映射宏。
第三組文件 DLL中的資源文件
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by RegularDll.rc
//
#define IDD_DLL_DIALOG 1000
#define IDC_HELLO_BUTTON 1000
分析:
在MFC規(guī)則DLL中使用資源也與在MFC應(yīng)用程序中使用資源沒(méi)有什么不同,我們照樣可以用Visual C++的資源編輯工具進(jìn)行資源的添加、刪除和屬性的更改。
第四組文件 MFC規(guī)則DLL接口函數(shù)
#include "StdAfx.h"
#include "DllDialog.h"
extern "C" __declspec(dllexport) void ShowDlg(void)
{
CDllDialog dllDialog;
dllDialog.DoModal();
}
分析:
這個(gè)接口并不使用MFC,但是在其中卻可以調(diào)用MFC擴(kuò)展類CdllDialog的函數(shù),這體現(xiàn)了“規(guī)則”的概類。
與非MFC DLL完全相同,我們可以使用__declspec(dllexport)聲明或在.def中引出的方式導(dǎo)出MFC規(guī)則DLL中的接口。