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

圖11 MFC規(guī)則DLL例子
在DLL中添加對話框的方式與在MFC應(yīng)用程序中是一樣的。
在圖11所示DLL中的對話框的Hello按鈕上點擊時將MessageBox一個“Hello,pconline的網(wǎng)友”對話框,下面是相關(guān)的文件及源代碼,其中刪除了MFC向?qū)ё詣由傻慕^大多數(shù)注釋。
第一組文件:CWinApp繼承類的聲明與實現(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;
分析:
在這一組文件中定義了一個繼承自CWinApp的類CRegularDllApp,并同時定義了其的一個實例theApp。乍一看,您會以為它是一個MFC應(yīng)用程序,因為MFC應(yīng)用程序也包含這樣的在工程名后添加“App”組成類名的類(并繼承自CWinApp類),也定義了這個類的一個全局實例theApp。
我們知道,在MFC應(yīng)用程序中CWinApp取代了SDK程序中WinMain的地位,SDK程序WinMain所完成的工作由CWinApp的三個函數(shù)完成:
virtual BOOL InitApplication( );
virtual BOOL InitInstance( );
virtual BOOL Run( ); //傳說中MFC程序的“活水源頭”
但是MFC規(guī)則DLL并不是MFC應(yīng)用程序,它所繼承自CWinApp的類不包含消息循環(huán)。這是因為,MFC規(guī)則DLL不包含CWinApp::Run機(jī)制,主消息泵仍然由應(yīng)用程序擁有。如果DLL 生成無模式對話框或有自己的主框架窗口,則應(yīng)用程序的主消息泵必須調(diào)用從DLL 導(dǎo)出的函數(shù)來調(diào)用PreTranslateMessage成員函數(shù)。
另外,MFC規(guī)則DLL與MFC 應(yīng)用程序中一樣,需要將所有 DLL中元素的初始化放到InitInstance 成員函數(shù)中。
第二組文件 自定義對話框類聲明及實現(xiàn)(點擊查看附件)
分析:
這一部分的編程與一般的應(yīng)用程序根本沒有什么不同,我們照樣可以利用MFC類向?qū)碜詣訛閷υ捒蛏系目丶砑邮录FC類向?qū)д諛訒深愃芆N_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)用程序中使用資源沒有什么不同,我們照樣可以用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();
}
分析:
這個接口并不使用MFC,但是在其中卻可以調(diào)用MFC擴(kuò)展類CdllDialog的函數(shù),這體現(xiàn)了“規(guī)則”的概類。
與非MFC DLL完全相同,我們可以使用__declspec(dllexport)聲明或在.def中引出的方式導(dǎo)出MFC規(guī)則DLL中的接口。