【问题标题】:why load the module at runtime?为什么在运行时加载模块?
【发布时间】:2011-12-15 02:21:46
【问题描述】:

有时,我阅读了源代码,发现模块是手动加载的,如下所示。

HMODULE hmodMscoree = LoadLibraryEx(L"mscoree.dll", NULL, 0);
typedef HRESULT (STDAPICALLTYPE *GETCORVERSION)(LPWSTR szBuffer, DWORD cchBuffer, DWORD* dwLength);
 GETCORVERSION pfnGETCORVERSION = (GETCORVERSION)GetProcAddress(hmodMscoree, "GetCORVersion");

为什么它会在运行时加载 mscoree.dll?

最好的问候,

【问题讨论】:

  • 因为他们需要GetCORVersion函数。
  • 但是他们并没有加载他们使用的所有模块,只是其中一些,所以我很困惑。

标签: c++ operating-system


【解决方案1】:

一个优点是,如果您动态地加载 DLL,那么 DLL 的存在(例如 mscoree.dll)和 DLL 中的函数(例如 mscoree.dll 中的 GetCORVersion ) 将被检查仅当应用程序分别尝试加载 DLL 和调用函数时。如果缺少 DLL,或者因为您只有旧版本而缺少其中一个功能,那么在应用程序不使用此功能的情况下不会有任何问题。相反,如果 DLL 是静态链接的,并且它丢失了,那么应用程序将无法启动(您将收到一条错误消息)。

示例:我们有一个复杂的工业测量软件,它动态链接wpcap.dll。在测量不包括数据包嗅探的情况下,我们不必安装 WinPcap。

【讨论】:

    【解决方案2】:

    加载模块和使用 GetProcAddress 的一个原因是 DLL 可能不存在于计算机上。这样,即使 DLL 不存在,应用程序也可以运行。您当然需要验证 LoadLibrary 和 GetProcAddress 是否成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2011-01-18
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      相关资源
      最近更新 更多