`

VC2008如何生成及使用DLL(完整版)

 
阅读更多

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

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

建立VC Win32工程

 

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

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

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

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

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


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. // 得到当前DLL的版本号   
  2. MYDLLTEST_API UINT32  GetMyDllVerion( VOID )  
  3. {  
  4.  return  1234;  
  5. }  

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


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. MYDLLTEST_API  UINT32  GetMyDllVerion( VOID );  

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


文件内容:
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. LIBRARY  "MyDllTest"   
  2. EXPORTS   
  3. GetMyDllVerion  

8. 在项目属性中设置模块定义文件为刚才建立的symexport.def文件:

设置DLL的输出符号定义文件

9. 生成,可以得到一个MyDllTest.dll,使用Depends工具(VC6.0自带)可以查看这个DLL中包含了多少接口以及接口名:

 使用Depends工具查看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.  
  2. #include " MyDllTest.h"
      
  3. #include " windows.h"   
  4. #pragma comment(lib," MyDllTest.lib")   
  5.   
  6. int  WINAPI WinMain(__in  HINSTANCE  hInstance, __in_opt  HINSTANCE  hPrevInstance, __in_opt  LPSTR  lpCmdLine, __in  int  nShowCmd )  
  7. {  
  8.   
  9.  
  10.     GetMyDllVersion();  
  11.     return  0;  
  12. }  

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


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  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);  

 

 


·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. // 使用MD5接口   
  2. HINSTANCE  hDLL;  
  3. // MD5接口是在Cryptdll.dll中的   
  4. hDLL = LoadLibrary(TEXT("Cryptdll.dll" ));  
  5.   
  6. MD5Init_Tpye MD5Init;  
  7. MD5Update_Tpye MD5Update;  
  8. MD5Final_Tpye MD5Final;  
  9.   
  10. // 得到接口指针   
  11. MD5Init = (MD5Init_Tpye)GetProcAddress(hDLL, "MD5Init" );  
  12. MD5Update = (MD5Update_Tpye)GetProcAddress(hDLL, "MD5Update" );  
  13. MD5Final = (MD5Final_Tpye)GetProcAddress(hDLL, "MD5Final" );  
  14.   
  15. if  (!MD5Init || !MD5Update || !MD5Final)  
  16. {  
  17.   // 取得接口指针失败   
  18.   FreeLibrary(hDLL);  
  19.   return ;  
  20. }  
  21.   
  22. MD5_CTX md5_context;  
  23. MD5Init(&md5_context);  
  24. MD5Update(&md5_context, src, length);  
  25. MD5Final(&md5_context);  
  26.   
  27. // 不要忘记释放导入的DLL   
  28. FreeLibrary(hDLL);  

 

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

  • 大小: 33.1 KB
  • 大小: 95.1 KB
  • 大小: 56.8 KB
  • 大小: 72 KB
  • 大小: 99.7 KB
  • 大小: 78.8 KB
分享到:
评论

相关推荐

    (完整版)vc6.0编写DLL文件及vb调用示例.docx

    。。。

    VC6.0完整绿色免安装版 编译成功但是运行失败时所需要的几个动态库文件

    使用VC6.0完整绿色免安装版 可以正常编译但是运行出错,提示缺少动态链接库,此处将需要的dll库文件打包以方便兄弟们使用~ 包括: MFC42.DLL mfc42d.dll MFCN42D.DLL mfco42d.dll msvcrtd.dll 使用说明:可以将...

    黄历日期DLL 组件 支持Delphi VC VB 完全免费

    本组件对于个人使用完全免费,请在使用过程中遵守三方协议,如需应用商业,请联系作者! 本组件有完整的Delphi,VC和BCB调用例子,VB,.net,java也可以调用,这里就不给出例子了O(∩_∩)O 任何建议欢迎反馈 2009年...

    一步一步教你用VC和VB调用C++ DLL.

    一步一步教你用VC和VB调用C++ DLL,网上流传的大多是第一部分,‘从VC++应用程序调用C++ DLL的函数‘和’从VC++应用程序调用C++ DLL的类’,这个是完整的,包括 从VB应用程序调用C++ DLL的函数 从VB应用程序调用...

    一步一步教你用VC和VB调用C++ DLL 的源代码

    一步一步教你用VC和VB调用C++ DLL,网上流传的大多是第一部分,‘从VC++应用程序调用C++ DLL的函数‘和’从VC++应用程序调用C++ DLL的类’,这个是完整的,包括 从VB应用程序调用C++ DLL的函数 从VB应用程序调用...

    VC100的发行库dll.rar

    内含:IA64,x86,x64,Release,Debug, 各个版本都在,完整无误 ATL,CRT,MFC,MFCLOC,OPENMP

    teighafileconverter-qt5-vc10dll可执行安装包

    teighafileconverter_qt5_vc10dll包,可使用它进行CAD文件格式转换,支持CAD版本ASCII和二进制两种,版本支持R9、R10、R12、R13、R14、2000、2004、2007、 2010、2013、2018等版本的dwg与dxf直接互相转换,转换后的...

    (完整版)vc6.0编写DLL文件及vb调用示例.pdf

    。。。

    VC6LineNumberAddin

    将.dll及reg档copy至VC6.0所安装的文件内的MSDev98\AddIns。 2.reg档进行merge(有些VC6.0不许merge,直接放在此文件夹内即可) 3.开启VC至Tools -&gt; customize -&gt; Add-ins and Macro Files勾选VC6LineNumber ...

    vc对话框程序嵌入chrome浏览器

    mfc对话框程序中嵌入chrome浏览器,包含完整h、lib、dll。开始下载的最新版开发包CEF 3.3578.1864.gfa073f3,发现程序运行10几秒后,总是会弹出新窗口。后改用稳定版开发包cef3.2623.1401.gb90a3be,该问题得到解决...

    非常完整的VC运行库 windows安装版

    在用C#调用VC开发的动态链接库的时候提示无法加载DLL文件时,安装这个VC库就可解决

    TradeX.dll四合一交易接口用户参考手册 v1.1(2017) - 兼容 Trade.dll交易接口

    TradeX.dll四合一股票交易接口,包括股票下单接口和行情接口 版本描述: 1)完美兼容老版的交易接口Trade.dll所有功能、函数,支持批量下单,直连交易服务器,无中转; 2)支持Level 1 + Level 2 实时行情 +扩展...

    vc++ vc 视频会议系统完整版本

    完整的 vc+ 开发的视频会议系统 要用到的dll已经打包下载提供 里面包含使用介绍 以及源代码的介绍 开发结构 所有代码测试可以运行 包含功能完整 扩展性良好

    VC运行库合集完整版V2021.2.rar

    解决游戏用户打开软件出现msvcp120.dll问题

    vc6 sp6 plus 2010-01-20 part1

    本绿色版是基于原版VC6制作,并无任何精简,集成SP6,保留了原版的所有组件。 [+]表示增加的内容 [-]表示去除的内容 [*]表示所做的改动 1.改动说明: [+]增加VAX,WndTabs,VC6LineNumberAddin.dll(显示行号插件),...

    vc资源,使用curl、ssl和zlib下载源码

    之前写的使用libcurl.lib下载的网页源码使用的lib文件。 主要包括 libcur libeay32.lib ssleay32.lib nghttp2.lib libssh2.lib ...libcurl-vc12-x86-release-dll-ssl-dll-zlib-dll-ipv6-sspi 有需要的就取吧。

    VC6上经典的插件

    9. 不是VAX,VC6中只支持16中颜色,有一个插件可以修改为24位真彩色,完全可以自己定义。 网址:http://www.codeproject.com/macro/devtruecolour.asp 10.BCGControlBar Library 功能:非常好的一套应用于vc6的...

    密码学C语言函数库——Miracl库(VC)完整版

    编写密码安全方面程序必备的一个算法模板库miracl 这个是很完整的版本,解压后编译,可直接使用生成的dll文件。

    FileMoniter完整VC源码

    FileMoniter完整VC源码 基于文件过滤驱动写的,这份是完整版的。注意其中一个编译好的DLL可能会被杀毒软件报毒,不放心的话可以删除

    vc6 sp6 plus 2010-01-20 part2

    本绿色版是基于原版VC6制作,并无任何精简,集成SP6,保留了原版的所有组件。 [+]表示增加的内容 [-]表示去除的内容 [*]表示所做的改动 1.改动说明: [+]增加VAX,WndTabs,VC6LineNumberAddin.dll(显示行号插件),...

Global site tag (gtag.js) - Google Analytics