DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数
以下内容,我看了多篇文章,整合在一起,写的一个例子,关于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中函数的更多相关文章
- DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数
以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...
- Nginx_handler模块发开(hello模块结构解析)
声明:请在文章页面明显位置给出原文连接 http://www.cnblogs.com/paulweihan/p/4654173.html,否则保留追究法律责任的权利. 近期查了非常多资料.入门的样例都 ...
- 如何使用g++编译调用dll的c++代码
本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dl ...
- 摘: VS2010 C++ 调用 DLL (C++编写)
一.为什么需要dll 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用. 比较常见的例子是各种应用程序框架,如ATL. ...
- VS2013 C#中调用DLL
winform界面中,使用C#编程调用DLL过程记录: (1)什么是DLL 动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL 是一个包含可由多个程序同时使用的代码 ...
- c# 调取 c++ dll____c#调用dll
1.以海康摄像头dll为例.(文章转载https://www.cnblogs.com/smartsensor/p/4343744.html) 海康SDK编程指南 目前使用的海康SDK包括IPC_SDK ...
- DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)
简介 动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能.导出函数有两种主要方式,分别是静态导入和动态导入,本 ...
- 使用Def文件导出Dll文件
模块定义 (.def) 文件是包含一个或多个描述 DLL 各种属性的 Module 语句的文本文件.如果不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 需要 ...
- DLL模块:C++在VS下创建、调用dll
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
随机推荐
- ORACLE函数之单行数字函数
1. ABS(X) 返回X的绝对值 SQL>SELECT ABS(-1) A,ABS(1) B,ABS(0) C FROM DUAL; A B ...
- HttpWebRequest get/post方法实现
get请求url #region GetHttp请求 /// <summary> /// GetHttp请求 /// </summary> /// <param name ...
- C#_串口程序_二次打包_事件响应
using System;using System.IO.Ports;using System.Windows.Forms; namespace Dll_Serial_Comm{ public ...
- 使用linux操作系统的公司服务器有哪些品牌
服务器硬件是什么牌子的? 操心系统有哪些?cpu是哪些?
- (转)validateRequest="false"
由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值.立马报错. 解决方案一: 在.aspx文件头中加入这句: <%@ Page validat ...
- github修改自己的昵称
由于刚接触github,不会用,就随便写了个昵称,后来想改,却不知道从哪里改,到百度搜结果都是说不能修改的(这里就不吐槽百度了),还是直接上图吧. 点击Settings,然后跳转到下面界面,点击Acc ...
- Oracle 优化——位图、函数等索引介绍
一.位图索引 我将使用一个例子,来描述位图索引的存储,并分析它的优点. Table :Loans 放贷信息 ID userId 行业投向 币种 证件类型 还本付息方式 状态 1 1 农业 人民币 身份 ...
- java swing 音乐播放器-乐乐音乐
乐乐音乐1.0(本地版) 乐乐音乐是基于musique 开源播放器开发的java swing音乐播放器,实现了mp3.flac.ape.wav等多种音频格式的播放和ksc歌词的解析.制作和显示. 完成 ...
- canvas 绘制矩形
XXX(x,y,width,height) x矩形左上角x坐标 y矩形左上角y坐标 ...
- 比file_get_contents稳定的curl_get_contents
相信使用过file_get_contents函数的朋友都知道,当获取的$url访问不了时,会导致页面漫长的等待,甚至还能导致PHP进程占用CPU达100%,因此这个函数就诞生了 分享一个实际在用的函数 ...