我认为这很愚蠢,但我听不懂,

例如,我想使用Windows API,例如GetWindowsDirectory,GetSystemInfo等。我可以直接使用Api或通过GetProcAddress调用:

方法1
在这里,我可以使用LoadLibrary和GetProcAddress调用API:

#include <windows.h>

typedef UINT (WINAPI *GET_WIN_DIR)(LPWSTR lpBuffer, UINT size);

TCHAR infoBuffer[MAX_PATH + 1];
HINSTANSE dllLoad = LoadLibrary("Kernel32.dll");
GET_WIN_DIR function = (GET_WIN_DIR )GetProcAddress(dllLoad, "GetWindowsDirectoryW");

int result = function2(infoBuffer, MAX_PATH + 1);

方法2
在这里,我可以直接调用诸如GetWindowsDirectory之类的API:
#include <windows.h>

TCHAR infoBuffer[MAX_PATH + 1];
GetWindowsDirectory(infoBuffer, MAX_PATH);

我有2个问题:
  • 两种方法之间有什么区别?
  • 是否会加载库对可执行文件的影响?(。exe)(我做了测试,但未更改)
  • 最佳答案

    微软电话

  • 方法1 ...显式链接
  • 方法2 ...隐式链接

  • 从MSDN Linking an Executable to a DLL:



    在我们的项目中,在任何常见情况下我们都使用隐式链接。

    我们在两种情况下异常(exception)地使用显式链接:
  • 用于在运行时显式加载的插件dll
  • 在特殊情况下隐式链接函数不是正确的函数。

  • 如果我们使用的DLL本身链接到其他DLL的不同版本(例如,来自Microsoft),则可能会发生第二种情况。当然,这有点关键。实际上,我们试图防止第二种情况。

    关于c++ - 加载DLL和直接调用之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50894294/

    10-17 01:38