DLL生成与使用的全过程
由dll导出的lib文件: 包含了每一个dll导出函数的符号名和可选择的标识号以及dll文件名,不含有实际的代码(这里的lib文件和静态库是不一样的),其中的导出导入函数都 是跳转指令,直接跳转到DLL中的位置。基于这样一句话可以看出在编译一个程序的时候,编译器先通过头文件知道要使用函数的格式,然后在lib文件中(这 里的lib文件名是可以随便更换的)查找这个函数在dll文件中的具体地址,从而知道这个函数的入口点。其次由于lib包含了dll文件名,所以在执行 exe程序的时候,dll文件的名称是不能更改的。
一、生成DLL
1.
新建DLL工程
生成DLL可以多种方法,这里介绍一种。在VS中,新建一个空的项目,选Win32
Console Application,新建完后修改工程属性:把生成EXE改为生成DLL
2.
源代码:
ShowInfo.h
- #ifdef SHOWINFO_EXPORTS
- #define SHOWINFO_API __declspec(dllexport)
- #else
- #define SHOWINFO_API __declspec(dllimport)
- #endif
- extern "C" SHOWINFO_API void fnShowInfo(void);
ShowInfo.c:
- #define SHOWINFO_EXPORTS
- #include "ShowInfo.h"
- #include <stdio.h>
- SHOWINFO_API void fnShowInfo(void)
- {
- printf("Crab\n");
- }
3.
编译连接,生成dll.dll文件
ps:
1.
特别要注意要在ShowInfo.c文件的开头加上#define SHOWINFO_EXPORTS
2.
在ShowInfo.h中声明函数的时候要加上 extern "C", 因为如果该函数可能会被c++ 程序调用。
二、
使用DLL
1.
新建工程
新建一个Win32 Console
Application,选择空的工程。
2.
源代码:
main.cpp
#include <windows.h>
#include <iostream>
using namespace std;
typedef
int main()
{
HINSTANCE
hInst = LoadLibrary(TEXT("ShowInfo.dll"));
if(hInst)
{
DllFn a =(DllFn) GetProcAddress(hInst,"fnShowInfo");
if(a)
a();
else
cout<<"ERROR on
GetProcAddress"<<endl;
FreeLibrary(hInst);
}
else
cout<<"Error on Load
library"<<endl;
}
ps:
a. 用 LoadLibrary 可能会出现 “不能将参数 1 从‘const char
[13]’转换为‘LPCWSTR’”的错误,这时需要用到TEXT()函数。
b.
由于用了LoadLibrary函数,所以dll的文件名可以改变,只要文件名和LoadLibrary中的参数一样,就可以了。
3. 将上面工程生成的dll.dll文件复制到此工程的目录下,保证源文件与DLL文件在同一目录下。如果生成的EXE文件要直接运行,则要保证EXE文件与DLL文件在同一目录下。
4.
编译连接,执行。
DLL生成与使用的全过程的更多相关文章
- DLL 生成与使用的全过程(2010-01-18 14:50:17)
转载自 水滴的博客http://blog.sina.com.cn/spiritofwater 个人学习用 转载▼ 分类: 技术 由dll导出的lib文件: 包含了每一个dll导出函数的符号名和 ...
- C# 利用BarcodeLib.dll生成条形码(一维,zxing,QrCodeNet/dll二维码)
原文:http://blog.csdn.net/kongwei521/article/details/17588825 首先效果: 一.下载BarcodeLib.dll 下载地址 :http://do ...
- C# 利用BarcodeLib.dll生成条形码
首先效果: 1:首先下载BarcodeLib.dll 下载地址 http://pan.baidu.com/share/link?shareid=2590968386&uk=2148890391 ...
- 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件
本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...
- C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
- 【转】C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
- 由动态库文件dll生成lib库文件
本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...
- python调取C/C++的dll生成方法
本文针对Windows平台下,python调取C/C++的dll文件. 1.如果使用C语言,代码如下,文件名为test.c. __declspec(dllexport) int sum(int a,i ...
- zxing.dll生成条码
引入zxing.dll using System; using System.Drawing; using ZXing.QrCode; using ZXing; using ZXing.Common; ...
随机推荐
- atoi()函数(转载)
atoi()函数 原型:int atoi (const char *nptr) 用法:#include <stdlib.h> 功能:将字符串转换成整型数:atoi()会扫描参数np ...
- 原生Jdbc操作Mysql数据库开发步骤
原生Jdbc操作Mysql数据库开发步骤 原生的Jdbc就是指,不使用任何框架,仅用java.sql包下的方法实现数据库查询等的操作. 下面是开发步骤: 1.导入数据库驱动包 ...
- mysql的索引问题分析
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #454545 } span. ...
- 我的前端故事----关于redux的一些思考
背景 我一个前端,今年第一份工作就是接手一个 APP 的开发...一个线下 BD 人员用的推广 APP,为了让我这个一天原生开发都没有学过的人能快速开发上线,于是乎就选择了 react-native ...
- Grails笔记三:完整的文件上传实例
文件上传在web应用中是比较普遍的,相对于使用jsp等技术实现文件上传,Grails的文件上传着实让人喜爱,因为极其简单,让人看一遍就容易轻松记住!不多说,实例如下: 假设已有一个名为uploadFi ...
- plsql developer 恢复默认布局界面
tools-preferences-appearance-(reset docking,reset toolbars)
- 关于mysql的Fetch Time 和 Duration Time
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt411 Stackowerflow 上关于这两个时间有人这样解释 Fetch ...
- 使用设置sa用户登录sql server2008
今天在net项目中添加数据库过程中出现了小问题,就是使用sql server身份验证没登录成功,经过一番调试,终于解决问题. 使用sa账户登录sql server 2008 的方法步骤如下: 1.首先 ...
- js实现换肤效果
一,js换肤的基本原理 基本原理很简单,就是使用 JS 切换对应的 CSS 样式表文件.例如导航网站 Hao123 的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 ...
- 标题:a++和++a的区别
以前我也是老搞不懂a++和++a的区别, 后来看了很多资料, 终于总结出来一条规律, 小白专用! 看完这个例子就懂了: 例1:$a = 8, 求 ++a + a++ - --a + a-- + ++a ...