静态链接到 MFC 的规则 MFC DLL

静态链接到 MFC 的规则 MFC DLL 是在内部使用 MFC 的 DLL,而 DLL 中的导出函数可以由 MFC 或非 MFC 可执行文件调用。 顾名思义,此类型的 DLL 使用 MFC 的静态链接库发布生成。 通常使用标准 C 接口从规则 MFC DLL 导出函数。 有关如何编写、生成和使用规则 MFC DLL 的示例,请参阅示例 DLLScreenCap

请注意,术语 USRDLL 已不再用于 Visual C++ 文档。 静态链接到 MFC 的规则 MFC DLL 具有与以前 USRDLL 相同的特性。

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

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

  • DLL 可以链接到应用程序使用的相同 MFC 静态链接库。 DLL 不再有单独的静态链接库版本。

  • 在 MFC 版本 4.0 之前,USRDLL 提供了与静态链接到 MFC 的规则 MFC DLL 相同类型的功能。 从 Visual C++ 版本 4.0 起,术语 USRDLL 已过时。

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

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

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

  • 即使术语 USRDLL 已过时,仍必须在编译器命令行上定义“_USRDLL”。 此定义确定从 MFC 头文件拉取的声明。

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

请注意,CWinApp::Run 机制不适用于 DLL,因为应用程序拥有主消息泵。 如果 DLL 打开无模式对话框或具有其自己的主框架窗口,则应用程序的主消息泵必须调用由 DLL 导出的例程,该例程又会调用 DLL 的应用程序对象的 CWinApp::PreTranslateMessage 成员函数。

有关此函数的示例,请参阅 DLLScreenCap 示例。

通常使用标准 C 接口从规则 MFC DLL 导出符号。 从规则 MFC DLL 导出的函数的声明类似于以下内容:

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

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

  • 指向 MFC 对象的指针

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

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

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

静态链接到 MFC 的 DLL 还无法动态链接到共享 MFC DLL。 静态链接到 MFC 的 DLL 会动态绑定到应用程序,就像任何其他 DLL 一样;应用程序会链接到它,就像任何其他 DLL 一样。

标准 MFC 静态链接库按照 MFC DLL 命名约定中所述的约定进行命名。 但是,在 MFC 3.0 版及更高版本中,不再需要向链接器手动指定要链接的 MFC 库的版本。 相反,MFC 头文件将基于预处理器定义(如 _DEBUG_UNICODE)自动确定要链接的 MFC 库的正确版本。 MFC 头文件会添加 /DEFAULTLIB 指令来指示链接器链接到特定的 MFC 库版本中。

你希望做什么?

你想进一步了解什么?

另请参阅

DLL 类型