动态链接到 MFC 的规则 MFC DLL

动态链接到 MFC 的规则 MFC DLL 是在内部使用 MFC 的 DLL,而 DLL 中的导出函数可以由 MFC 或非 MFC 可执行文件调用。 顾名思义,这种 DLL 是使用 MFC 的动态链接库版本(也称为 MFC 的共享版本)生成的。 通常使用标准 C 接口从规则 MFC DLL 导出函数。

你必须在动态链接到 MFC 的规则 MFC DLL 中的所有导出函数的开头处添加 AFX_MANAGE_STATE 宏,以将当前模块状态设置为 DLL 的状态。 这通过将以下代码行添加到从 DLL 导出的函数的开头来实现:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

动态链接到 MFC 的规则 MFC DLL 具有以下功能:

  • 这是 Visual C++ 4.0 引入的新型 DLL。

  • 可以采用支持使用 DLL 的任何语言(C、C++、Pascal、Visual Basic 等)编写客户端可执行文件;它不必是 MFC 应用程序。

  • 与静态链接的规则 MFC DLL 不同,这种 DLL 动态链接到 MFC DLL(也称为共享 MFC DLL)。

  • 链接到这种 DLL 的 MFC 导入库与用于 MFC 扩展 DLL 或应用程序(使用 MFC DLL)的库相同:MFCxx(D).lib。

动态链接到 MFC 的规则 MFC DLL 具有以下要求:

  • 编译这些 DLL 时需定义 _AFXDLL,就像动态链接到 MFC DLL 的可执行文件一样。 但同时还需定义 _USRDLL,就像静态链接到 MFC 的规则 MFC DLL 一样。

  • 这种 DLL 必须实例化 CWinApp 派生类。

  • 这种 DLL 使用 MFC 提供的 DllMain。 将所有特定于 DLL 的初始化代码都置于 InitInstance 成员函数中,而将终止代码置于 ExitInstance 中,就如同在普通 MFC 应用程序中一样。

由于这种 DLL 使用 MFC 的动态链接库版本,因此必须将当前模块状态显式设置为 DLL 的状态。 为此,请在从 DLL 导出的每个函数的开头使用 AFX_MANAGE_STATE 宏。

与 MFC 应用程序一样,规则 MFC DLL 必须具有 CWinApp 派生类和该应用程序类的单个对象。 但是,DLL 的 CWinApp 对象没有主消息泵,而应用程序的 CWinApp 对象也是如此。

请注意,CWinApp::Run 机制不适用于 DLL,因为应用程序拥有主消息泵。 如果 DLL 显示无模式对话框或有自己的主框架窗口,则应用程序的主消息泵必须调用从 DLL 导出的例程来调用 CWinApp::PreTranslateMessage

将所有特定于 DLL 的初始化代码都置于 CWinApp::InitInstance 成员函数中,就如同在普通 MFC 应用程序中一样。 在卸载 DLL 之前,从 MFC 提供的 DllMain 函数调用 CWinApp 派生类的 CWinApp::ExitInstance 成员函数。

你必须随应用程序分发共享的 DLL MFCx0.dll 和 Msvcr*0.dll(或类似文件)。

动态链接到 MFC 的 DLL 不能同时又静态链接到 MFC。 应用程序链接到动态链接到 MFC 的规则 MFC DLL,就像链接到任何其他 DLL 一样。

通常使用标准 C 接口从规则 MFC DLL 导出符号。 从规则 MFC DLL 导出的函数的声明如下所示:

extern "C" __declspec(dllexport) MyExportedFunction( );

规则 MFC DLL 内的所有内存分配都应保留在 DLL 内;DLL 不应向调用可执行文件传递或从其接收以下任何内容:

  • 指向 MFC 对象的指针

  • 指向由 MFC 分配的内存的指针

如果需要执行上述任何操作,或者需要在调用可执行文件与 DLL 之间传递 MFC 派生对象,则必须生成 MFC 扩展 DLL。

仅当创建数据的副本时,才可安全地在应用程序和 DLL 之间传递指向由 C 运行时库分配的内存的指针。 不得删除这些指针或重设其大小,也不得在不创建内存副本的情况下使用它们。

在生成动态链接到 MFC 的规则 MFC DLL 时,需要使用宏 AFX_MANAGE_STATE 来正确切换 MFC 模块状态。 这通过将以下代码行添加到从 DLL 导出的函数的开头来实现:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

在静态链接到 MFC 的规则 MFC DLL 或 MFC 扩展 DLL 中,不应使用 AFX_MANAGE_STATE 宏。 有关详细信息,请参阅管理 MFC 模块的状态数据

有关如何编写、生成和使用规则 MFC DLL 的示例,请参阅示例 DLLScreenCap。 有关动态链接到 MFC 的规则 MFC DLL 的详细信息,请参阅该示例的摘要中标题为“Converting DLLScreenCap to Dynamically Link with the MFC DLL”(转换 DLLScreenCap 以动态链接到 MFC DLL)的部分。

你希望做什么?

你想进一步了解什么?

另请参阅

DLL 类型