以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html

有什么不对的欢迎指正!!!

1.头文件

  1. //testdll.h
  2. #ifndef _TESTDLL_H_
  3. #define _TESTDLL_H_
  4.  
  5. #ifdef TESTDLL_EXPORTS
  6. #define TESTDLL_API __declspec(dllexport) //这个修饰符使得函数能都被DLL输出,所以他能被其他应用函数调用
  7. #else
  8. #define TESTDLL_API __declspec(dllimport) //这个修饰符使得编译器优化DLL中的函数接口以便于被其他应用程序调用
  9. #endif
  10.  
  11. #ifdef __cplusplus
  12. extern "C"
  13. {
  14. #endif
  15.  
  16. namespace MathFuncs
  17. {
  18. // This class is exported from the testdll.dll
  19. // Returns a + b
  20. extern TESTDLL_API double _stdcall Add(double a, double b);
  21.  
  22. // Returns a - b
  23. extern TESTDLL_API double _stdcall Subtract(double a, double b);
  24.  
  25. // Returns a * b
  26. extern TESTDLL_API double _stdcall Multiply(double a, double b);
  27.  
  28. // Returns a / b
  29. // Throws const std::invalid_argument& if b is 0
  30. extern TESTDLL_API double _stdcall Divide(double a, double b);
  31. }
  32.  
  33. #ifdef __cplusplus
  34. }
  35. #endif
  36.  
  37. #endif

使用__declspec(dllexport)导出DLL中的函数,extern “C”标志规范导出函数的修饰名称,是C++工程也能调用dll函数。

  1. // testdll.cpp : 定义 DLL 应用程序的导出函数。
  2.  
  3. #include "stdafx.h"
  4. #include "testdll.h"
  5. #include <stdexcept>
  6. using namespace std;
  7.  
  8. namespace MathFuncs
  9. {
  10. double _stdcall Add(double a, double b)
  11. {
  12. return a + b;
  13. }
  14.  
  15. double _stdcall Subtract(double a, double b)
  16. {
  17. return a - b;
  18. }
  19.  
  20. double _stdcall Multiply(double a, double b)
  21. {
  22. return a * b;
  23. }
  24.  
  25. double _stdcall Divide(double a, double b)
  26. {
  27. if (b == )
  28. {
  29. throw invalid_argument("b cannot be zero!");
  30. }
  31. return a / b;
  32. }
  33. }

以上是导出函数的定义。

  1. //demo.cpp
  2. #include <iostream>
  3. #include "testdll.h"
  4. #pragma comment(lib,"testdll.lib")
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9. double a = 7.4;
  10. int b = ;
  11.  
  12. cout << "a + b = " <<
  13. MathFuncs::Add(a, b) << endl;
  14. cout << "a - b = " <<
  15. MathFuncs::Subtract(a, b) << endl;
  16. cout << "a * b = " <<
  17. MathFuncs::Multiply(a, b) << endl;
  18. cout << "a / b = " <<
  19. MathFuncs::Divide(a, b) << endl;
  20. return ;
  21. }

这是一个测试的demo,隐式连接调用dll函数,一定要三件套.h .lib .dll

欢迎指正!!!

DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数的更多相关文章

  1. DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  2. 【1】基于OpenCV的DLL动态库隐式连接

    1DLL的作用 DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能 ...

  3. DLL导出函数和类 之 __declspec(dllexport)

    可利用__declspec(dllexport)导出函数或类. 若要指定C类型约定导出,则需在前面加extern “C”. 若要导出函数,__declspec(dllexport) 关键字必须出现在调 ...

  4. VC DLL方法的__declspec导入导出

    https://msdn.microsoft.com/zh-cn/library/a90k134d.aspx https://msdn.microsoft.com/zh-cn/library/ms23 ...

  5. DLL进一步讲解:extern "C" __declspec(dllexport)

    一.__declspec(dllexport): 将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口. 通常它和extern    "C"   ...

  6. 动态链接库(dll) __declspec(dllimport) __declspec(dllexport)

    一. __declspec(dllexport) Microsoft 在 Visual C++ 的 16 位编译器版本中引入了 __export,使编译器得以自动生成导出名并将它们放到一个 .lib ...

  7. __declspec(dllexport)和__declspec(dllimport) (——declspec方法创建dll的方法已验证ok)

    转载:https://www.cnblogs.com/chengbing2011/p/4084125.html __declspec(dllimport)和__declspec(dllexport)经 ...

  8. __declspec(dllimport)与__declspec(dllexport)作用总结

    参考自:http://bbs.csdn.net/topics/330169671 __declspec(dllexport):导出符号,也就是定义需要导出函数的dll中给导出函数的函数声明前面加上导出 ...

  9. __declspec(dllexport) & __declspec(dllimport)

    __declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出.我要给别人用.一般用于dll中 省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是 ...

随机推荐

  1. [Javascript] What is JavaScript Function Currying?

    Currying is a core concept of functional programming and a useful tool for any developer's toolbelt. ...

  2. python Sina微博自动转发带抽奖字样的微博,添加关注,取消关注

    项目地址:https://github.com/chengshuyi/SinaWeibo 具有的功能 转发带抽奖字样的微博并可以@相应数量的好友 提取关注并添加关注 取消关注 获取粉丝列表

  3. JAVA小项目之五子棋

    五子棋V1.0 功能: 人人对战,人机对战(初级) 记录双方分数: 主要知识点: 二维坐标系中,各方向坐标的关系及规律. 效果图: 主框架类: package com.gxlee.wzq; /** * ...

  4. asp.net读取Access数据库。

    注:数据库(表名 job  id 工作id ,job工作字段) 数据库放在app_data文件中.名称为database.mdb 如果用codesmith生成,选择的数据库连接类型如下图: 项目结构图 ...

  5. Topshelf

    Topshelf允许开发者创建一个简单的控制台程序,将其安装为一个window服务. 这样做的原因很简单:方便调试. 使用命令行工具可以很方面的安装Topshelf创建的服务. server.exe ...

  6. phpmyadmin登陆提示#2002 无法登录 MySQL 服务器和设置自增

    看看mysql启动没有,结果是mysql服务没有启动,找了半天,是这个原因,那就右键计算机->管理->服务->启动mysql服务 设置自增:在显示出来的一行字段定义中把浏览器的滚动条 ...

  7. ubuntu学习笔记--不断更新中

    1.rpm软件包相关: rpm软件包安装命令: rpm -ivh linuxqq-v1.0.2-beta1.i386.rpm rpm软件默认安装路径查询: rpm -ql *.rpm ubuntu如何 ...

  8. android 检查网络是否可用,如果不可用弹出设置,让用户改变

    /** * 校验网络,如果没有网络,返回true * * @return boolean */ @Override public boolean hasInternetConnected() { Co ...

  9. RMAN-06496: must use the TO clause when the database is mounted or open

    一:问题描述 备份控制文件时报错: RMAN> restore controlfile from '/home/oracle/backup/PROD_32_20140829.bak'; Star ...

  10. 关于iOS应用管理之九宫格的坐标计算以及与UIScrollView的结合

    关于九宫格的布局以及坐标的计算,对于大多数的iOS初学者甚至有一定能力的学者来说都是一大难题,在此写者通过自己的开发经验以及多次应用,把自己的所学所得分享给大家,就通过应用管理来进行浅谈一二.     ...