• 【原创翻译】链接DLL至可执行文件翻译自MSDN


    可执行文件.exe链接(或加载)DLL有以下两种形式:

    隐式链接是指静态加载或在程序加载时动态链接。

    通过隐式链接,在使用DLL时,可执行文件链接到一个由生成DLL的人提供的导入函数库(.lib 文件)。操作系统在使用这个函数库的执行文件被加载时,加载DLL。这个客户端可执行文件调用DLL的导出函数,就像函数包含在可执行文件中一样。


    显式链接是指动态加载或在程序运行时动态链接。

    通过显示链接,使用DLL的可执行文件必须使用函数调用显式加载(load)和卸载(unload)DLL,然后获取DLL的导出函数。客户端可执行文件必须通过一个函数指针调用导出函数。

    一个可执行文件能对相同的DLL使用任意一个链接方法。此外,这些机制并不相互排斥,当一个可执行文件隐式链接一个DLL而另外一个可执行文件能显示链接它。

    隐式链接使用方法

    要隐式链接到DLL,可执行文件必须从DLL的提供程序获取以下内容:

    • 包含导出的函数或C ++类的声明的头文件(.h文件)。类,函数和数据都应具有__declspec(dllimport),有关更多信息,请参阅dllexport,dllimport。
    • 用于链接的导入库(.LIB文件)。 (链接器在DLL生成时创建导入库。)
    • 真实存在的DLL(.dll文件)。

      使用DLL的可执行文件必须包含每个源文件中包含导出函数(或C ++类)的头文件,该文件包含对导出函数的调用。从写代码角度来看,对导出函数的函数调用就像其他任何函数调用一样。

      要构建调用的可执行文件,您必须链接到导入库。如果你正在使用外部生成文件,请指定导入库的文件名,其中列出了您要链接的其他对象(.obj)文件或库。

      操作系统在加载调用的可执行文件时必须能够找到DLL文件。

    显式链接

    通过显示链接,应用程序必须在运行时使用一个函数调用以显式加载DLL。要明确链接到DLL,应用程序必须:

    • 调用LoadLibrary(或类似的函数)来加载DLL并获取模块句柄。
    • 调用GetProcAddress以获取应用程序想要调用的每个导出函数的函数指针。由于应用程序通过指针调用DLL的函数,因此编译器不会生成外部引用,所以不再需要链接到导入函数库了。
    • 在完成DLL时调用FreeLibrary。

    例如:

    typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);  
    ...  
      
    HINSTANCE hDLL;               // Handle to DLL  
    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer  
    DWORD dwParam1;  
    UINT  uParam2, uReturnVal;  
      
    hDLL = LoadLibrary("MyDLL");  
    if (hDLL != NULL)  
    {  
       lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,  
                                               "DLLFunc1");  
       if (!lpfnDllFunc1)  
       {  
          // handle the error  
          FreeLibrary(hDLL);         
          return SOME_ERROR_CODE;  
       }  
       else  
       {  
          // call the function  
          uReturnVal = lpfnDllFunc1(dwParam1, uParam2);  
       }  
    }

    Game over 结束。

    参考链接: 

    DLLs in Visual C++

    Linking an Executable to a DLL

    Linking Implicitly

    Explicit linking

    dllexport, dllimport

  • 相关阅读:
    Thread+Handler 线程 消息循环(转载)
    android开发之Fragment加载到一个Activity中
    Android应用程序框架之无边界设计意图
    windows系统下安装MySQL
    Java 性能优化技巧集锦
    功能完善的Java连接池调用实例
    Unicode 与 UTF 字符标准
    java内存配置
    Java Map 简介
    nginx 学习笔记(9) 配置HTTPS服务器--转载
  • 原文地址:https://www.cnblogs.com/2018shawn/p/9064830.html
Copyright © 2020-2023  润新知