我很好奇Windows上的动态链接是如何工作的。由于我们不能直接链接到Windows,因此Windows通常会将您的可执行文件链接到LIB文件,该文件包含DLL导出的功能存根。这种类型的链接会在运行时导致LoadLibrary
和GetProcAddress
吗?如果没有,链接在内部如何工作?
最佳答案
答案可能是。
默认方法是创建一个导入表,其中列出了所有必需的DLL以及从中使用的功能。该表由操作系统直接解析。为此,它可能会在LoadLibrary之后重用一些相同的代码。它很可能不会使用GetProcAddress
中的代码,而是更愿意对所有必要功能进行一次批量查找。
但是,有一个称为延迟加载的MSVC功能。使用此功能,MSVC ++不会构建这样的导入表,而是插入实际的LoadLibrary
和GetProcAddress
调用。这样做的好处是可以在最晚的时刻进行这些呼叫。虽然不需要特定的DLL,但不会加载它。这样可以加速程序启动。