这些代码比较老了,只是参考一下dll的一个基本使用流程
动态链接库(dll)是包含共享函数库的二进制文件,可以被多个应用程序同时使用。建立应用程序的可执行文件时,不必将dll连接到应用程序中,而是在运行时动态装载dll,装载时dll被映射到调用进程的地址空间中。通常我们在调用dll时所需的dll文件必须位于以下三个目录之一:
——(1)windows的系统目录:\windows\system;
——(2)dos中path所指出的任何目录;
——(3)程序所在的目录;
一.动态链接库(dll)结构
——dll中定义有两种函数:导出函数(export function)和内部函数
(internal function),导出函数可以被其他模块调用,内部函数只能在dll内部使用。我们在用c++定制dll文件时,需要编写的就是包含导出函数表的模块定义文件(.def)和实现导出函数功能的c++文件。下面以sample.dll为例介绍def文件和实现文件的结构:
——1.模块定义文件(.def)是由一个或者多个用于描述dll属性的模块语
句组成的文本文件,每个.def文件至少必须包含以下模块定义语句:
第一个语句必须是library语句,指出dll的名字。
exports语句列出被导出函数的名字。
可以使用description语句描述dll的用途(此句可选)。
";"对一行进行注释(可选)
——2.实现文件(.cpp文件为例)
——实现入口表函数的.cpp文件中,包含dll入口点处理的api函数和导出
函数的代码。
二.创建sample.dll
——1.首先创建sample.dll的工程,启动vc++5.0按以下步骤生成dll工程:
在菜单中选择file\new\project
在工程列表中选择win32dynamic-linklibrary
在projectname中输入工程名:sample
单击location右边按钮,选择c:\sample目录
单击ok完成,至此已创建了sample.dll的工程文件
----2.创建sample.def文件
在菜单中选择file\new\textfile
输入以下完代码后保存文件名"sample.def"
;sample.def
;指出dll的名字sample,链接器将这个名
字放到dll导入库中
library sample
;定义导出函数showme()为例
exports
showme
;def文件结束
---- 3. 创 建sample.cpp
.在菜单中选择file\new\c++ source file项
.输入以下代码后保存文件名"sample.cpp"
//sample.cpp
#include < windows.h >
int showme(void);
//dllentrypoint为dll入口点函数,
负责初试化并终止dll
bool winapi dllentrypoint(hinstance
hdll,dword dwreason,lpvoid reserved)
<
switch(dwreason)
<
case dll_process_attach:
<
break;
>
case dll_process_detach:
<
break;
>
>
return true;
>
int showme(void)
<
//蜂鸣器响一下
messagebeep((word)-1);
messagebox("你好!");
return 1;
>
——4.编译dll文件——从 build 菜单中选择 buildsample.dll, 产生
sample.dll文件,以后就可以随时调用了。
三.在应用程序中调用dll文件
——在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc
创建基于对话框的工程test,并在对话框上放置"load"按钮,你就必须添加装载代码。----1.首先在testdlg.cpp的首部添加变量设置代码:
//设置全局变量glibsample用于存储dll句柄
hinstance glibsample=null;
//第二个变量showme是指向dll
库中showme()函数的指针
typedef int(* showme)(void);
showme showme;
2.利用classwizard为"load"按钮添加装载dll的代码
void ctestdlg::onloadbutton()
<
//要添加的代码如下
if(glibmydll!=null)
<
messagebox("the sample.dll has already been load.");
return;
>
//装载sample.dll,未加路径,将在三个默认路径中寻找
glibsample=loadlibrary("sample.dll");
//返回dll中showme()函数的地址
showme=(showme)
getprocaddress(glibsample,"showme");
//代码添加完毕
>
——3.只要dll装载成功,在应用程序中就可以直接调用showme()函数,此时已完成了定制和调用dll的全部过程。----本程序在windows95,vc++5.0中运行通过。
阅读(2777) | 评论(3) | 转发(0) |