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的路径,因为现在exe和dll在同一个目录下,所以只写名字即可

        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

  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14873448.html
Copyright © 2011-2022 走看看