• 【旧博文】动态库的动态连接与静态连接


    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文件,在程序初始化时候提示错误比使用一段时间后弹出错误要好吧。
  • 相关阅读:
    Hibernate映射
    hibernate 大对象类型的hibernate映射
    Hibernate映射文件详解(News***.hbm.xml)二
    Hibernate映射文件详解(News***.hbm.xml)一
    hibernate的速度问题--hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size
    EF使用EntityTypeConfiguration配置映射关系
    数据对象的映射关系
    SQL SERVER索引
    WCF(三)相关技术的学习
    WCF(二) endpoint
  • 原文地址:https://www.cnblogs.com/ldr123/p/2389609.html
Copyright © 2020-2023  润新知