VS2010, VS2013 创建和调用 DLL

原创 2015年11月20日 19:05:27

在 VS 平台下创建和调用 DLL 过程并不复杂,但是里面有很多小的步骤,需要亲自实践之后才会更清晰。直接一步步上图,会更加清晰。

一. DLL 文件的创建

1. 创建 Win32应用程序

新建项目→ Win32 项目,然后填写项目名称 。
这里写图片描述

在选择 “应用程序类型” 的时候,注意选定 “DLL”, “附加选项” 中需勾选 “预编译头”。然后点击完成就可以生成图示的 .h 和 .cpp 文件了。

这里写图片描述

这里写图片描述

2. 创建 def 文件

前面都是小菜菜一碟,其实最关键的是如何生成 def 文件。关于 def 文件在生成 dll 文件中如何如何的优秀,我就不详细叙述了,有兴趣的自己看。
能够找到模块定义文件的关键是右键要点对地方,右键一定要停靠在当前项目 CreateDLL上,如果停靠在“解决方案”上,无论如何也找不到这玩意儿。

这里写图片描述

这里写图片描述
好了,def 文件已经添加到我的项目中了。

3. 添加需导出为DLL函数的头文件和源文件

现在我生成需要导出的文件四个个文件,分别是:calculate.h , calculate.cpp,print.h,print.cpp.

// calculate.h
int add(int a, int b);
int sub(int a, int b);
// calculate.cpp
#include "calculate.h"
#include "stdafx.h"     
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
// print.h
void print();
// print.cpp
#include "print.h"
#include "stdafx.h"
#include "iostream"
using namespace std;
void print()
{
    cout<<  "print successfully!" ;
}

这里需要注意的是,在源文件中需要添加 #include "stdafx.h",而不是在头文件中。

4. DLL文件导出

DLL 的声明有两种方式:一种是使用 def 文件,另一种是在函数头前直接声明。

(1)方法一:定义 def 文件

现在我们需要导出三个函数,分别是int add(int a, int b), int sub(int a, int b),void print(). 其实就变得很容易了,直接在 def 文件中添加如下几行代码:

EXPORTS
add
sub
print

如下图所示
如图

Ok, 创建完成,直接生成(Ctrl + shift + B), 现在打开解决方案文件夹下的 Debug 目录就可以看到生成了我们需要的 CreateDLL.dll 和 CreateDLL.lib 两个文件了。

这里写图片描述

(2)方法二:__declspec(dllexport) 定义法

使用 __declspec(dllexport) 直接定义函数作为 dll 导出,相比 def 而言,无需添加 def 文件,只需在头文件中声明就可以。

头文件 calculate.h

#define MYDLL __declspec(dllexport)
MYDLL int add(int a, int b);
      int sub(int a, int b);
MYDLL int square_error(int a, int b);

源文件 calculate.cpp

#include "calculate.h"
#include "stdafx.h"
#include <iostream>
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int square_error(int a, int b)
{
    return (int)pow((float)sub(a,b), 2);
}

二. DLL 文件的调用

DLL文件的调用也是比较简单的,分为了显式调用和隐式调用,其实隐式调用更加简单。先讲隐式调用,再讲显式。实际操作中隐式调用更加方便。

1. 隐式调用

首先当然是创建一个 Win32 项目或者 Win32 控制台应用程序,这里略过 N 个字,大家都知道。我们创建了一个名为 CallDLL 的 Win32 控制台应用程序。需要注意的是,预编译头一定要勾选

(1)将 CreateDLL.dll、CreateDLL.lib 以及需要用到的头文件 calculate.h、print.h 复制到当前项目的CallDLL 文件夹中。

(2)在 CallDLL.cpp 文件的入口函数前面添加上

     #include “calculate.h”
     #include "print.h"
     #pragma comment (lib , "CreateDLL.lib" )

这时就可以正常在主函数中使用我们 dll 中函数了。如下图所示

这里写图片描述

运行程序,看看是不是 OK了,哈哈!!!

这里写图片描述

当黑框框出现的时候就已经无比鸡冻了。说明成功!

2. 显示调用

(1) 只需要将 CreateDLL.dll 文件添加到相应的文件夹,而无需神马 lib 文件和头文件。但是代码相对来说要复杂一些。

(2) 在 CallDLL.cpp 文件的入口函数前面添加上 #include<widows.h>,因为要用到 API 函数。

(3) 示例代码

#include "stdafx.h"
#include <windows.h>                      // 需要调用 Windows API 
#include "iostream"
using namespace std;

typedef int  (*pFun)(int a,int b);        // 函数指针
typedef void (*pPrint)();                 // 函数指针
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE h = LoadLibrary(_T("dll_test.dll"));
    if(h != NULL)
    {
        pFun pAdd = (pFun)GetProcAddress(h, "add"); 
        cout <<"a + b = "<<pAdd(20, 30) << endl;   

        pFun pSub = (pFun)GetProcAddress(h, "sub");
        cout <<"a - b = "<<pSub(20, 30) << endl;  

        pPrint p = (pPrint)GetProcAddress(h,"print");
        p();
        cout<<"\n";

    }
    FreeLibrary(h);
    return 0;
}

3. C++ 类的 DLL 封装及调用

(1) 添加待封装为 DLL 的类

同函数生成的方法差不多,下面需要把 Calcuate 类封装
头文件 calculate.h

class Calculate
{
public:
    int add(int a, int b);
    int sub(int a, int b);
    int square_error(int a, int b);
};

源文件 calculate.cpp
注意,在源文件中,#include "stdafx.h" 要放在#include “calculate.h”` 的前面才能生成成功。

#include "stdafx.h"      
#include "calculate.h"
#include <iostream>
int Calculate::add(int a, int b)
{
    return a + b;
}
int Calculate::sub(int a, int b)
{
    return a - b;
}
int Calculate::square_error(int a, int b)
{
    return (int)pow((float)sub(a,b), 2);
}

(2)def 文件定义

我们需要把 Calculate 类中的 add, square_error两个函数导出, 相应的 def 文件为

LIBRARY
EXPORTS
add
square_error

(3)类 dll 调用

同函数 dll 调用类似,此处贴上代码

// CallDLL.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include "calculate.h"
#include "print.h"
using namespace std; 
#pragma comment (lib , "CreateDLL.lib" )

int _tmain(int argc, _TCHAR* argv[])
{
    int a = 50;
    int b = 30;
    Calculate calc;   // 声明类的对象
    cout << "a+b="<<calc.add(a,b)<<endl;
    int c = calc.square_error(a,b);
    cout << "a,b平方差为:"<<c<<endl;

    cout<<"\n";
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

vs添加对dll的引用

我们在使用vs进行开发调试的时候经常会遇到一个问题,就是当我们的主工程引用到其他工程更新的dll(我们经常采用copy到工程目录的方法)、亦或者当我们的多个工程引用到同一个dll文件的时候,我们怎么来...

VS2010如何创建DLL和如何使用外部DLL

一、创建DLL: 1、创建DLL项目。这个太简单了,按着选项选没什么好说的。 2、导出lib 方式一: 头文件顶头: #ifdef DLL_EXPORTS (此处在项目预...

VS2010创建和显式调用dll

最简单调用dll的方法

VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,只是项目及文件名称不同。创建动态链接库项目:...

VS2013环境生成和调用DLL动态链接库

创建动态库方法: 创建动态库是生成 .dll .lib 两个个文件 文件 -> 新建 -> 项目-> win32控制台应用程序 项目名称:DLLGenerator 应用程序类型:DLL ...

VS2013添加动态链接库的两种方法(终结篇)

一、VS中添加LIb库及头文件(外部依赖项)的步骤:  1、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。  2、添加文件...

VS2013创建并使用DLL

1.DLL文件 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一...
  • hei_ya
  • hei_ya
  • 2016年06月29日 21:48
  • 4376

vs2013创建及使用DLL

这几天看了许多关于生成Dll的博文,很有感触,遂整理在此,以供自己后续参考。 VS2013创建DLL 我们使用vs2013来生成Dll,其实使用其他的版本也是同理如此。步骤如下:   单击“新建...

使用VS2012生成和调用DLL文件

一:生成DLL 创建DLL工程       文件->新建->项目->visual c++->win32->win32控制台应用程序(win32项目也可以)       填写项目名称myDLL->确...

VS2013 c++ 生成和调用DLL动态链接库

创建动态库方法: 创建动态库是生成 .dll .lib 两个个文件 文件 -> 新建 -> 项目 -> win32控制台应用程序 项目名称:DLLGenerator 应用程序类型:DLL...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VS2010, VS2013 创建和调用 DLL
举报原因:
原因补充:

(最多只允许输入30个字)