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

1. 打开VS2008,新建一个VC工程,选择Win32类型,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文件:

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 LPSTRlpCmdLine, __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接口的使用:

·········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. 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);

http://blog.sina.com.cn/s/blog_a401a1ea010174rr.html

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

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

    生成.使用DLL看起来简单,但做起来才发现还是有一些地方需要注意的. 1. 打开VS2008,新建一个VC工程,选择Win32类型,Win32项目: 2. 应用程序类型选择DLL,附加选项选择到处符号 ...

  2. 《深入理解Android虚拟机内存管理》示例程序编译阶段生成的各种语法树完整版

    1.tokens "int"                   "int" <SPACES>                " &quo ...

  3. 在C#调用C++的DLL简析(一)——生成非托管dll

    经过一晚上的折腾,还是下点决心将些许的心得写下来,以免以后重复劳动. C#与C/C++相 比,前者的优势在于UI,后者的优势在于算法,C++下的指针虽然恶心,若使用得当还是相当方便的,最重要的问题是, ...

  4. 在C#调用C++的DLL方法(一)生成非托管dll

    C#与C/C++相比,前者的优势在于UI,后者的优势在于算法,C++下的指针虽然恶心,若使用得当还是相当方便的,最重要的问题是,市面上很多流行的开发工具库,几乎没有不支持C++的,但全面支持C#只能说 ...

  5. VS2015环境下生成和调用DLL动态链接库

    一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_ge ...

  6. VS2013生成、使用dll,lib文件

    VS2013生成DLL文件 vs2013创建及使用DLL 一般来说项目偏爱生成dll动态库文件,因为可以解决静态库造成的空间浪费和更新困难问题,另外创建静态库时,我一般是建立空项目后,在项目配置类型中 ...

  7. VS2013 C++ 生成与调用DLL(动态链接库) 需要验证

    转载:https://blog.csdn.net/s978697043/article/details/82429802 一.创建动态链接库(生成.dll .lib 两个文件) 文件→新建→项目 选择 ...

  8. API文档生成(c# dll)

    一.Sandcastle 这个是c#类库方法根据注释生成帮助文档的工具,我们经常会遇到把DLL或者API提供给别人调用的情况,通过在方法中添加注释,然后再用Sandcastle 来自动生成文档给调用者 ...

  9. PowerDesigner 12.5 汉化破解完整版

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

随机推荐

  1. javascript事件及事件传输

    函数必须调用才能执行,可a()加下面的函数调用 JS事件 1.js事件通常和函数结合来使用,这样可以通过发生的事件来驱动函数的执行,从而引起html出现不同的效果. 2.属性(当这些事件的属性发生时, ...

  2. 使用LiveWriter发布Orchard博客

    我们可以Windows Live Writer来发布Orchard博客 在Dashboard–> Modules菜单找到 Remote Blog Publishing 模块.点击 Enable ...

  3. 【监控】使用probe对tomcat服务进行监控

    1.运行环境(博主本地) JDK:jdk1.6 Tomcat:tomcat7 OS:Windows10 2.下载 点击下载 3.安装运行 1.解压,将probe文件夹复制放进tomcat里面的weba ...

  4. mac安装office2011,提示无法打开文件Normal.dotm,因为内容有错误

    最近使用mac上的office,发现一个问题,每次打开office11都会报错,提示“无法打开文件Normal.dotm,因为内容有错误”,于是就在网络上搜索了一下,找到如下一段话, I just f ...

  5. 一个分组查询 每组前 10 的sql 语句

    USE tmpgo CREATE TABLE Employee( ID int identity(1,1), EmpName varchar(20), EmpSalary varchar(10), E ...

  6. Web调试利器fiddler使用

    fiddler官网:http://fiddler2.com/ http://wenku.baidu.com/view/053e79d776a20029bd642dc1 http://www.cnblo ...

  7. Android Testing(1) 浅尝Android测试的奥秘

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 仅供学习和交流使用,翻译不好勿喷,请只摘除不合适的地方 Testing The Android fram ...

  8. Xcode 静态库调试策略

    Xcode 静态库调试策略  (已经有现成的工程和静态库源码)    ***** 为安全期间建议备份一下静态库 Step1: 下载最新的工程[工程中有所要测试的静态库和头文件需要删除]: Step2: ...

  9. DTM initialization: failure during startup recovery, retry failed, check segment status (cdbtm.c:1603)

    安装greenplum集群出现以下错误: 20160315:13:49:16:025696 gpinitsystem:h95:jason-[INFO]:-Checking configuration ...

  10. sublime快捷方式和node.js

    快捷方式具体见:http://blog.useasp.net/archive/2013/06/14/sublime-text-2-all-default-Shortcuts-table-on-wind ...