本文的目的是 创建一个最小化的dll并使用它

环境:win7 + vs2012

一个VS的解决方案(sln)下面可以有多个项目(project),所以这里新建一个解决方案,然后下面创建两个项目。

新建第一个 Win32 项目 my_dll,注意,是Win32,DLL空项目

在 my_dll 工程的 头文件 里头 添加 新建项 取名 my_dll.h

在 my_dll 工程的 源文件 里头 添加 新建项 取名 my_dll.cpp

my_dll.h里头写入:

 //------------------ my_dll.h ----------------  

 #pragma once;  

 // 该宏完成在dll项目内部使用__declspec(dllexport)导出
// 在dll项目外部使用时,用__declspec(dllimport)导入
// 宏 MY_DLL_IMPLEMENT 在my_dll.cpp中定义
#ifdef MY_DLL_IMPLEMENT
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif MY_DLL_API double my_add(double a, double b);

my_dll.cpp里头写入:

 //------------------ my_dll.cpp ----------------  

 // 注意此处的宏定义需要写在#include "my_dll.h"之前
// 以完成在dll项目内部使用__declspec(dllexport)导出
// 在dll项目外部使用时,用__declspec(dllimport)导入
#define MY_DLL_IMPLEMENT #include "my_dll.h" double my_add(double a, double b)
{
return a+b;
}

然后就变成这个样子:

然后点击 my_dll 解决方案,右键 ->添加->新建项目

新建一个 Win32 控制台程序 use_my_dll

点击 控制台应用程序空项目

在 use_my_dll 工程下的 源文件 添加 新建项 取名 main.cpp

 //------------------ main.cpp -------------------
#include "my_dll.h"
#include <iostream> using namespace std; int main(char argc, char**argv)
{
cout << "----------------------" <<endl;
cout << "my_add: 3+5=" << my_add(, )<<endl;
cout << "----------------------" <<endl; system("pause");
return ;
}

然后整个页面如下:

现在 添加新应用附加包含目录

右键 use_my_dll 工程 选择属性,在“属性页”对话框中,展开“通用属性”节点、选择“框架和引用”,然后选择“添加新引用”按钮

显示出 my_dll 工程,勾选并确定(如果my_dll工程和use_my_dll工程在不同的解决方案里,则这一步不会显示出任何工程,需要添加进来才能显示)

再右键use_my_dll属性,依次展开“配置属性”节点和“C/C++”节点,然后选择“常规”。在“附加包含目录”旁边,指定 my_dll.h 头文件的位置路径。

完成了这一步以后还要 右键 use_my_dll 工程将其 设为启动项目,缺了这一步会报错

然后“调试”“开始执行(不调试)”就能显示出结果了:

所有以my开头的变量和名字都可以随便取名。

要实现复杂点的功能的话可以在头文件my_dll.h中声明命名空间和类,在my_dll.cpp中实现,在main.cpp中调用

三个文件如下:

 //------------------ my_dll.h ----------------  

 #pragma once;  

 // 该宏完成在dll项目内部使用__declspec(dllexport)导出
// 在dll项目外部使用时,用__declspec(dllimport)导入
// 宏 MY_DLL_IMPLEMENT 在my_dll.cpp中定义
#ifdef MY_DLL_IMPLEMENT
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif namespace my_namespace
{
class MY_DLL_API MySimpleDll
{
public:
MySimpleDll();
~MySimpleDll(); double my_add(double a, double b);
};
}
 //------------------ my_dll.cpp ----------------  

 // 注意此处的宏定义需要写在#include "my_dll.h"之前
// 以完成在dll项目内部使用__declspec(dllexport)导出
// 在dll项目外部使用时,用__declspec(dllimport)导入
#define MY_DLL_IMPLEMENT #include "my_dll.h" namespace my_namespace
{
MySimpleDll::MySimpleDll()
{} MySimpleDll::~MySimpleDll()
{} double MySimpleDll::my_add(double a, double b)
{
return a+b;
}
}
 //------------------ main.cpp -------------------
#include "my_dll.h"
#include <iostream> using namespace std;
using namespace my_namespace; int main(char argc, char**argv)
{
MySimpleDll msd; cout << "----------------------" <<endl;
cout << "msd.my_add: 3+5=" << msd.my_add(, ) <<endl;
cout << "----------------------" <<endl; system("pause");
return ;
}

visual studio中新建和使用dll的更多相关文章

  1. Umbraco -- 在Visual Studio中新建一个View 如何在Umbraco back office 中显示出来

    在使用Umbraco中的过程中,遇到一个问题. 我在项目中(Visual Studio),添加了一个View---Test.cshtml. 然后进入到该Umbraco项目的back office, 在 ...

  2. 在Visual Studio中使用.lib和.dll的环境搭建

    1 静态库和动态链接库的区别 动态链接库是在运行的时候被调用的,静态库在链接的时候被链接到最终生成的应用程序(.exe)中 静态库需要用到的文件 (.lib .h) 头文件(.h)提供接口,库文件(. ...

  3. 在visual studio code和visual studio中编写TypeScript文件自动生成JavaScript文件

    注:此处的自动生成都为保存ts文件时自动生成js文件 VS CODE 只需要在TypeScript的终端控制台中输入如下命令即可,并注意需要将其中的*换成对应的文件名,此处的*似乎不能作为通用匹配. ...

  4. Visual Studio 2013新建ASP.NET项目使用Empty模板,在页面中使用验证控件出错的解决方案

    Visual Studio 2013新建ASP.NET项目使用Empty模板,在页面中使用验证控件,运行页面,会出现如下的错误: 错误原因 VisualStudio 2012(或2013) WebFo ...

  5. 菜鸟进阶之:VC++之Visual Studio中DLL调用实现

    C++写的DLL,用C++调用其实是一个比较简单的事情,调用DLL函数的方法其实有很多,说一个最普通的方法: 1.新建一个解决方案,文件->新建项目->Visual c++->win ...

  6. Visual Studio中Debug与Release以及x86、x64、Any CPU的区别

    Visual Studio中Debug与Release的区别: 在Visual Studio中,编译模式有2种:Debug与Release.这也是默认的两种方式,在新建一个project的时候,就已经 ...

  7. 在 Visual Studio 中使用 Q# 进行量子编程

    1 量子计算机与量子编程 1.1 量子计算机 Quantum computing is computing using quantum-mechanical phenomena, such as su ...

  8. Visual Studio中Debug与Release以及x86、x64、Any CPU的区别 &&&& VS中Debug与Release、_WIN32与_WIN64的区别

    本以为这些无关紧要的 Debug与Release以及x86.x64.Any CPU 差点搞死人了. 看了以下博文才后怕,难怪我切换了一下模式,程序就pass了.... 转载: 1.https://ww ...

  9. Visual Studio问题集锦:coloader80.dll未正确安装

    问题 今天在修改之前的一个项目的时候报了一个错,大概内容如下: 有一个 Visual Studio 的 DLL 文件(coloader80.dll)未正确安装.请通过"控制面板"中 ...

随机推荐

  1. Linux下安装Blender

    Blender在Windows下,可以在官方直接下载免安装的版本,下载解压缩就能用. 在Linux下稍微麻烦一点点. 如下3步安装的blender不一定是最新版本,且安装完成后发现设置中文会变为方块. ...

  2. C++学习(二十)(C语言部分)之 函数1

    函数 printf 输出的函数 scanf 输入的函数函数是什么 怎么写 是一组一起执行一个任务的语句 一个程序的基本组成单位是函数 只需要知道函数名字和括号里面要填的内容 就可以调用函数 1.如果代 ...

  3. 【杭电OJ3938】【离线+并查集】

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  4. Python语言规范

    Lint 对你的代码运行pylint 定义: pylint是一个在Python源代码中查找bug的工具. 对于C和C++这样的不那么动态的(译者注: 原文是less dynamic)语言, 这些bug ...

  5. Go Example--协程

    package main import "fmt" func main() { //main gorouting中调用f函数 f("direct") //重新建 ...

  6. 如何将centos7作为DNS服务器

    简单来说,dns服务器是起到缓存的作用.比如说我们第一次dig www.baidu.com的时候,dns服务器因为没有解析过百度地址,所以它需要向上一级dns服务器进行查询,然后查询结果会缓存在这台d ...

  7. 统计cpu相关信息

    我的cpu为i3310m 适用类型:笔记本 CPU系列:酷睿i3 3代系列 CPU主频:2.4GHz 三级缓存:3MB 插槽类型:FCBGA1023,FCPGA988 封装大小:37.5×37.5mm ...

  8. PostgreSQL Q&A: Building an Enterprise-Grade PostgreSQL Setup Using Open Source Tools

    转自:https://www.percona.com/blog/2018/10/19/postgresql-building-enterprise-grade-setup-with-open-sour ...

  9. jquery禁用form表单中的文本框

    //禁用form表单中所有的input[文本框.复选框.单选框],select[下拉选],多行文本框[textarea] function disableForm(formId, isDisabled ...

  10. js面向对象编程 ---- 系列教程

    原 js面向对象编程:数据的缓存 原 js面向对象编程:如何检测对象类型 原 js面向对象编程:if中可以使用那些作为判断条件呢? 原 js面向对象编程:this到底代表什么?第二篇 原 js面向对象 ...