• 动态链接库的学习(一)


    VC++动态链接库DLL编程深入浅出

    4.非MFC DLL

    4.1一个简单的DLL    

    首先在VC++中new一个win 32 Dynamic-Link Library工程dllTest。MFC AppWizard(dll)建立的是MFC动态链接库。

          在建立的工程中添加lib.h和lib.cpp文件

    /*lib.h*/

    #ifndef LIB_H

    #define LIB_H

    extern "C" int _declspec(dllexport)add(int x,int y);

    #endif

    /*lib.cpp*/

    #include "lib.h"

    int add(int x,int y)

    {

      return x+y;

    }

        然后新建一个与DLL工程处于同一工作区的应用工程dllCall,它调用DLL中的函数add。

    #include "stdafx.h"
    #include "windows.h"

    typedef int ( * lpAddFun)(int,int);

    int main(int argc, char* argv[])
    {
    HINSTANCE hDll; //DLL句柄
    lpAddFun addFun; //函数指针
    hDll = LoadLibrary("..\\Debug\\dllTest.dll");
    if (hDll != NULL)
    {
    addFun = (lpAddFun)GetProcAddress(hDll,"add");
    if(addFun!=NULL)
    {
    int result = addFun(2,3);
    printf("%d",result);
    }
    FreeLibrary(hDll);
    }
    return 0;
    }

        dllTest工程中的lib.h对函数add的声明前面添加了_declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:

         一.DLL导出函数,可供应用程序调用;

         二.DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。

    下面来分析DLL的调用。

          首先,语句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定义和调用的一般概念:

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

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

  • 相关阅读:
    冒泡排序
    MySql
    利用mybatis-generator自动生成代码
    SQL,HQL,CQL,JPQL了解
    mysql中的约束
    详解CRUD?
    什么是数据库ACID?
    建造者模式(Builder Pattern)
    Java中的设计模式
    java中的排序面试题
  • 原文地址:https://www.cnblogs.com/zhanglibra/p/3345979.html
Copyright © 2020-2023  润新知