zoukankan      html  css  js  c++  java
  • 【旧博文】动态库的动态连接与静态连接

    DLL(动态链接库),按名取意是动态链接的库。但dll分动态链接和静态链接。

    静态链接的意思是以lib作为导出函数头加载dll,这样的动态库加载编译後,执行程序的初期就判断是否用dll文件

    /*test.cpp*/

    #ifdef      __cplusplus
    #define     EXPORT extern "C" __declspec (dllexport)
    #else
    #define     EXPORT __declspec (dllexport)
    #endif
    EXPORT      long sum(int a, int b)
    {
    return a+b;
    }
    #ifdef      UNICODE
    以上类似的代码在编译的时候会生成一个lib文件来包含dll的函数名
    调用方式如下
     
    #pragma comment(lib, “test.lib”)//lib库文件
    #ifdef      __cplusplus
    #define     IMPORT extern "C" __declspec (dllimport)
    #else
    #define     IMPORT __declspec (dllimport)
    #endif
    EXPORT      long sum(int a, int b);
    之后,在下面的程序按照普通函数调用即可。
     
    另一种是动态使用dll,这种方式是当程序使用dll时才判断是否用此动态库文件。这种方法也适用于丢失lib文件的dll,
    /*调用动态dll*/
               typedef long(__cdecl *TESTDLL)(int a, int b);
               HINSTANCE hmod;
               /*调入动态库*/
               hmod = ::LoadLibrary("test.dll");
               if (hmod == NULL)
               {
                  AfxMessageBox("Fail");
               }
               TESTDLL lpproc;
               lpproc = (TESTDLL)GetProcAddress(hmod, "sum");
               if (lpproc != (TESTDLL)NULL)
               {
                    /*执行动态库中的函数*/
                    long result = (*lpproc)(cd)(1, 2);
                          result存储的就是计算的结果。
               }
      FreeLibrary(hmod);
      }
     
    以上仅针对两种形态进行解读,并没有涉及到深层次的资源等东西。
    我的臆想是这样,在自己做程序的时候,比如学习程序设计的时候,可以使用动态加载,这样会节省内存资源。而在给公司做的时候,尽量用lib连接的方式,因为客户可能误删dll文件,在程序初始化时候提示错误比使用一段时间后弹出错误要好吧。
  • 相关阅读:
    006 date find
    005 输出重定向 > >>命令 echo命令 tail命令
    总结,一周,
    mokey 学习
    树状,
    定制,
    萌芽,
    到底为什么,
    会,
    “恋爱”,一路走来,
  • 原文地址:https://www.cnblogs.com/ldr123/p/2389609.html
Copyright © 2011-2022 走看看