谁能给我编写一个简单的dll文件,实现一个简单的功能就行。把dll文件和相关调用这个dll的接口发给我
解决方案 »
- 求大牛拯救我,哭了,出现了The value of ESP was not properly saved across a function call错误。
- 结构体函数指针怎么声明啊?
- 多文档下的数字图像处理显示问题
- 求救MFC里的子菜单问题
- 用内存映射文件方法把整个文件映射到内存后却只能读出文件中的前面一部分数据,大虾请进!!!
- 为什么很简单的一个问题,能困扰我一天多了!
- 技术方案的选择
- 有谁知道如何在listctrl内显示的图标上覆盖上一个比原来小的图么?
- 我设了一个计时器,为什么在OnTimer中这样写不对?
- 谁帮我看个程序阿,我在程序里面找不到向combo添加的语句,但是程序一运行combo下拉后就有很多table名
- 内存位图移动问题
- 写光盘扇区
http://www.vckbase.com/document/viewdoc/?id=1667
[摘 要] 首先介绍了Visual C++ 6.0中动态链接库的制作和装载方法、步骤,然后介绍了动态链接库的动态调用和静态调用方法,并给出了相应的实例。Visual C++ 6.0( 以下简称VC)是一种可视化的面向对象的编程语言,以其编程高效、执行速度和对操作系统访问的权限之高,是其他许多语言难以比拟的,深受广大WINDOWS程序员的青睐。动态链接库(Dynamic-Link Library,简称DLL)是基于Windows程序设计的一个非常重要的组成部分, 是一个包含了若个函数的可执行模块,其实质是一个函数包,是应用程序在执行期间才被链接的函数集。DLL为不同编程环境下的应用程序间的连接提供了方便,节省了内存,提高了速度。
1 动态链接库的创建
(1)AppWizard向导创建MFC DLL应用程序的步骤
① 选择File|New|Projects,输入项目的名称(本例中为mfcdll)、位置、工作区等
② 选中MFC AppWizard(dll)
③ 选择要创建的DLL类型(本例为Regular Dll Using shared MFC DLL)以及是否具有
”Automation”特性支持
④ 点击Finish
(2)动态链接库制作过程
利用Visual C++ 6.0 AppWizard将自动创建一个包含基本要素的DLL框架,接着手工添加代码,
创建的动态链接库包含三个主要文件:实现文件(.cpp)、模块定义文件(.DEF)和原型函数文
件(.H)。下面通过创建一个求两个整数之和的动态链接库为例分别介绍一下这三种文件。
① 在.h文件中加入函数的原型
函数原型的功能是进一步声明调用函数的函数名和传递的参数,在mfcdll.h中添加动态链接库的函数原型如下:
//IntegerAdd为用户添加的函数原型声明,靠该函数实现两个整数的和
int IntegerAdd(int a,int b);
② 在.cpp文件中加入函数实现的代码
函数实现部分是给出函数的具体实现功能,它是动态链接库实现的主体部分,是整个创建过程的核心。添加动态链接库函数的实现代码如下:
//下面为用户添加的代码,它是两个整数求和函数IntegerAdd()的实现
int IntegerAdd(int a,int b)
{
return (a+b);
}
③在.def中给出输出的函数(即被其他应用程序调用的动态链接库(dll)函数)。AppWizard生成的.def文件中包含了DLL提供的关于DLL在Windows下运行的一些信息。在这个文件中定义了一些参数,包括DLL的名称和属性,还声明了从DLL中输出的函数。mfcdll.def 的内容如下:
; mfcdll.def : Declares the module parameters for the DLL.
LIBRARY "mfcdll"
DESCRIPTION 'mfcdll Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
;以下为用户手工填写的代码
IntegerAdd
在以上代码中,LIBRARY "mfcdll" 表示要建立的动态链接库(DLL)文件的名称为”mfcdll”,加在语句EXPORT后面的代码IntegerAdd表示可以被其他应用程序调用的动态链接库(DLL)函数。语句EXPORT表示其后面的函数都可以被与该动态链接库连接的EXE应用程序调用。
(3)动态链接库创建时应注意的问题
① 在动态链接库的DEF文件中,注释行的标志符和.cpp文件不一样,它是用分号”;”表示,而不是用双斜线”//”表示。
② 在选择Build/Build mfcdll.dll菜单命令之前,必须先逐个编译两个.cpp文件:StdAfx.cpp和mfcdll.cpp。
2 链接DLL到可执行程序
链接DLL到可执行程序有两种方式:隐式链接和显示链接。
① 隐式链接
隐式方法是将应用程序先链接到编译DLL时所生成的导入库lib文件,在执行应用程序时,系统也装载它所需要的DLL,这种方法在应用程序退出之前,DLL一起存在与该程序运行进程的地址空间中。使用隐式链接可以使用Project/Add To Project/Files…菜单项弹出的对话框来选择相应的LIB文件,也可以在Project/Settings…弹出的对话框来选择Link标签,在其中的”Object/Library Module” 输入指定的lib文件名。在应用程序编译链接时就可以找到这个导入库文件。
隐式链接时,使用DLL的可执行程序链接DLL到导入库(.LIB文件)中,操作系统为了隐式链接DLL,可执行程序需要从DLL提供者获取以下内容:包含导出函数(或C++类)声明的头文件(.h);导入库(.lib文件);实际的DLL(.dll文件)。
② 显示链接
显示方法是利用Windows API函数LoadLibrary 载入DLL并获取模块句柄,用GetProcAddress函数来获取应用程序要调用的导出函数的指针,使用完DLL后用FreeLibrary函数来卸载DLL,这种方法可以有效利用系统资源。
显示链接时的详细步骤:
定义一种存放函数地址的变量类型;
定义一个该类型的变量;
定义一个FARPROC类型的变量,用于存放GetProcAddress()的返回句柄;
定义一个HINSTANCE类型的变量,用于存放动态链接库的句柄;
调用LoadLibrary()函数,并将返回值赋给HINSTANCE类型的变量;
调用GetProcAddress()函数,并将返回值赋给FARPROC类型的变量;
将FARPROC类型的变量强制转换为(1)中的类型变量,然后调用动态链接库函数;
显示调用动态链接库函数的代码如下:
void CTestmfcdllDlg::OnOK()
{
// TODO: Add extra validation here
typedef int(*DRAW)(int ,int );
DRAW intadd;
FARPROC lpfn=NULL;
HINSTANCE hinst=NULL;
hinst=LoadLibrary("F:\\VCexam\\mfcdll\\Debug\\mfcdll.dll");
if (hinst==NULL)
{
AfxMessageBox("不能加载动态链接库");
return;
}
lpfn=GetProcAddress(hinst,"IntegerAdd");
intadd=(DRAW)lpfn;
if (lpfn==NULL)
AfxMessageBox("不能加载求和函数");
else
{ UpdateData(TRUE);
m_c=intadd(m_a,m_b);
UpdateData(FALSE);
}
}
系统在使用DLL时的查找路径:
如果不指定路径名,或是进行隐式链接,在运行一个调用DLL的应用程序时,系统查找目标DLL的路径顺序如下:
当前可执行文件所在的目录;
含有该应用程序文件所在的目录;
Windows的系统目录(system 或system32);
Windows 目录;
在环境变量PATH中列出的目录;
3 结束语
以上详细介绍了Visual C++ 6.0环境下制作动态链接库以及调用动态链接库的方法、步骤,并通过实例给出了具体实现过程。在程序设计过程中有了动态链接库,在建立应用程序的可执行文件时,不必将DLL链接到程序中,而是在运行时动态装载DLL,装载时DLL被映射到进程的地址空间中。由此可以减少程序对内存和磁盘的要求。DLL不仅可以包含可执行代码,还可以有数据、各种资源,扩大了库文件的使用范围。本文介绍的方法具有广泛的意义,也完全适用于其他 语言程序
1、新建项目——MFC DLL——MFC扩展DLL2、写导出宏
# ifdef _***_DLL_EXPORT_
# define ***_API __declspec(dllexport)
# else
# define ***_API __declspec(dllimport)
# endif 3、属性——C/C++——预处理器——预处理器定义:中加入_***_DLL_EXPORT_4、在需要导出的类或函数的定义文件中引入导出宏所在的头文件
在需要导出的类或函数前加宏
class ***_API 类名{}
参数名 ***_API 函数名()5、函数参数为指针或引用时,要用typedef将指针或引用类型重定义
如:
int* fun()
转换为:
typedef int* PINT
PINT ***_API fun() 6、将别人需要使用的文件放在固定的文件夹中,便于调用:.lib文件——lib文件夹,.h文件——include文件夹7、需要使用的资源ID尽量不在.h文件中使用,这样就不需要在使用dll的项目中导入dll项目的资源使用:
1、把需用到的dll项中的头文件(包括导出宏所在的头文件)和本项目的头文件放一起,或直接用绝对路径引用2、把dll项目的dll文件放在本项目的运行目录下3、属性——C/C++——常规——附件包含目录:中添加lib文件所在目录4、在需要时include dll项的头文件
建议自己多动手实践
建议自己多动手实践