`

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调试卡死补丁dm.dll TLLOC.DLL

    总的来说,"VC6调试卡死补丁dm.dll TLLOC.DLL"是一个针对性的解决方案,旨在帮助用户在Windows 10系统上继续使用VC6进行开发和调试,而不受卡死和无响应问题的困扰。通过理解补丁的作用和可能的原因,开发者可以更...

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

    本教程将详细介绍如何使用Microsoft Visual C++ 6.0(简称VC6.0)来创建DLL文件,并展示如何在Visual Basic(VB)中调用这些DLL中的函数。 首先,创建DLL文件的过程分为以下几个步骤: 1. **创建新工程**:在VC6.0...

    vc2008动态链接库使用(视频) 隐式导入dll

    本主题将深入探讨“vc2008动态链接库使用(视频) 隐式导入dll”这一主题。 隐式导入是将DLL的功能直接集成到可执行文件中的一种方式。在隐式导入时,开发者需要通过以下步骤来实现: 1. **定义接口**:首先,你...

    VC安装排错SHSQL.DLL EESWT.DLL NMSQL.DLL

    ### VC安装排错SHSQL.DLL EESWT.DLL NMSQL.DLL 在进行VC++6.0 English Professional版本的安装过程中,可能会遇到与SHSQL.DLL、EESWT.DLL以及NMSQL.DLL这三个DLL文件相关的错误。本文将详细介绍这些问题的原因以及...

    解决vs2008建立vc控制台应用程序时,出现“没有找到msvcr90d.dll”的错误,并且闪一下就没了的情况

    在使用Visual Studio 2008 (VS2008) 开发VC++控制台应用程序时,有时会遇到一个常见的问题:程序运行时提示“没有找到msvcr90d.dll”的错误,而且应用程序窗口会瞬间关闭,即“闪一下就没了”。这个错误通常与动态...

    vc2008支持库

    这个支持库包含了运行时环境、动态链接库(DLLs)和其他必要的组件,使得在没有安装完整版Visual Studio 2008的计算机上也能正常执行由VC2008编译的程序。 **一、运行时环境** VC2008支持库的核心部分是C++运行时...

    使用vc7编写的程序所需要的相关的dll

    为了方便部署,可以使用Microsoft的红石(Redistributable)包,这些包包含了所有必要的运行时组件,允许用户在没有安装完整Visual Studio的情况下运行程序。 在开发过程中,为避免依赖问题,开发者可以选择静态...

    vc运行库2014完全版

    2014年完全版的VC运行库集成了自2014年前的所有版本,确保了对各种老程序的支持,特别是那些依赖早期版本库的软件。 **1. Visual C++简介** Visual C++是微软开发的一款集成开发环境,用于编写使用C++语言的应用...

    vc2008运行库

    【VC2008运行库】是微软Visual C++ 2008编译器所生成应用程序必须依赖的运行环境,它包含了运行许多基于VC++ 2008开发的软件所必需的动态链接库(DLL)文件。这些库文件提供了如C++标准库、MFC(Microsoft ...

    VC6静态链接库(LIB文件)的创建、使用

    1. **添加引用**:在新的或者现有的项目中,需要使用这个库,首先需要在"项目" -&gt; "设置" -&gt; "链接"选项卡下的"输入"部分,添加刚才生成的LIB文件的完整路径。 2. **包含头文件**:在需要使用库的源文件中,通过`#...

    VC如何调用DLL文件.doc

    ### VC如何调用DLL文件 #### 一、概述 动态链接库(Dynamic Link Library,简称DLL)是微软公司在Microsoft Windows操作系统中实现共享函数库概念的一种实作方式。这些库函数和数据可以由多个程序共享使用,而且在...

    常用软件运行库 v1.5 集VC2005库和VC2008库等运行库

    标题中的“常用软件运行库 v1.5 集VC2005库和VC2008库等运行库”是指一个包含了多种常用软件运行所必需的动态链接库(DLL)的集合,主要涵盖了微软Visual C++ 2005(VC2005)和Visual C++ 2008(VC2008)的运行时库...

    VC_redist.x64

    这个安装程序主要是用来部署Visual C++的运行时库,使得用户能够在没有完整Visual Studio环境的计算机上运行由VC++编译的软件。 首先,我们来了解一下"msvcr100.dll"。这是微软Visual C++ 2010运行时库的一部分,...

    teighafileconverter-qt5-vc10dll可执行安装包

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

    未安装VC时运行debug版所需dll

    "未安装VC时运行debug版所需dll"这个主题涉及到的是,在没有安装Visual C++(VC)开发环境的情况下,尝试运行编译为调试版本(Debug版)的程序可能遇到的问题。 Visual C++是一个用于开发Windows应用程序的集成开发...

    完美版hostlink协议dll 3.2版VB、VC、delphi使用例程和软件手册

    这个“完美版hostlink协议dll 3.2版VB、VC、delphi使用例程和软件手册”包含了在不同编程环境下,如Visual Basic(VB)、Visual C++(VC)和Delphi中使用Hostlink协议进行开发所需的所有资源。 首先,让我们深入...

    boost_date_time-vc100-mt-1_49.dll

    至于压缩包内只有一个文件"boost_date_time-vc100-mt-1_49.dll",这通常意味着用户可能需要这个特定的DLL来解决某些程序的依赖问题,或者为了在不安装完整Boost库的情况下使用日期时间功能。如果用户遇到“找不到...

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

    本教程将详细介绍如何使用VC6.0创建一个DLL文件,并演示如何在VB(Visual Basic)中调用该DLL的函数。 首先,我们创建DLL项目。在VC6.0中,通过“文件”菜单选择“新建”,然后在“工程”选项中选择“Win32 Dynamic...

    VC90动态库vc++2008中所需要的dll免安装

    在描述中提到的“VC90动态库vc++2008中所需要的dll免安装”指的是一个集合,其中包含了这些必要的库文件,用户可以直接下载并放置到系统中,以便于运行依赖这些库的程序,而无需完整安装Visual C++ 2008。...

Global site tag (gtag.js) - Google Analytics