zoukankan      html  css  js  c++  java
  • DLL创建DLL

    动态链接库的创建

     

    fangyukuan

    2010.6.20

    编写DLL时的函数与一般的函数方法基本一样。但要对库中的函数进行必要的声明,以说明哪些函数是可以导出的,哪些函数是不可以导出的。

    DLL中的函数声明为导出函数的方法有两种:

    一是使用关键字_declspec(dllexport)来声明。

    二是在.def文件中声明。

     

    一、使用关键字_declspec(dllexport)来声明导出函数

     

    声明函数SayHello为导出函数语句为:int _declspec(dllexport)  SayHello ();

    为了使一个用C++语言编写的DLL函数可以在C语言编写的应用程序中使用,在关键字_declspec(dllexport)  之前要附加另一个关键字:extern “C”,以通知编译器采用C链接方式。

     

     

    例子:(用vs2008写的例子)

    新建一个工程。

    选择Win32 Project,工程名字为1_DLLDemo。确定。

    选择DLL其它默认。

    在文件1_DLLDemo.cpp编写代码如下:

     

    extern "C" __declspec(dllexport) void SayHello()

    {

        ::MessageBoxW(NULL, L"Hello", L"fangyukuan", MB_OK);

    }

    F7编译即可。

     

    再新建一个测试工程。这里简单一点,新建一个控制台工程就可以了。

    选择Win32 console Application,其它全部默认。

     

    编写如下代码:

    #include "stdafx.h"

    #include "stdlib.h"      // for system("pause");

    #include "windows.h"

    #include <iostream>

    using namespace std;

     

    typedef void (SAYHELLO)();  // 定义一个这种类型的函数指针

     

    int _tmain(int argc, _TCHAR* argv[])

    {

        HINSTANCE hDllInst;

     

        // 这里为dll的路径,因为现在exedll在同一个目录下,所以只写名字即可

        hDllInst=LoadLibrary(L"1_DLLDemo.dll");      

        if(NULL == hDllInst)

        {

           cout << "加载dll失败" << endl;

        }

        else

        {

           SAYHELLO * lpproc =(SAYHELLO *)GetProcAddress(hDllInst,"SayHello");

           if(NULL != lpproc)

               (*lpproc)();

     

           FreeLibrary(hDllInst);

        }

     

        system("pause");

        return 0;

    }

    F7编译。再按F5运行。结果如下。

     

    二、使用def文件声明导出函数

    def文件又叫做模块定义文件,这是一个用于描述DLL属性的文本文件,每个def文件一般要包括以下模块定义语句:

    A)       LIBRARY语句,指出DLL的名字,链接器将把这个名字放到DLL库中。

    B)       EXPORTS语句,列出库中导出函数的名称导出函数的序号(可选)。

    C)       DISCRIPION语句,该语句用来描述DLL的用途等说明。

    可以在def文件分号“;”后面书写注释语句

     

    在创建DLL时,编译链接器将要使用def文件创建两个文件:一个导出文件(.EXP和一个导入库文件(.LIB,然后使用导出文件再创建DLL文件。

     

    外部应用程序使用的文件是导入库文件DLL文件。由于在导入库文件中存放了外部应用程序可导入的DLL导出函数名称列表,因此外部应用程序需要把它连接在应用程序中,才能以它为索引到DLL中去找到要调用的导出函数。也就是说,导入库文件相当于是DLL可提供的服务项目表。

     

    例子:(用vs2008写的例子)

    方法同上面一样新建一个DLL工程。

    在文件2_DLLDemo.cpp编写代码如下:

    void SayHello()

    {

        ::MessageBoxW(NULL, L"2_DLLDemo::Hello", L"fangyukuan", MB_OK);

    }

    然后再新建一个def文件。

    在工程右键->add->New Item…

     

    def文件编写如下代码:

    LIBRARY    "2_DLLDemo"

    EXPORTS

        SayHello

    F7编译完成。

    测试方法同上面例子一样。

    本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761464.html




  • 相关阅读:
    76、HTTP如何禁用缓存?如何确认缓存?
    多态与多态性,鸭子类型,内置方法,反射,异常处理
    继承的应用,继承实现原理,super(),多继承的代码规范,组合
    类的装饰器,绑定方法与非绑定方法,继承,继承背景下的属性查找
    面向对象,类与对象,__nit__方法,属性查找,隐藏属性
    xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块
    模块:re,json,pickle,time , datetime,random,猴子补丁
    区分py文件的两种用途,包的介绍和使用,日志模块
    模块的概念、使用,搜索路径与优先级,软件开发的目录规范
    三元表达式,列表、字典、集合生成式,生成器表达式,函数递归,匿名函数,面向过程编程
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/1761464.html
Copyright © 2011-2022 走看看