有时,我阅读了源代码,发现模块是手动加载的,如下所示。
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?
最诚挚的问候,
答案 0 :(得分:2)
一个优点是,如果您动态加载DLL ,然后存在DLL(例如mscoree.dll),并且DLL中存在函数(例如mscoree.dll中的GetCORVersion) )仅当应用程序尝试加载DLL并分别调用函数时,才会检查。如果DLL丢失,或者由于您只有旧版本而丢失了其中一个功能,那么在应用程序不使用此功能的情况下不会出现任何问题。相反,如果DLL 静态链接,并且它丢失了,那么应用程序就不会启动(您将收到错误消息)。
示例:我们有一个复杂的工业测量软件,它动态地链接wpcap.dll。如果测量不包括数据包嗅探,我们不必安装WinPcap。
答案 1 :(得分:0)
加载模块和使用GetProcAddress的一个原因是DLL可能不在计算机上。这样,即使DLL不存在,应用程序也可以运行。您当然需要验证LoadLibrary和GetProcAddress都是成功的。