生成、使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的。

1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目:

2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。

3. 工程生成后需要修改属性,在配置属性的常规选项中将MFC的使用修改为“静态库中使用MFC”。

注意,这一步是必须的,否则写出来的DLL将需要在有VC2008的环境上才能运行。

4. 关注自动生成的文件MyDllTest.cpp,其中有几个实例,可以将他们删除,也可以不管他们。

5. 添加自己的接口,如:GetMyDllVersion

  1. // 得到当前DLL的版本号
  2. MYDLLTEST_API UINT32  GetMyDllVerion( VOID )
  3. {
  4. return  1234;
  5. }

6. 在头文件MyDllTest.h中添加声明

  1. MYDLLTEST_API  UINT32  GetMyDllVerion( VOID );

7. 添加导出符号定义文件,理论上是可以不要导出定义的,但是那样的结果就是生成的DLL中的符号名字不明确,只有定义了导出符号,才可以使得DLL中的借口函数名称得以确定。(关于def与dll 请参阅msdn)

  1. LIBRARY  "MyDllTest"
  2. EXPORTS
  3. 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

  1. #include " MyDllTest.h"
  2. #include " windows.h"
  3. #pragma comment(lib," MyDllTest.lib")
  4. int  WINAPI WinMain(__in  HINSTANCE  hInstance, __in_opt  HINSTANCE  hPrevInstance, __in_opt  LPSTR  lpCmdLine, __in  int  nShowCmd )
  5. {
  6. GetMyDllVersion();
  7. return  0;
  8. }

方法二:运行期间动态加载。(只需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接口的使用:

  1. // 按照MSDN中的说明定义函数原型如下
  2. typedef   struct
  3. {
  4. ULONG  i[2];
  5. ULONG  buf[4];
  6. unsigned char  in[64];
  7. unsigned char  digest[16];
  8. } MD5_CTX;
  9. typedef   void  (CALLBACK* MD5Init_Tpye)(MD5_CTX* context);
  10. typedef   void  (CALLBACK* MD5Update_Tpye)(MD5_CTX* context,
  11. unsigned char * input,
  12. unsigned int  inlen);
  13. typedef   void  (CALLBACK* MD5Final_Tpye)(MD5_CTX* context);
  1. // 使用MD5接口
  2. HINSTANCE  hDLL;
  3. // MD5接口是在Cryptdll.dll中的
  4. hDLL = LoadLibrary(TEXT("Cryptdll.dll" ));
  5. MD5Init_Tpye MD5Init;
  6. MD5Update_Tpye MD5Update;
  7. MD5Final_Tpye MD5Final;
  8. // 得到接口指针
  9. MD5Init = (MD5Init_Tpye)GetProcAddress(hDLL, "MD5Init" );
  10. MD5Update = (MD5Update_Tpye)GetProcAddress(hDLL, "MD5Update" );
  11. MD5Final = (MD5Final_Tpye)GetProcAddress(hDLL, "MD5Final" );
  12. if  (!MD5Init || !MD5Update || !MD5Final)
  13. {
  14. // 取得接口指针失败
  15. FreeLibrary(hDLL);
  16. return ;
  17. }
  18. MD5_CTX md5_context;
  19. MD5Init(&md5_context);
  20. MD5Update(&md5_context, src, length);
  21. MD5Final(&md5_context);
  22. // 不要忘记释放导入的DLL
  23. FreeLibrary(hDLL);

这就是目前我知道的两种使用DLL的方法了,至于还有没有其他的方法,暂时没有这方面的需求,也就不去花脑力想了。。。

VC2008如何生成及使用DLL(完整版)的更多相关文章

  1. VC2008如何生成及使用DLL(图文并茂,完整版)

    博客分类: Dot net VC2008 DLL Dot net   生成.使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的. 1. 打开VS2008,新建一个VC工程,选择Win32类型 ...

  2. PowerDesigner 12.5 汉化破解完整版

    PowerDesigner 12.5 汉化破解完整版 分类: ⑦ 综合 2011-08-09 14:59 2979人阅读 评论(0) 收藏 举报 破解wizardsybasetoolsshell扩展 ...

  3. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  4. C#.Net 上传图片,限制图片大小,检查类型完整版

    C#.Net 上传图片,限制图片大小,检查类型完整版 源代码: 处理图片类,如检查图片大小,按宽度比例缩小图片 public class CImageLibrary{   public enum Va ...

  5. MySQL5.6 Replication主从复制(读写分离) 配置完整版

    MySQL5.6 Replication主从复制(读写分离) 配置完整版 MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTI ...

  6. Android照片墙完整版,的完美结合LruCache和DiskLruCache

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/34093441 在上一篇文章其中,我们学习了DiskLruCache的概念和基本使用 ...

  7. rip路由协议 细节分析及实例配置【完整版】

    rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...

  8. Asp.NET Core2.0 项目实战入门视频课程_完整版

    END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...

  9. spring aop中pointcut表达式完整版

    spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @with ...

随机推荐

  1. phpcms在自定义模块中的自定义标签分页

    如果你是一个经验丰富的phpcms二次开发人员,本篇文章可以忽略不计,因为这里的写法自己都觉得很恶心        今天在开发一个网站自建了一个模块叫做论坛模块,目录名称:luntan        ...

  2. jQuery学习-事件之绑定事件(七)

    今天来说说事件中的handlers方法中的一个片段  1 matches[ sel ] = handleObj.needsContext ?  2     jQuery( sel, this ).in ...

  3. ECO

    ECO(生态环保的简写) 在与环保相关的概念和资料中,ECO 是ECOLOGICAL的缩写,用来表示生态环保的意思.与之相关产生了一些新的名词,尤其是在房地产楼书中常常被提及,如: ECO-HOME, ...

  4. WampServer下如何实现多域名配置

    原文:WampServer下如何实现多域名配置 之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心 ...

  5. Android 给Button加个监听

    1.日期设置控件:DatePickerDialog 2.时间设置控件:TimePickerDialog 实例代码 1.页面添加两个Button,单击分别显示日期设置控件和时间设置控件,还是有TextV ...

  6. Facebook有两名重要经理离职 有一位将加入阿里

    据报道,Facebook将有两名重要经理离职,分别是领导视频广告产品的产品经理和企业沟通团队经理. 这是该仍在迅速增长的公司最新的人员离职情况.Facebook计划今年大幅扩张人员规模. 知情人士称, ...

  7. Struts2 四、Struts2 处理流程

    1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可 ...

  8. docker端口映射设置

    摘自 Docker学习笔记(3)-- 如何使用Dockerfile构建镜像 # 映射一个端口 EXPOSE port1 # 相应的运行容器使用的命令 docker run -p port1 image ...

  9. Objective-C 内存管理之 _ARC

    内存管理之 ARC 和 自己主动释放池 一.ARC 中的变量全部权修饰符 变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个: _ ...

  10. 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

    前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://ove ...