1.      从 “文件”菜单中,选择 “新建”,然后选择 “项目…”

2.      在“项目类型”窗格中,选择“Visual C++”下的“Win32”

3.      在“模板”窗格中,选择“Win32 控制台应用程序”

4.      为项目选择一个名称,如 MathFuncsDll,并将其键入“名称”字段。 为解决方案选择一个名称,如 DynamicLibrary,并将其键入“解决方案名称”字段。

5.      单击“确定”启动 Win32 应用程序向导。 在“Win32 应用程序向导”对话框的“概述”页中,单击“下一步”

6.      在“Win32 应用程序向导”中的“应用程序设置”页中,),选择“控制台应用程序”,取消预编译。

7.      在“Win32 应用程序向导”“应用程序设置”页中,选择“附加选项”下的“空项目”

8.      单击“完成”创建项目。

更改生成为*.dll程序

主要代码:

#pragma once
namespace MathFun
{
class MathFuns
{
public:
MathFuns(void);
~MathFuns(void);
static _declspec(dllexport) double Add(double num1, double num2);//_declspec(dllexport) 为到处动态链接库的函数 外部可用 如果没改关键字的函数 外部不可调用
static _declspec(dllexport) double Subtract(double num1, double num2);
static _declspec(dllexport) double Multiply(double num1, double num2);
static _declspec(dllexport) double Devide(double num1, double num2);
}; }
#include "MathFuns.h"
namespace MathFun
{
MathFuns::MathFuns(void)
{
} MathFuns::~MathFuns(void)
{
} double MathFuns::Add(double num1, double num2)
{
return num1 + num2;
} double MathFuns::Subtract(double num1, double num2)
{
return num1 + num2;
} double MathFuns::Multiply(double num1, double num2)
{
return num1 * num2;
} double MathFuns::Devide(double num1, double num2)
{
return num1 / num2;
}
}

运行生成成功:会生成 Dll.dll 和 Dll.lib(引入库,相当于头文件的作用)

编写测试程序:可以把MathFuns.h考到现在工程的代码目录下,或者工程-属性-添加附加包含目录,把MathFuns.h所在目录添加上去。

#include "stdafx.h"
#include <iostream>
#include "MathFuns.h"
using namespace std;
using namespace MathFun; int _tmain(int argc, _TCHAR* argv[])
{
double num1 = 0.0;
double num2 = 0.0;
cout << "请输入: ";
cin >> num1 >> num2;
cout << MathFuns::Add(num1, num2) << endl; cin.get();
cin.get();
return 0;
}

然后编译运行,会报错显示系统缺少Dll.dll链接库,可以把Dll.dll链接库所在的路径加入到环境变量中,或粘贴到window - system32 或system64的目录下

最好放在现在现在的测试工程 生成的*.exe 目录下

运行:

成功了。

vs自带的dumpbin工具 可以查看动态链接库,导出的函数,用vs下面带的命令打开,输入dumpbin直接有效,

在cmd窗口中的其他目录想命令有效,需要 把D:\Program Files (x86)\vs2012\VC\bin 目录下 vcvars32.bat文件拖到cmd窗口中,然后直接运行,不用删除两边“”,

然后输入dumpbin 会出来提示

然后切换到Dll.dll目录下:

红圈中为导出函数:名字乱码是因为C++编译器为了实现重载,而按自己方式重新生成函数名字

切换到测试程序中 输入已下命令查看,该exe导入的dll都有哪些以及有哪些函数

新建一个控制台空项目-配置属性-配置类型选择(*.dll)

添加-新建项-添加一个cpp文件,添加代码:

_declspec(dllexport) double Add(double num1, double num2)
{
return num1+ num2;
}
_declspec(dllexport) double Subtract(double num1, double num2)
{
return num1 - num2;
}

生成(工程名为Dll2)Dll2.dll和Dll2.lib(引入库文件)

添加测试工程,

1, Dll2.lib 放在测试工程的代码目录下(或工程-属性-链接器常规-附加库包含目录中添加DLL2.lib所长目录)

2, 工程-属性- 连接器-输入-附加依赖项中添加库的名字 Dll2.lib

测试代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
//extern double Add(double num1, double num2);
_declspec(dllimport) double Add(double num1, double num2);
int _tmain(int argc, _TCHAR* argv[])
{
double num1 = 0.0;
double num2 = 0.0;
cout << "请输入: ";
cin >> num1 >> num2;
cout << Add(num1, num2) << endl; cin.get();
cin.get();
return 0;
}

extern和 _declspec(dllimport)都是可以的, 不过_declspec(dllimport)效率更高就是指定到 动态链接库中查找;

成功生成*.exe程序,还要把Dll2.dll拷贝到该目录下

运行:

让test程序中不需要添加引用的函数声明的方法:

修改Dll2.dll工程:

添加头文件:添加预编译命令行

#ifndef DLL_API
#define DLL_API _declspec(dllimport)
#else #endif DLL_API double Add(double num1, double num2); DLL_API double Subtract(double num1, double num2);

//#include ""函数一定要在

#define DLL_API  _declspec(dllexport)

下面 要不会出错

#define DLL_API  _declspec(dllexport)
#include "MathFunc.h"
DLL_API double Add(double num1, double num2)
{
return num1+ num2;
}
DLL_API double Subtract(double num1, double num2)
{
return num1 - num2;
}

然后把MathFunc.h 和 dll2.dll拷贝到测试工程代码的目录下

把dll2.dll放到生成的*.exe目录下:

修改测试代码:

#include "stdafx.h"
#include "MathFunc.h"
#include <iostream>
using namespace std;
//extern double Add(double num1, double num2);
//_declspec(dllimport) double Add(double num1, double num2);
int _tmain(int argc, _TCHAR* argv[])
{
double num1 = 0.0;
double num2 = 0.0;
cout << "请输入: ";
cin >> num1 >> num2;
cout << Add(num1, num2) << endl; cin.get();
cin.get();
return 0;
}

运行成功:同上;

动态链接库中导入类 class _declspec(dllexport) test{}, 类中也会有访问限制

生成函数名不乱码的动态链接库的方法:

#ifndef DLL_API
#define DLL_API extern "C" _declspec(dllimport)
#else #endif DLL_API double Add(double num1, double num2); DLL_API double Subtract(double num1, double num2);
#define DLL_API extern "C" _declspec(dllexport)
#include "MathFunc.h"
DLL_API double Add(double num1, double num2)
{
return num1+ num2;
}
DLL_API double Subtract(double num1, double num2)
{
return num1 - num2;
}

这样导出的*.dll的函数名字就不会改变函数名字,注:
extern "C" 不能导出类的成员函数, 只能导出全局函数

重新替换 MathFunc.h 和 dll2.lib 和 dll2.dll 就可运行。

标准调用约定:_stdcall

extern "C" _declspec(dllexport) double _stdcall Subtract(double num1, double num2)
{
return num1 - num2;
}

改变调用约定, extern "C" 导出的函数名也会变, 后面的数字16为参数的字节数大小,两个double为16

模块定义文件方式改变动态链接库,导出函数名字改变的问题:

*.def改变导出函数名字问题,这种方法不好用,有了解的同学可以告知一下。

程序中动态的加载动态链接库:

测试代码:

#include "stdafx.h"
//#include "MathFunc.h"
#include <iostream>
#include <windows.h> //句柄函数及加载动态链接库的头文件 using namespace std;
//extern double Add(double num1, double num2);
//_declspec(dllimport) double Add(double num1, double num2);
int _tmain(int argc, _TCHAR* argv[])
{
double num1 = 0.0;
double num2 = 0.0;
cout << "请输入: ";
cin >> num1 >> num2;
//cout << Add(num1, num2) << endl; HINSTANCE hinst;//声明window 句柄
//const char *p = "Dll2.dll";
hinst = LoadLibrary(L"Dll2.dll"); //获取动态链接库 句柄 typedef double(*AddProc)(double a, double b);//定义函数指针 如果调用约定为标准调用约定 _stdcall 这个改为typedef double(_stdcall *AddProc)(double a, double b); AddProc Add = (AddProc)GetProcAddress(hinst, "Add");//获取动态链接库中的Add函数,改函数名要严格等于dumpbin /exports dll2.dll的导出函数名
cout << Add(num1, num2) << endl;
cin.get();
cin.get();
return 0;
}

字符串前面加L"xxxx", 
将ANSI字符串转换成unicode的字符串。

表示转换成宽字符,就是每个字符占用两个字节。

例:strlen("asd")   =   3;   
  strlen(L"asd")   =   6;

运行结果同上。

动态的加载,好处很多,如果是静态引入库方式的加载动态链接库,这个链接库暂时没有用到也会加载进去,造成程序启动缓慢。

exe有个main或者WinMain入口函数一样,DLL也有一个入口函数,就是DllMainMSDN有帮助文档。

大概就这样了!

C++创建动态链接库(*.dll)的更多相关文章

  1. MFC创建动态链接库DLL并调用方法详解

    实例一: 1.创建一个动态链接库工程,如login_dll. 2.在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下: #include "stdafx.h& ...

  2. VS2010创建动态链接库(DLL)的方法

    1.第一步创建WIN32项目,选择DLL 2.第二步,创建你自己的DLL CPP文件和头文件,下面以两个简单的加减法函数为例子导出 然后编译生成即可.DLL文件在Debug或Release目录中 .d ...

  3. C# 创建和引入动态链接库dll文件

    一.创建动态链接库dll文件 新建 -> 项目->类库 名称为:dlltest 添加函数:消息框弹出消息 using System.Collections.Generic; using S ...

  4. vs2010创建和使用动态链接库(dll)

    本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流. 本文包含以下内容: 创建动态链接库项目 向动态链接库添加类 创建引用动态链接库的 ...

  5. 创建一个动态链接库 (DLL),使用VS2010

    在本演练中,您将创建一个动态链接库 (DLL),其中包含可供其他应用程序使用的有用例程.使用 DLL 是一种重用代码的绝佳方式.您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次, ...

  6. vs2010 创建和C#使用动态链接库(dll)

    一.VS 用 C++ 创建动态链接库 Step 1:创建Win32 Console Application 本例中我们创建一个叫做“Test”的Solution. Step 2:将Applicatio ...

  7. vs2010 C++创建和使用动态链接库(dll)

    一.用C++创建动态链接库项目:  1.打开Microsoft Visual Studio 2010,选择File->New->Project.  2.在NewProject中选择Inst ...

  8. 编译可供C#调用的C/C++动态链接库dll文件

    编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...

  9. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

随机推荐

  1. 没有开发者账号,如何解锁wp8设备

    原文 http://www.cnblogs.com/vsdot/p/3263454.html 问题的引入 好了,问题的由来是这样的,我想把我开发的wp8手机部署到手机上,可是竟然出现了下面的问题: [ ...

  2. 20 你应该知道的PHP库

    下面是一些非常有用的PHP类库,相信一定可以为你的WEB开发提供更好和更为快速的方法. 图表库 下面的类库可以让你很简的创建复杂的图表和图片.当然,它们需要GD库的支持. pChart – 一个可以创 ...

  3. jQuery 自学笔记—3

    jQuery 语法实例 $(this).hide() 演示 jQuery hide() 函数,隐藏当前的 HTML 元素. $("#test").hide() 演示 jQuery ...

  4. 基于Visual C++2013拆解世界五百强面试题--题7-链表的各种操作

    请用C实现一个链表,实现链表的查找,逆置,替换,删除,添加,清空,创建. 查找.替换和删除.添加里面都会用到遍历链表的操作,所以重点在于遍历, 链表的逆置和清空考虑到效率,我们可以用递归实现, 至于创 ...

  5. 84. 从视图索引说Notes数据库(下)

    作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...

  6. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  7. Objective-c中@interface、@implementation、@protocal

    以下 void print(); }; class AC{ }; 这时候,AI和AC是独立存在,AC不会因为没有和AI建立关系而编译错误,将AC做以下修改后,AI才和AC建立了关系,AC必须实现AI中 ...

  8. US/OS2之任务同步与通信

    嵌入式系统中的各个任务都是以并发的方式来运行的,并为同一个大的任务服务,它们不可避免地要共同使用一些共享资源,并且在处理一些需要多个任务共同协作来完成的工作时,还需要相互的支持和限制.因此,对于一个完 ...

  9. Android中使用NDK

    首先用Android Studio下载NDK 这个比较简单,就不多说了 1.写调用jni的Java代码 新建一个JniUtils类 public class JniUtils { static { S ...

  10. 使用autoCompleteTextView以及MultiAutoCompleteTextView实现自动匹配输入内容

    一:autoCompleteTextView 1:控件属性设置: 注意添加:android:completionThreshold="1"来设置输入几个字符的时候开始显示匹配的内容 ...