一,在VS里面 新建项目->Visual C++ -> win32 控制台应用程序 -> 填写项目名称->下一步选择 dll ;

二,自动生成的文件如图:

以项目名称生成的Mydll.cpp,文件,我们可以在Mydll.cpp里面添加自己的函数和类;如:

#include "stdafx.h"
#define DLL_OUT __declspec(dllexport) DLL_OUT int Add(int a,int b)
{
  return a+b;
}
DLL_OUT int ride(int a,int b)
{
return a*b;
}

  

也可以新建个cpp文件,在里面添加如上的代码;

三,生成dll文件前要设置的选项:在项目的配置属性下面修改:

1.C++ ->代码生成-》多线程调试(/MTd)

2.C++ ->预编译头->不使用预编译头

最好F7编译就可以生成mydll,mydll.lib 这2个文件

四,使用刚才我们生成的dll文件;

1.新建个项目,在main.cpp文件下加入如下的代码:

#pragma comment (lib,"Mydll.lib")
//声明使用导入的Dll 文件,参数类型对就行
__declspec(dllimport) int Add(int a, int b);
__declspec(dllimport) int ride(int,int); int main()
{
int a = Add(10,11); //a = 21;
int b = ride(10,11); //b = 110;
return 0;
}

  

 

2. copy 到 要用的项目的目录中;和*.cpp文件所在的目录;放在这里的话只在调试的时候是调用这里的dll,如果想做在项目中使用,要copy到执行文件下面,执行文件才能找到他;

五,dll文件分代码段和数据段;代码段被加载的时候只加载一次,可以被多个进程共享,但数据段是被每个进程copy一份,是私有的;

六,发布dll文件给其他人开发的时候需要给3个文件:dll 的头文件,dll的lib文件,还包括一份声明dll函数的头文件;我们在简化下优化下上面的dll文件的写法:新建 Mydll.h,Mydll.cpp文件如果没有的话;

Mydll.h的内容如下:

#ifndef _MYDLL_H
#define _MYDLL_H #ifdef MYDLL_EXPORTS
#define MYDLL __declspec(dllexport)
#else
#define MYDLL __declspec(dllimport)
#endif MYDLL int Add(int a, int b);
MYDLL int ride(int a, int b); #endif

Mydll.cpp:

#define MYDLL_EXPORTS
#include "Mydll.h" int Add(int a,int b)
{
return a+b;
} int ride(int a,int b)
{
return a*b;
}

编译后,其他项目的调用方法:

#include "Mydll.h"
#pragma comment (lib,"Mydll.lib") int main()
{
int a = Add(10,11); //a = 21;
int b = ride(10,11); //b = 110;
return 0;
}

简单吧;

七,包含文件可以用<>和"" 这2个符号,其中<>代表系统目录,这个系统目录其实是可以在vs中定义的,如图:

八,以上说的都是动态库的创建和使用方法;下面说一下静态库的创建和使用;

1.和上面一样,新建项目的时候选择 静态库和空项目,和普通的写法一样,生成的是个*.lib文件,只要把*.h和*.lib 发给用户使用就行;

2.调用的时候,和普通的调用方式一样;

3.静态库使用不方便,必须要同一个编译器才能编译,约束非常多,不建议使用

九,手动加载Dll,用到的函数LoadLibrary加载和FreeLibrary卸载;写法如下:

	HINSTANCE handle = LoadLibrary("Mydll.dll");
if (handle)
{
typedef int (*DLL_FUNCTION_VER) (int,int);
DLL_FUNCTION_VER dll_func = (DLL_FUNCTION_VER)GetProcAddress(handle,"Add");
if (dll_func)
{
int result = dll_func(10,20);
printf("result: %d",result);
}
FreeLibrary(handle);
}

  

  

最新文章

  1. Java中,异常的处理及抛出
  2. 一小时包教会 —— webpack 入门指南
  3. 中兴MF667S WCDMA猫Linux拨号笔记
  4. 《DSP using MATLAB》示例Example5.4
  5. SQL Server 诊断查询-(4)
  6. centos下yum搭建安装linux+apache+mysql+php环境
  7. SQL exist
  8. Codeforces Round #Pi (Div. 2) E. President and Roads 最短路+桥
  9. pull解析xml文件
  10. MAC中通过gem命令安装compass
  11. Redis用户添加、分页、登录、注册、加关注案例
  12. linux中多线程解析
  13. 无法识别的属性“targetFramework”。请注意,属性名是大写和小写。错误的解决方案
  14. Excel的 OleDb 连接串的格式(Provider=Microsoft.ACE.OLEDB)
  15. 2018年冬季寒假作业4--PTA 抓老鼠啊~亏了还是赚了?
  16. Windows server 2008R2远程桌面3389端口修改方法技巧
  17. 《JavaWeb从入门到精通》(明日科技,清华大学出版社)
  18. 1月第2周业务风控关注|“扫黄打非”部门查处互动作业、纳米盒等20多个学习类App
  19. 项目梳理4——WebApi项目,使用注释填充Description字段
  20. Confluence 6 结构(Schema )设置

热门文章

  1. 阻止YII 1.0自动加载内置JQUERY库
  2. [ERROR] Error generating R.java from manifest
  3. listView的异步加载数据
  4. BZOJ 2176 Strange string 最小表示法
  5. Tomcat startup.bat启动隐藏弹出的信息窗口
  6. 第5章 网页下载器和urllib2模块
  7. IOS发送带附件的邮件
  8. Oracle11g完全卸载方法
  9. Office Web Apps 2013对文档的精细定位
  10. 6.1-AliasRegistry