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

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

1.头文件

 //testdll.h
#ifndef _TESTDLL_H_
#define _TESTDLL_H_ namespace MathFuncs
{
// This class is exported from the testdll.dll
// Returns a + b
extern double _stdcall Add(double a, double b); // Returns a - b
extern double _stdcall Subtract(double a, double b); // Returns a * b
extern double _stdcall Multiply(double a, double b); // Returns a / b
// Throws const std::invalid_argument& if b is 0
extern double _stdcall Divide(double a, double b);
} #endif

以上是dll工程的头文件,使用命名空间,声明extern外部变量,_stdcall是WIN32API的一种函数调用约定,表示函数参数从右到左压入堆栈

 // testdll.cpp : 定义 DLL 应用程序的导出函数。

 #include "stdafx.h"
#include "testdll.h"
#include <stdexcept>
using namespace std; namespace MathFuncs
{
double _stdcall Add(double a, double b)
{
return a + b;
} double _stdcall Subtract(double a, double b)
{
return a - b;
} double _stdcall Multiply(double a, double b)
{
return a * b;
} double _stdcall Divide(double a, double b)
{
if (b == )
{
throw invalid_argument("b cannot be zero!");
}
return a / b;
}
}

以上定义的dll工程的导出函数

 LIBRARY testdll
EXPORTS
Add @
Subtract @
Multiply @
Divide @

在源文件目录里面添加.def文件,

第一行说明DEF文件对应的dll

EXPORTS后列出要导出函数的名称

可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);

可以用dumpbin.exe或者depends.exe来查看dll中函数的接口参数——序号,函数名等

 //demo.cpp
#include <windows.h>
#include <iostream>
using namespace std; int main()
{
double a = 7.4;
int b = ;
//如果使用.def导出dll函数一定要加_stdcall
typedef double (_stdcall *pAdd) (double a,double b);
typedef double (_stdcall *pSubtract) (double a,double b);
HMODULE hDLL = LoadLibrary("testdll.dll"); //加载DLL文件
if(hDLL != NULL)
{
//得到dll中的第一个函数
pAdd fp1 = pAdd(GetProcAddress(hDLL,MAKEINTRESOURCE())); if(fp1 != NULL)
{
cout << "a + b = " <<
fp1(a, b) << endl;
}
else
{
cout << "Cannot Find Function " << "add" << endl;
} //得到dll中的第二个函数
pSubtract fp2 = pSubtract(GetProcAddress(hDLL,"Subtract"));
if(fp2 != NULL)
{
cout << "a - b = " <<
fp2(a, b) << endl;
}
else
{
cout << "Cannot Find Function " << "Subtract" << endl;
}
FreeLibrary(hDLL);
}
else
{
cout << "Cannot Find " << "testdll" << endl;
}
return ;
}

以上为一个调用dll的demo,使用显示调用,需要用到WIN32 API函数,GetProcAddress(hDLL,MAKEINTRESOURCE(1));第一个这个函数的第二个参数的获得通过dll导出函数的序号获得,GetProcAddress(hDLL,"Subtract");第二个这个函数的第二个参数的获得通过导出函数的名字来获得,

导出函数,一定要采用.def模块 或者 extern "C"修饰符来做,传统方法做出来的导出函数的名字会被编译器修改优化,导致很麻烦的名字,例如"?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z"

表达上的不足请见谅。。相关资料请参考MSDN还有“侯凯”的博客。。

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

  1. DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数

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

  2. Nginx_handler模块发开(hello模块结构解析)

    声明:请在文章页面明显位置给出原文连接 http://www.cnblogs.com/paulweihan/p/4654173.html,否则保留追究法律责任的权利. 近期查了非常多资料.入门的样例都 ...

  3. 如何使用g++编译调用dll的c++代码

    本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ...

  4. 摘: VS2010 C++ 调用 DLL (C++编写)

    一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...

  5. VS2013 C#中调用DLL

    winform界面中,使用C#编程调用DLL过程记录: (1)什么是DLL 动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码 ...

  6. c# 调取 c++ dll____c#调用dll

    1.以海康摄像头dll为例.(文章转载https://www.cnblogs.com/smartsensor/p/4343744.html) 海康SDK编程指南 目前使用的海康SDK包括IPC_SDK ...

  7. DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)

    简介 动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能.导出函数有两种主要方式,分别是静态导入和动态导入,本 ...

  8. 使用Def文件导出Dll文件

    模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件.如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 ...

  9. DLL模块:C++在VS下创建、调用dll

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

随机推荐

  1. 【剑指offer】和为定值的连续正数序列

    .可是他并不满足于此,他在想到底有多少种连续的正数序列的和为100(至少包含两个数).没多久,他就得到还有一组连续正数和为100的序列:18,19,20,21,22.如今把问题交给你,你能不能也非常快 ...

  2. 通知中心 NSNotificationCenter

    NSNotificationCenter 通知中心提供了一种在程序内广播信息的途径,一个NSNotificationCenter对象本质上是一个通知分发表(notification dispatch ...

  3. linux定时任务2-at命令

    定时执行命令: [root@rheltest1 ~]# at now + 1 minute //一分钟后执行下面的任务 at> date >> /tmp/test_date.log ...

  4. MySQL 5.6.19编译安装

    1.创建mysql安装目录.mysql用户 [root@serv19 ~]# mkdir -p /u01/mysql/data [root@serv19 ~]# groupadd mysql [roo ...

  5. ListIterator add remove 使用注意

    add方法示例 //在最前面添加 List<String> list1 = new LinkedList<String>(Arrays.asList(new String[]  ...

  6. 利用ParameterizedType获取泛型参数类型

    //利用ParameterizedType获取java泛型的参数类型 public class Demo {     public static void main(String[] args) { ...

  7. ASP.NET-FineUI开发实践-9

    用了FineUI有一段时间了,还是分享下我咋改的吧,没想的那么难,我也是从小白来的. 基础是要懂JQ和EXTJS,主要是要懂JQ和EXTJS能干啥,这里有两个网站 http://www.w3schoo ...

  8. ClickOnce发布后不能安装

    当在internet发布用ClickOnce打包的客户端程序时,遇到ClickOnce启动后出错,错误信息如下: + Downloading https://xxxxx/Deploy/pc/Boote ...

  9. 如何使用css、布局横向导航栏

    使用css布局横向导航栏,css应用给网页样式的方式,就相当于,给人怎么去穿上衣服,不同的衣服有不同的穿法,这里我们使用的是内联式.在这里 我们可以适当的把值调的大一点,这样我们就可以很容易的对比. ...

  10. 各版本IIS安装方法

      各版本IIS安装方法 Windows 2000 V5.0 将操作系统安装光盘放入光驱,打开“控制面板”→“添加或删除程序”→“添加/删除 Windows 组件”,勾选“Internet信息服务(I ...