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

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文件,在程序初始化时候提示错误比使用一段时间后弹出错误要好吧。
posted @ 2012-03-10 22:44  ldr123  阅读(229)  评论(0编辑  收藏  举报