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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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 函数: LoadLibraryGetProcAddress 以及 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的方法了,至于还有没有其他的方法,暂时没有这方面的需求,也就不去花脑力想了。。。

vc2008中ProEssentials控件使用 VC2008中,利用第三方控件ProEssentials绘制曲线比较合适,数据分析简单。本程序用到的ProEssentials控件是Gigsoft pego v7(Graph Object ):Graph Control有X轴和Y轴两个坐标,X轴通常定义数据的时间节点,Y轴显示数值信息; 阅读详情

相关推荐

VS或VC调用matlab程序dll路径配置及错误分析

vc6.0版本的 1:在matlab中选择compiler。      在命令行窗口输入:mex -setup       按照提示选择vc6.0.由于使用的是matlab7,不识别vs2010和2008,无奈有装的vc6.0。但听说最新版的matlab可以识别。 2:选择builder.    输入:mbuild -setup    同样选择vc6.0

shitao827194819的专栏 7019

MFC的应用程序,调用常规dll

MFC的应用程序,调用常规dll,规则。MFC 调用dll

vs2008创建DLL

使用vs2008创建dll的源代码,从这个例子中可以学习怎样创建dll,内有详细说明文档

VS2008创建dll,并使用dll

原来一直使用vc6.0做开发,但是公司主要使用vs2008工具,刚开始使用的时候感觉非常不好用,但是一周下来,不禁感叹,还是新的好啊,嘿嘿! 这里总结一下vs2008下创建dll使用dll导出函数的方法,当然方法还有很多,找出一个自己比较习惯的方法就好! 一:生成DLL 1:创建DLL工程 文件->新建->项目->visu...

weixin_33842304的博客 370

VS2008 生成DLL文件的方法、引用dll文件以及意义

一 VS2008生成dll文件的方法    有两种方法:    1:傻瓜式操作    打开VS2008,依次点击:菜单->文件->新建项目->项目类型visual C#(这里假设为该项目所取的名字是DllBuild)->类库(注意必须是类库),即新建一个由纯.cs 类库文件组成的程序集,写好代码之后(例如写了一个名为DllTest.cs的类,该类的namespace取名为DllTest

vbvbvbvbvb的专栏 2543

转载:动态库的创建与使用(带贴图)

转载地址:http://xuzinuo.com/archives/217  文章介绍了动态库的创建和引用的一种方法。 VS2008动态链接库(DLL)的创建与导入 一、创建新的动态链接库(DLL)项目 从“File”菜单中,选择“New”,然后选择“Project…”。 如下图:在“项目类型”窗格中,选择“Visual C++”下的“Win32”。在“模板”窗格中,选择“Win

春夜喜雨的专栏 1229

VS2008创建和使用dll

一、DLL的创建 创建项目->Win32->Win32项目,名称:MyDLL->选择DLL 1、新建头文件testdll.h创建函数用到的相关定义声明的头文件,其实就是你的所用的函数的头文件复制过来就可以了。 testdll.h代码如下: #ifndef TestDll_H_ #define TestDll_H_ #ifdef MYLIBDLL #define MYLIBDLL ex

gaofeidongdong的专栏 1368

vc2008动态链接库(Dll)Demo

代码包含创建dll工程和调用dll工程的Demo,标有消息的注释,对初学者很有帮助

VC++ exe工程转DLL工程方法

VC++ exe工程转换为Dll工程除了.dsp文件需要转换外,代码部分也需要做相应的代码屏蔽,否则不能运行。

VC2008何生成使用DLL

 生成使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的。1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目: 2. 应用程序类型选择DLL,附加选项选择到处符号,公共头文件不要选择,然后点完成即可。3. 工程生成后需要修改属性,在配置属性的常规选项中将MFC的使用修改为“静态库中使用MFC”。    注意,这一步是必须的,否则写出来的

技海淘金 1万+

部署VC2008应用程序

如果你编译了一个VC2008的默认的CRT/MFC的应用程序,如果目标部署电脑上没有安装相应的VC2008的动态库,当运行你的程序的时个,会出现如下错误信息. 这是因为程序使用了基于VC2008的CRT/MFC的动态库版本.解决这个问题,有三种方法:1.使用静态链接库编译(缺点,生成的exe的程序过于庞大)2.使用vcredist_x86.exe / vcredist_x64.

JonnyLai 4758

VC2008/CLR 下静态调用自写的DLL

    两三天了,这个问题一直困扰着我,铛铛铛的报错也听习惯,难道我的人生真就这么失败吗?    进入正题:VC2008/CLR程序下是可以静态调用自写DLL,只要有dll.h/dll.lib/dll.dll这三个文件就可以方便的调用。关键是这三个文件要真的很规范。尤其是头文件。我把例子代码放出。只有两个工程文件。dll.h和dll.cpp/////////////////////////////////////////////////////////////////////////////////////

逍遥斩舞的专栏 1523
上一篇: DirectX SDK 各版本开发包下载地址合集
下一篇: android开发问题汇总(持续更新中)
linking530
博客等级 码龄17年 72粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值