C++ windows上的DLL链接是否会在运行时生成GetProcAddress?

C++ windows上的DLL链接是否会在运行时生成GetProcAddress?,c++,windows,dll,C++,Windows,Dll,我很好奇动态链接在windows上是如何工作的。由于我们不能直接链接到,windows通常会将可执行文件链接到一个LIB文件,其中包含DLL导出的函数存根。这种类型的链接是否会在运行时导致LoadLibrary和GetProcAddress?如果没有,链接在内部是如何工作的?答案是可能的 默认方法是创建一个导入表,其中列出了所有必需的DLL以及从中使用的函数。此表由操作系统直接解析。为此,它可能会重用LoadLibrary后面的一些相同代码。它很可能不会使用GetProcAddress中的代码,

我很好奇动态链接在windows上是如何工作的。由于我们不能直接链接到,windows通常会将可执行文件链接到一个LIB文件,其中包含DLL导出的函数存根。这种类型的链接是否会在运行时导致
LoadLibrary
GetProcAddress
?如果没有,链接在内部是如何工作的?

答案是可能的

默认方法是创建一个导入表,其中列出了所有必需的DLL以及从中使用的函数。此表由操作系统直接解析。为此,它可能会重用LoadLibrary后面的一些相同代码。它很可能不会使用
GetProcAddress
中的代码,而是更愿意对所有必要的函数进行一次批量查找

然而,MSVC有一个叫做延迟加载的特性。使用此功能,MSVC++不会构建这样的导入表,而是插入实际的
LoadLibrary
GetProcAddress
调用。这样做的好处是,这些电话是在可能的最晚时刻发出的。虽然您不需要特定的DLL,但它没有加载。这可以加速程序启动

答案是可能

默认方法是创建一个导入表,其中列出了所有必需的DLL以及从中使用的函数。此表由操作系统直接解析。为此,它可能会重用LoadLibrary后面的一些相同代码。它很可能不会使用
GetProcAddress
中的代码,而是更愿意对所有必要的函数进行一次批量查找


然而,MSVC有一个叫做延迟加载的特性。使用此功能,MSVC++不会构建这样的导入表,而是插入实际的
LoadLibrary
GetProcAddress
调用。这样做的好处是,这些电话是在可能的最晚时刻发出的。虽然您不需要特定的DLL,但它没有加载。这可以加速程序启动

一个DLL可以有多个版本,这意味着它包含的函数可能位于不同的地址,因此是的,操作系统需要调用
LoadLibrary
GetProcAddress
。但是,它很可能使用这些函数的内部版本,而不是公开可见的版本。函数的地址是动态的,对吗?因为dll的地址在每次加载时都会更改@小心,是的。它是由操作系统加载器完成的,它使用可执行文件中的导入表来知道DLL名称和需要找到的函数的名称。使用Dumpbin.exe/imports查看该表的外观。可以有多个版本的DLL,这意味着它包含的函数可能位于不同的地址,因此是的,操作系统需要调用
LoadLibrary
GetProcAddress
。但是,它很可能使用这些函数的内部版本,而不是公开可见的版本。函数的地址是动态的,对吗?因为dll的地址在每次加载时都会更改@小心,是的。它是由操作系统加载器完成的,它使用可执行文件中的导入表来知道DLL名称和需要找到的函数的名称。使用Dumpbin.exe/imports查看该表的外观。