DLL学习开发笔记
2007-09-02 11:27
197 查看
一、生成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
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
相关文章推荐
- IOS开发学习笔记(九)——iOS App开发阶段调试步骤
- cocos2d-x游戏开发学习笔记
- 2011斯坦福大学iOS应用开发教程学习笔记(第八课)viewController生命周期
- ios开发学习笔记(这里一定有你想要的东西,全部免费)
- java微信获取access_token(java微信开发学习笔记4)
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第九课: Cocos2D-X引擎框架4
- java微信自定义菜单(java微信开发学习笔记5)(完)(整个项目的源代码在最后)
- Android开发学习笔记,修改Activity名称后,导致程序打开该Activity时异常退出
- Rest API 开发 学习笔记
- Python简单爬虫开发的学习笔记整理(爬取百度百科词条)
- iOS开发学习笔记二:UITableView(1)
- 《疯狂Workflow讲义——基于Activiti的工作流应用开发》学习笔记之一·环境搭建之编码问题
- IOS开发学习笔记034-UIScrollView-xib实现分页
- android 学习笔记(二)Ubuntu 11.04 搭建Android开发环境
- 【学习笔记】Struts2 应用开发步骤
- java 大数据学习笔记(一)并行开发
- R/3 ABAP开发学习笔记---网摘
- Silverlight学习笔记:第一章:Silverlight3.0开发工具和开发实践
- iOS开发学习笔记1
- 【学习笔记javascript设计模式与开发实践----1】