预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

VC++动态链接库编程之MFC扩展DLL 资料引用:http://www.knowsky.com/395359.html DLL类型入口函数非MFCDLL编程者提供DllMain函数MFC规则DLLCWinApp对象的InitInstance和ExitInstanceMFC扩展DLLMFCDLL向导生成DllMain函数 对于MFC扩展DLL,系统会自动在工程中添加如下表所示的宏,这些宏为DLL和应用程序的编写提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA这样的宏,在DLL和应用程序中将具有不同的定义,这取决于_AFXEXT宏是否被定义。这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意思。在DLL中,表示输出(因为_AFXEXT被定义,通常是在编译器的标识参数中指定/D_AFXEXT);在应用程序中,则表示输入(_AFXEXT没有定义)。 宏定义AFX_CLASS_IMPORT__declspec(dlleXPort)AFX_API_IMPORT__declspec(dllexport)AFX_DATA_IMPORT__declspec(dllexport)AFX_CLASS_EXPORT__declspec(dllexport)AFX_API_EXPORT__declspec(dllexport)AFX_DATA_EXPORT__declspec(dllexport)AFX_EXT_CLASS#ifdef_AFXEXT AFX_CLASS_EXPORT #else AFX_CLASS_IMPORTAFX_EXT_API#ifdef_AFXEXT AFX_API_EXPORT #else AFX_API_IMPORTAFX_EXT_DATA#ifdef_AFXEXT AFX_DATA_EXPORT #else AFX_DATA_IMPORT 6.2MFC扩展DLL导出MFC派生类 在这个例子中,我们将产生一个名为“ExtDll”的MFC扩展DLL工程,在这个DLL中导出一个对话框类,这个对话框类派生自MFC类CDialog。 使用MFC向导生成MFC扩展DLL时,系统会自动添加如下代码: staticAFX_EXTENSION_MODULEExtDllDLL={NULL,NULL}; extern"C"intAPIENTRY DllMain(HINSTANCEhInstance,DWorddwReason,LPVOIDlPReserved) { //RemovethisifyouuselpReserved UNREFERENCED_PARAMETER(lpReserved); //说明:lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零 if(dwReason==DLL_PROCESS_ATTACH) { TRACE0("EXTDLL.DLLInitializing!\n"); //ExtensionDLLone-timeinitialization if(!AfxInitExtensionModule(ExtDllDLL,hInstance)) return0; //InsertthisDLLintotheresourcechain newCDynLinkLibrary(ExtDllDLL); } elseif(dwReason==DLL_PROCESS_DETACH) { TRACE0("EXTDLL.DLLTerminating!\n"); //TerminatethelibrarybeforedestrUCtorsarecalled AfxTermExtensionModule(ExtDllDLL); } return1;//ok } 这一段代码含义晦涩,我们需要对其进行解读: (1)上述代码完成MFC扩展DLL的初始化和终止处理; (2)初始化期间所创建的CDynLinkLibrary对象使MFC扩展DLL可以将DLL中的CRuntimeClass对象或资源导出到应用程序; (3)AfxInitExtensionModule函数捕捉模块的CRuntimeClass结构和在创建CDynLinkLibrary对象时使用的对象工厂(COleObjectFactory对象); (4)AfxTermExtensionModule函数使MFC得以在每个进程与扩展DLL分离时(进程退出或使用AfxFreeLibrary卸载DLL时)清除扩展DLL; (5)第一条语句staticAFX_EXTENSION_MODULEExtDllDLL={NULL,NULL};定义了一个AFX_EXTENSI