【问题标题】:AfxLoadLibrary vs. LoadLibraryAfxLoadLibrary 与 LoadLibrary
【发布时间】:2012-12-07 07:27:28
【问题描述】:

我有一个需要动态加载 DLL 的 MFC 应用程序。 DLL 将用于检索运行时值,然后被卸载。我需要创建一个 MFC DLL 并通过 AfxLoadLibrary() 加载它,还是可以创建一个传统的 C++ dll 并使用 Win32 LoadLibrary() 调用?有关系吗?

【问题讨论】:

  • 您打算在要创建的库中使用 MFC 吗?
  • 没有。 DLL 是严格的 C++,不会包含任何基于 AFX 的头文件。

标签: c++ visual-studio visual-c++ dll mfc


【解决方案1】:

如果您要创建一个完全不使用 MFC 的纯 C++ DLL,则无需创建 MFC DLL,您应该能够使用纯 LoadLibrary()

【讨论】:

    【解决方案2】:

    在 MSDN Library 文章的备注部分明确提到:

    如果您的应用程序使用多个线程并且动态加载扩展 DLL,请务必使用 AfxLoadLibrary 和 AfxFreeLibrary(而不是 Win32 函数 LoadLibrary 和 FreeLibrary)。使用 AfxLoadLibrary 和 AfxFreeLibrary 可确保在加载和卸载扩展 DLL 时执行的启动和关闭代码不会破坏全局 MFC 状态。

    因此,如果您正在加载包含 MFC 代码的 DLL,或者如果您在程序中使用线程,那么您应该使用它。

    也就是说,至少在现代版本的 MFC 中,AfxLoadLibrary() 并没有做任何特别的事情:

    HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName)
    {
         ASSERT(lpszModuleName != NULL);
         HINSTANCE hInstLib = LoadLibrary(lpszModuleName);
         return hInstLib;
    }
    

    所以,如果你猜错了,没有什么事情会发生严重的爆炸。谢天谢地。

    【讨论】:

    • @nobugz,帮我用我的术语。普通 C++ DLL 是否被视为“扩展 DLL”?在问我的问题之前我读过它,但我只是被它弄糊涂了。从某种意义上说,所有 DLL 都是“扩展”,但我的阅读是 MSDN 更多地指的是 MFC 如何使用 DLL。我错了吗?
    • 它是 MFC 语言中的“包含 MFC 代码的 DLL”。这就是 doowop 的状态,必须将这样的 DLL 连接到 MFC 应用程序模型中。
    • 谢谢。我就是这么想的。
    • @HansPassant 的回答很到位。我要补充一点,这是 MFC 的许多小“陷阱”之一。有些(像这样)是遗迹,但有些不是。复杂性足以让人怀疑 MFC 应用程序如何能够像它们一样正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2011-07-09
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多