DLL学习开发笔记

一、生成DLL

1、用VC建立一个Win32DLL工程--DllTest,选上“导出符号”;

     具体如下 : file -> new -> <TAB>project -> Win32 Dynamic-link Library -> A DLL that exports some symbols.

     ->Finish

2、在DllTest.cpp中编写 导出函数fun(),这个函数是别的程序要调用的函数:

int fun(int i)

{

return i*i;

}

3、在DllTest.h中声明导出这个函数:

__declspec(dllexport) int fun(int i);

4、第三步也可以用DEF文件来指定要导出的函数,这样做可以在程序运行过程中显式的加载DLL。

      具体过程: 新建一个文本文档 然后输入如下内容:

EXPORTS

Fun    

再把这个文件重命名为DEF.def, 添加这个DEF文件到工程中.                                     

注: 关于在程序运行过程中显式的加载DLL见后面.

5、编译这个工程,生成DllTest.dll,同时也生成了DllTest.lib文件。这个文件是供程序开发用的导入库。 

二、调用DLL

调用DLL有两种方法:

装载期间动态链接--模块可以向调用本地函数一样调用从其他模块导出的函数。装载期间链接必须使用DLL的导入库,也就是.lib文件。它为系统提供了加载这个DLL和定位DLL中的导出函数所需要的信息。

运行期间动态链接--程序运行期间可以使用LoadLibrary加载这个DLL,然后调用GetProcAddress函数取得DLL导出函数的地址,然后通过函数地址调用DLL中的函数。

1、装载期间动态链接。

新建一个Win32 Console Application工程--DllApp。把刚才建立的那个工程中的DllTest.dll、DllTest.h和DllTest.lib拷贝到DllApp目录下。在DllApp.cpp文件中写入:

#include <windows.h>

#include <stdio.h>

#include "DllTest.h"

//要链接到的DllTest.lib库

#pragma comment(lib,"DllTest.lib")

void main()

{

int a = fun(2);

printf("The result is %d/n",a);

}

2、运行期间动态加载

新建一个Win32 Console Application工程--DllApp2。把建立的DllTest.dll拷贝到DllApp2目录中--一定要用在生成DLL部分按照第四步产生的DLL文件,否则程序无法运行。在DllApp2.cpp中写入:

#include <windows.h>
#include <stdio.h>

#pragma message("This is a test./n") //在编译的时候,会在debug区域中显示该字符串

typedef int (*PFUN)(int);//声明函数原型

void main()
{
 HINSTANCE hinstance = ::LoadLibrary("DllTest.dll");//加载DLL库
 PFUN newfun = (PFUN)::GetProcAddress(hinstance,"fun");//取得fun函数的地址
 //HMODULE hModule = ::LoadLibrary("DllTest.dll");//加载DLL库
 //PFUN newfun = (PFUN)::GetProcAddress(hModule,"fun");//取得fun函数的地址

 /*16位时候 用HMODULE,现在可以和HISTANCE互换了*/

 int i = newfun(2);
 printf("The result is %d/n",i);
 //::FreeLibrary(hModule);
 ::FreeLibrary(hinstance);
}

附:介绍dll比较好的网址

http://www.vckbase.com/document/viewdoc/?id=1116#sec3

http://www.cppblog.com/leetaolion/archive/2007/09/03/24882.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值