VC2008如何生成及使用DLL(完整版)
1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目:
2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。
3. 工程生成后需要修改属性,在配置属性的常规选项中将MFC的使用修改为“静态库中使用MFC”。
注意,这一步是必须的,否则写出来的DLL将需要在有VC2008的环境上才能运行。
4. 关注自动生成的文件MyDllTest.cpp,其中有几个实例,可以将他们删除,也可以不管他们。
5. 添加自己的接口,如:GetMyDllVersion
- // 得到当前DLL的版本号
- MYDLLTEST_API UINT32 GetMyDllVerion( VOID )
- {
- return 1234;
- }
6. 在头文件MyDllTest.h中添加声明
- MYDLLTEST_API UINT32 GetMyDllVerion( VOID );
7. 添加导出符号定义文件,理论上是可以不要导出定义的,但是那样的结果就是生成的DLL中的符号名字不明确,只有定义了导出符号,才可以使得DLL中的借口函数名称得以确定。(关于def与dll 请参阅msdn)
- LIBRARY "MyDllTest"
- EXPORTS
- GetMyDllVerion
8. 在项目属性中设置模块定义文件为刚才建立的symexport.def文件:
9. 生成,可以得到一个MyDllTest.dll,使用Depends工具(VC6.0自带)可以查看这个DLL中包含了多少接口以及接口名:
会发现除了我们定义的借口GetMyDllVersion外还有几个??开头的接口,他们就是那些没有在模块定义文件中定义的借口自动生成的。
10. 除了DLL外我们还会发现生成了MyDllTest.lib文件,这个lib文件可以在其他的程序使用这个DLL的时候将其连接进去,同时只要包含MyDllTest.h即可调用这个DLL中的借口了。
如何引入dll
方法一.装载期间动态加载。(需要lib和dll)
1。新建Win32应用程序空项目。
2。把生成的dll、lib这2个文件复制到新建的目录下。
3。添加导入库:工具--项目和解决方案(vs里是options)--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。
4。头文件:MyDllTest.h(与编写DLL中一样)
5。源文件:main.c
可注释#pragma comment(lib," MyDllTest.lib")这条,但必须设置链接库,方法:
右击项目--属性--配置属性--链接器--输入--附加依赖项: MyDllTest.lib
- #include " MyDllTest.h"
- #include " windows.h"
- #pragma comment(lib," MyDllTest.lib")
- int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
- {
- GetMyDllVersion();
- return 0;
- }
方法二:运行期间动态加载。(只需Dll文件即可)
需要使用 Windows API 函数: LoadLibrary 、 GetProcAddress 以及 FreeLibrary
#include <iostream>
#include <windows.h>
using namespace std;
//定义FunctionFunc为指向一个返回值为int型 无参数的函数的指针
typedef int (*FunctionFunc)();
int main()
{
FunctionFunc _FunctionFunc;
//加载目标Dll
HMODULE hModule = ::LoadLibrary (TEXT("D:\MyDllTest.dll"));
if (hModule==NULL)//如果Dll加载失败,释放它占用的资源
{
::FreeLibrary(hModule);
}
//取得目标Dll中导出函数的地址(提醒:函数名就是函数的入口地址)
_FunctionFunc=(FunctionFunc)::GetProcAddress (hModule,"GetMyDllVersion");
if (_FunctionFunc==NULL)
{
::FreeLibrary (hModule);
}
int a =_FunctionFunc();
cout<< a<<endl;
::FreeLibrary(hModule);
cin.get();
return 1;
}
有时候我们拿到的是别人的DLL和头文件,但是却没有LIB文件,这时就要使用另外的方法调用DLL中的接口了,例如MD5接口的使用:
- // 按照MSDN中的说明定义函数原型如下
- typedef struct
- {
- ULONG i[2];
- ULONG buf[4];
- unsigned char in[64];
- unsigned char digest[16];
- } MD5_CTX;
- typedef void (CALLBACK* MD5Init_Tpye)(MD5_CTX* context);
- typedef void (CALLBACK* MD5Update_Tpye)(MD5_CTX* context,
- unsigned char * input,
- unsigned int inlen);
- typedef void (CALLBACK* MD5Final_Tpye)(MD5_CTX* context);
- // 使用MD5接口
- HINSTANCE hDLL;
- // MD5接口是在Cryptdll.dll中的
- hDLL = LoadLibrary(TEXT("Cryptdll.dll" ));
- MD5Init_Tpye MD5Init;
- MD5Update_Tpye MD5Update;
- MD5Final_Tpye MD5Final;
- // 得到接口指针
- MD5Init = (MD5Init_Tpye)GetProcAddress(hDLL, "MD5Init" );
- MD5Update = (MD5Update_Tpye)GetProcAddress(hDLL, "MD5Update" );
- MD5Final = (MD5Final_Tpye)GetProcAddress(hDLL, "MD5Final" );
- if (!MD5Init || !MD5Update || !MD5Final)
- {
- // 取得接口指针失败
- FreeLibrary(hDLL);
- return ;
- }
- MD5_CTX md5_context;
- MD5Init(&md5_context);
- MD5Update(&md5_context, src, length);
- MD5Final(&md5_context);
- // 不要忘记释放导入的DLL
- FreeLibrary(hDLL);
这就是目前我知道的两种使用DLL的方法了,至于还有没有其他的方法,暂时没有这方面的需求,也就不去花脑力想了。。。
VC2008如何生成及使用DLL(完整版)的更多相关文章
- VC2008如何生成及使用DLL(图文并茂,完整版)
博客分类: Dot net VC2008 DLL Dot net 生成.使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的. 1. 打开VS2008,新建一个VC工程,选择Win32类型 ...
- PowerDesigner 12.5 汉化破解完整版
PowerDesigner 12.5 汉化破解完整版 分类: ⑦ 综合 2011-08-09 14:59 2979人阅读 评论(0) 收藏 举报 破解wizardsybasetoolsshell扩展 ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- C#.Net 上传图片,限制图片大小,检查类型完整版
C#.Net 上传图片,限制图片大小,检查类型完整版 源代码: 处理图片类,如检查图片大小,按宽度比例缩小图片 public class CImageLibrary{ public enum Va ...
- MySQL5.6 Replication主从复制(读写分离) 配置完整版
MySQL5.6 Replication主从复制(读写分离) 配置完整版 MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTI ...
- Android照片墙完整版,的完美结合LruCache和DiskLruCache
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章其中,我们学习了DiskLruCache的概念和基本使用 ...
- rip路由协议 细节分析及实例配置【完整版】
rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...
- Asp.NET Core2.0 项目实战入门视频课程_完整版
END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...
- spring aop中pointcut表达式完整版
spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @with ...
随机推荐
- Django模板-模板标签
接着Django模板-基础知识继续写模板相关知识. if标签 {% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ). 但是不允许在同一个 ...
- JQuery DataTables Editor---页面内容修改&&数据库信息修改 (2)
接上篇博文,详细说一下js代码以及JQuery DataTables Editor---页面内容修改&&数据库信息修改遇到的问题和解决办法. 1.关于dialog 初始化: $(&qu ...
- 在Linux上怎么安装和配置DenyHosts工具
使用DenyHosts能够进行自动屏ip的功能,掌握DenyHosts在Linux系统中的安装是很有必要的,那么在Linux系统中要如何安装DenyHosts工具呢?安装后又要如何配置呢?这都是用户需 ...
- js返回当前时间的毫秒数
Date.now(); +new Date(); new Date().getTime();
- android应用开发全程实录-你有多熟悉listview
http://blog.csdn.net/notice520/article/details/7040962 今天给大家带来<android应用开发全程实录>中关于listview和ada ...
- Spring、编码剖析Spring管理Bean的原理
引入dom4j jar包 1.新建Person接口和PersonBean public interface PersonIService { public void helloSpring(); } ...
- hdu 5591 ZYB's Game
Problem Description ZYB played a game named NumberBomb with his classmates ,N] in mind,then players ...
- 解密yii中CModule::_components和CModule::_componentConfig
array CModule::_components 所有组件对象(CComponent的子类)将作为键值存在该数组中, 键名是定义该组件时使用的键名.例如: protected function r ...
- 关于oracle的certview
前两天去参加oracle 11g 的两门考试(1Z0-051和1Z0-052),在家看了好几遍题库,我本来想着上午一门,下午考一门,但是我嫌着麻烦,就预约一下午考完两门.在考试完一门后,发现成绩不 ...
- 自己主动更新--下载apk以及提示对话框的实现(3)
下载apk以及提示对话框的实现 一.步骤: 1. 确定有能够更新的版本号,对话框提醒用户是否进行更新. 2. 选择更新的话,显示下载对话框而且进行下载.否则关闭提示更新对话框. 3. Apk下载完毕后 ...