IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [转]DLL 调用方式

    lincyang发表于 2011-05-07 13:50:00
    love 0

    转自:

    http://www.cppblog.com/amyvmiwei/archive/2008/01/02/40202.html

    DLL(动态连接库),然而可以分为动态调用于静态调用。下面我分别举一个例子说说。

    1)动态调用:
    首先:在VC++6.0中创建 Win32 Dynamic-link library工程创建一个动态连接库工程:
                在头文件TestDll.h中写下代码
                extern "C" int __declspec(dllexport) add(int numa, int numb);
                在源文件TestDll.cpp中实现改函数:
                int __declspec(dllexport) add(int numa, int numb)
                {
                          return numa + numb;
                }
    其次,创建一个测试程序,TestDemo,创建一个.cpp文件,然后放下代码:
    HINSTANCE hinstance;

    typedef int (*lpAdd)(int a, int b);


    lpAdd lpadd;

    int main()
    {
              hinstance = LoadLibrary("E://vc//DLL//TestDll//Debug//TestDll.dll");
              lpadd = (lpAdd)GetProcAddress(hinstance, "add");
              cout << "2 + 3 = " << lpadd(2, 3) << endl;
              FreeLibrary(hinstance);
              return 0;
    }
    而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。

      首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;

        其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;

       再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;

         最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。

        通过这个简单的例子,我们获知DLL定义和调用的一般概念:

          (1)DLL中需以某种特定的方式声明导出函数(或变量、类);

         (2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。


    2)静态连接:
    代码如下:
    #include <iostream>
    using namespace std;

    #pragma comment(lib,"Testlib.lib") 

    //.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
    extern "C" __declspec(dllimport) add(int x,int y); 

    int main()
    {
             int result = add(2,3); 
             cout << result << endl;
             return 0;
    }

     



沪ICP备19023445号-2号
友情链接