VC2008如何生成及使用DLL(图文并茂,完整版)
- 博客分类:
- Dot net VC2008 DLL
- Dot net
生成、使用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 LPSTRlpCmdLine, __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);
http://blog.sina.com.cn/s/blog_a401a1ea010174rr.html
VC2008如何生成及使用DLL(图文并茂,完整版)的更多相关文章
- VC2008如何生成及使用DLL(完整版)
生成.使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的. 1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目: 2. 应用程序类型选择DLL,附加选项选择到处符号 ...
- 《深入理解Android虚拟机内存管理》示例程序编译阶段生成的各种语法树完整版
1.tokens "int" "int" <SPACES> " &quo ...
- 在C#调用C++的DLL简析(一)——生成非托管dll
经过一晚上的折腾,还是下点决心将些许的心得写下来,以免以后重复劳动. C#与C/C++相 比,前者的优势在于UI,后者的优势在于算法,C++下的指针虽然恶心,若使用得当还是相当方便的,最重要的问题是, ...
- 在C#调用C++的DLL方法(一)生成非托管dll
C#与C/C++相比,前者的优势在于UI,后者的优势在于算法,C++下的指针虽然恶心,若使用得当还是相当方便的,最重要的问题是,市面上很多流行的开发工具库,几乎没有不支持C++的,但全面支持C#只能说 ...
- VS2015环境下生成和调用DLL动态链接库
一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_ge ...
- VS2013生成、使用dll,lib文件
VS2013生成DLL文件 vs2013创建及使用DLL 一般来说项目偏爱生成dll动态库文件,因为可以解决静态库造成的空间浪费和更新困难问题,另外创建静态库时,我一般是建立空项目后,在项目配置类型中 ...
- VS2013 C++ 生成与调用DLL(动态链接库) 需要验证
转载:https://blog.csdn.net/s978697043/article/details/82429802 一.创建动态链接库(生成.dll .lib 两个文件) 文件→新建→项目 选择 ...
- API文档生成(c# dll)
一.Sandcastle 这个是c#类库方法根据注释生成帮助文档的工具,我们经常会遇到把DLL或者API提供给别人调用的情况,通过在方法中添加注释,然后再用Sandcastle 来自动生成文档给调用者 ...
- PowerDesigner 12.5 汉化破解完整版
PowerDesigner 12.5 汉化破解完整版 分类: ⑦ 综合 2011-08-09 14:59 2979人阅读 评论(0) 收藏 举报 破解wizardsybasetoolsshell扩展 ...
随机推荐
- OC-nonatomic和atomic相关
1.原子和非原子属性1.1>OC在定义属性时又nonatomic和atomic两种选择(1)atomic:原子属性,为setter方法加锁(默认就是atomic)(2)nonatomic:非原子 ...
- STL之list(双向链表)
一,概述 List将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. list 不仅是一个双向链表,而且是一个环状双向链表 二,使用 #incl ...
- Log Collect
http://ossectools.blogspot.com/2011/03/comprehensive-log-collection.html https://www.hacking-lab.com ...
- app添加辅助功能时,需要注意的测试点
最近项目里需要在辅助功能添加对应的服务,来支持对应的功能实现: 1.对用户添加app进行信息管理功能中,该app有对应的通知或信息时在app的logo上显示提示标志. 2.用户下载一款app后能够自动 ...
- BZOJ 1622: [Usaco2008 Open]Word Power 名字的能量
题目 1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 349 Solved ...
- 警告:‘xxxx’ 将随后被初始化
关于编译报警告.本次是接手一个新手的代码,总共不到1K行的代码.两个类.编译的时候报的警告,本来也不打算管理这个事情的.要求也不会有那么严格.但上午看完代码后,觉得毕竟是新手写的代码,还是有很多需要修 ...
- android编程——百度地图初探
项目需要,花了一天时间研究了下百度地图的API,其实看起来可能会有点困难,但是将它的DEMO跑起来之后一切都迎刃而解的样子了.百度方面讲地图的接口封装的挺不错的,而且现在能够提供的地图的服务也有将近十 ...
- hdu 1242 Rescue(bfs)
此刻再看优先队列,不像刚接触时的那般迷茫!这也许就是集训的成果吧! 加油!!!优先队列必须要搞定的! 这道题意很简单!自己定义优先级别! +++++++++++++++++++++++++++++++ ...
- Linux编程---I/O部分
非常多函数都能够在网上找到,也比較基础,所以原型仅仅给出了函数名.详细用到再man吧. 输入输出是个非常重要的一块内容.差点儿网络相关的东西基本都是靠底层IO调用来实现的. 好吧.还是先踏踏实实的介绍 ...
- linux下的文件权限
在学习linux中,发现linux系统对文件的权限管理要比windows非常严格. linux下建立新的组:groupadd 组名 linux新建立用户:useradd username 创建用户并分 ...