windows编程:创建DLL
创建DLL
Dll是动态链接库的缩写,可以作为附加代码动态映射到进程的地址空间中。
动态库的一般创建方法如下
方法1、使用 __declspec(dllexport) 方式导出
一般的框架如下
//头文件
#ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
#ifdef MAIN_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
//在导入dll中的函数的时候,__declspec(dllimport)关键字不是必须的
//可以直接用extern 修饰 ,但是,如果编译器提前知道某一函数是从dll
//中导入的话,会产生略微高效的代码,所以建议使用该关键字
#endif
#ifdef __cplusplus
extern "C" //是否使用的是C++,如果使用的是C++ , 则告诉编译器不要改编函 //数名
{
#endif
void DLL_EXPORT SomeFunction(const LPCSTR sometext);
//在此处添加需要导出的函数的声明
//声明的形式如下
// type DLL_EXPORT funcName( arguments );
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__
// 源文件:
#include "main.h"
//一个导出函数的创建
void DLL_EXPORT simpleFunc()
{
MessageBoxA(0, "DLL", "DLL Message", MB_OK | MB_ICONINFORMATION);
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(
HINSTANCE hinstDLL, //当前载入的dll的模块句柄
DWORD fdwReason, //DllMain函数被调用的原因(四种)
LPVOID lpvReserved)//保留参数,现在无用
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH://dll在进程中第一次被载入
break;
case DLL_PROCESS_DETACH://dll从进程地址空间中被移除
break;
case DLL_THREAD_ATTACH://当进程中有新线程创建的时候
break;
case DLL_THREAD_DETACH://当进程中某一线程终止的时候
break;
}
return TRUE; //如果成功返回TRUE , 失败返回false
}
方法2、
使用 DEF 文件 。
为什么要使用def文件呢???
有两点:
1、使用def文件可以实现序号导出
2、使用ms的编译器的时候,当函数的调用约定为 __stdcall(WINAPI)的时候,
编译器会对 C函数名进行改编,改编的规则是在函数名前加一个前缀 ,在函数名后加一个 特殊的后缀 , 前缀就是一个下划线 “_” , 而后缀则是 一个 “@”符号加上一个数字 , 该数字表示函数参数的总字节数
例如
LPVOID funcName ( INT iArgument1,INT iArgument2,PVOID pArgument3 );
函数名为 funcName
改编后的函数名为 _funcName@12
12 = sizeof(INT)*2 + sizeof(PVOID) ;
而是用def文件的时候,当dll用于其它厂家的编译器的时候,就不会遇到函 数名改编的问题 (例如我现在是用的 code blocks),是用原始函数名就可以
导出
使用Def方式导出函数的时候,大致使用的也是上述的代码 ,不过在头文件中
#define DLL_EXPORT __declspec(dllexport) 这一句代码应该改为
#define DLL_EXPORT , 即取消 该关键字的使用 。
作为替代
现在来新建一个 *.def 文件 文件命名为 xxx.def 名称和工程名一致。
现在来书写 *.def 文件
*.def 文件常用的语法也不复杂 , 常用到的关键字就两个 LIBARY 和 EXPORTS
//*.def 文件
LIBRARY dLLName
EXPORTS
exportFuncName [@ordinal]/*导出序号*/ [NONAME]/*仅以序号方式导出*/
注:当指定NONAME的时候,dll中不包含函数名的字符串 , 函数仅仅以序号的方式导出 , 当导出函数很多,而且以序号方式导出的时候,有利于减小dll的体积
此时,调用 GetProcAddress 的方法是 :
GetProcAddress( handle , MAKEINTRESOURCE(ordinal) );
//利用 MAKEINTRESOURCE 这个宏
//#define MAKEINTRESOURCE MAKEINTRESOURCEA
// #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
更过def文件的规则此处不列出,可到以下网址查看
http://msdn.microsoft.com/zh-cn/library/28d6s79h(v=vs.80).aspx
3、还有一种方法:是用 export 开关,同样是用 __declspec(dllexport) 关键字, 但是在头文件
的开头处加上如下语句:
#pragma comment(linker, “/export:funcName = _funcName@12”)
很显然,这种方法非常烦,不建议使用
windows编程:创建DLL的更多相关文章
- C/C++:Windows编程—调用DLL程序的2种方法(转载)
文章为转载,原文出处https://blog.csdn.net/qq_29542611/article/details/86618902 前言先简单介绍下DLL.DLL:Dynamic Link Li ...
- [Windows编程] 开发DLL必读《Best Practices for Creating DLLs》
开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁. 这篇MSDN文章<Best Practices for Creating D ...
- windows下编写dll
dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...
- windows编程 进程的创建销毁和分析
Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...
- Windows编程总结之 DLL
+-- 版本 --+-- 编辑日期 --+-- 作者 -------------+ | V1. | | yin_caoyuan@.com | +----------+--------------+-- ...
- 【Windows编程】系列第六篇:创建Toolbar与Statusbar
上一篇我们学习了解了如何使用Windows GDI画图,该应用程序都是光光的静态窗口,我们使用Windows应用程序,但凡稍微复杂一点的程序都会有工具栏和状态栏,工具栏主要用于一些快捷功能按钮.比如典 ...
- 【Windows编程】系列第七篇:Menubar的创建和使用
上一篇我们学习了利用windows API创建工具栏和菜单栏,与上一篇紧密联系的就是菜单栏,菜单栏是一个大多数复杂一些的Windows应用程序不可或缺的部分.比如下图就是Windows自带的记事本的菜 ...
- 【Windows编程】系列第三篇:文本字符输出
上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接 ...
- MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型
1.1 Windows编程模型 为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行.例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身 ...
随机推荐
- eclipse使用外部maven时multiModuleProjectDirectory错误解决
错误提醒: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment vari ...
- 二分法习题HDU2199
AC代码 : #include<iostream>#include<cmath>using namespace std;double y;double f(double n){ ...
- uci随笔
UCI : Unified Configuration Interface1.基于nvram配置2.只需修改UCI配置文件3.配置文件存放在路径/etc/config/目录下4.可以通过uci命令或者 ...
- nefu 196 让气球飞吧
description 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛,ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成,一个队每做出来一个题该队就会获得该题对应颜色的气 ...
- Java Web项目发布及使用自定义域名
详细讲解的网址: http://wenku.baidu.com/link?url=-ACZxKUcfrbhrMRUP3Ov-Q_c-Q9JPrA9D1fzHjHuJsWwZfRsVDVQ2qBtoY7 ...
- easyui 动态渲染
$.parser.parse 这个 $("div[data-easyuisrc]").html(function () { var url = $(this).attr(&qu ...
- linux 进程监控和自动重启的简单实现
目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...
- 设计模式二 适配器模式 adapter
适配器模式的目的:如果用户需要使用某个类的服务,而这项服务是这个类用一个不同的接口提供的,那么,可以使用适配器模式为客户提供一个期望的接口.
- zabbix metrics
http://blog.csdn.net/hengyunabc/article/details/44072285
- CSS box-flex属性
http://www.zhangxinxu.com/wordpress/2010/12/css-box-flex属性,然后弹性盒子模型简介/ http://www.zhangxinxu.com/wor ...