DLL制作.docx
《DLL制作.docx》由会员分享,可在线阅读,更多相关《DLL制作.docx(21页珍藏版)》请在冰点文库上搜索。
DLL制作
实现MFC扩展DLL中导出类和对话框
中国学生网 2006-03-0307:
30:
11 作者:
江上飞鸟 来源:
vckbase
如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对话框。
一、创建MFC扩展DLL
步骤:
运行VisualStudio6.0->File->New...->Projects;
选择MfcAppWizard(dll),在右边Projectname下输入ExportClass,单击“下一步”;
选择MfcExtensionDLL(usingshareMFCDLL)单击“finish”;
以上完成建立扩展DLL的框架,下面接着建立输出类:
Insert->NewClass...在打开的对话框中,"ClassType"选择"GenericClass",ClassName中输入
CDogClass(当然你可以用其它的名称,我喜欢小狗,所有用它了,在"BaseClass"下输入CObject,然后"OK";
为类添加两个测试用的变量intm_nNum;CStringm_sData;完全的类信息如下:
DogClass.h头文件:
classCDogClass:
publicCObject
{
private:
intm_nNum;
CStringm_sData;
public:
intShowDlg();
voidInit();
CDogClass();
virtual~CDogClass();
voidSetNum(intnum){m_nNum=num;};
intGetNum(){returnm_nNum;};
voidSetData(CStringdata){m_sData=data;};
CStringGetData(){returnm_sData;};
};
DogClass.cpp实现文件:
CDogClass:
:
CDogClass()
{
Init();
}
CDogClass:
:
~CDogClass()
{}
voidCDogClass:
:
Init()
{
m_nNum=0;
m_sData="";
}
编辑DogClass.h头文件修改下面一行;classAFX_EXT_CLASSCDogClass:
publicCObject
以上完成类的建立,下面建立输出对话框;Insert->Resouce...新建立一个对话框,添加两个编辑框IDC_EDIT1,IDC_EDIT2,然后建立CDlgDog对话框类并为两编辑框添加intm_nNum和CStringm_sData的变量。
在DogClass.cpp的#include"DogClass.h"下加入#include"DlgDog.h"
在DogClass类中添加intShowDlg();函数用来调用对话框,并在intCDogClass:
:
ShowDlg()中添加如下代码:
CDlgDogdlg;
dlg.m_nNum=GetNum();
dlg.m_sData=GetData();
if(IDOK==dlg.DoModal())
{
SetNum(dlg.m_nNum);
SetData(dlg.m_sData);
return1;
}
return0;
然后编译Dll,会发现有几个错误,不用怕,好解决的,首先,去掉DlgDog.cpp中的#include“\addadditionalincludeshere”这一行;其次,在stdax.h中加入include"resource.h",再编译,OK。
二、建立DLL测试程序
步骤:
新建一个基于对话框的MFC应用程序,添加一按钮IDC_BUTTON1,并在按钮事件中添加如如下代码:
voidCTestExportClassDlg:
:
OnButton1()
{
CDogClassdog;
dog.Init();
if(dog.ShowDlg()!
=0)
{
CStringstr;
str.Format("Numis:
%dDatais:
%s"dog.GetNum(),dog.GetData());
AfxMessageBox(str);
}
}
从ExportClass文件目录拷贝DogClass.h和ExportClass.lib文件到测试程序目录下;
在TestExportClassDlg.cpp中加入#include“DogClass.h”行;往连接程序的导入库中添加ExportClass.lib,在VS的Project->Settings下的SettingFor选择AllConfiguration.,然后在下面的页面Object/LibraryConttrol中加入ExportClass.lib;
别忘了把ExportClass.dll复制到系统目录或当前应用程序目录;然后编译就OK了。
在VisualC++中建立MFC扩展DLL
减小字体
增大字体
在VisualC++中建立MFC扩展DLL 我们编写了一个扩展类的样例并将其封装在DLL中以向你演示该过程。
有经验的Windows编程人员都逐渐放弃了WindowsSDK,而转向能为Windows内置的低级机制提供高级抽象的开发环境。
这种转移的一个主要受益者是VisualC++,它依靠MFC库来提供WindowsAPI的面向对象的视图。
MFC是经验丰富的编程人员掌握的有力工具,但它离完美还相距甚远。
事实上,我所认识的以MFC编程为谋生手段的人都开发了他或她自己的扩展集合,他们以MFC类作为基础类来派生自己的类。
这毕竟是C++的威力。
如果某个类不能满足你的需求(而且如果它恰好可以作为设计的开始),你可以从它自由地派生新类并修改你不喜欢的部分。
假设你编写了一个MFC扩展集合,并愿意与公司的其它开发人员共享。
你该如何封装这些扩展呢?
你可以分发源代码文件或与VisualC++组件库(ComponentGallery)兼容的组件。
或许你可以象MFC那样在DLL中封装你的扩展。
就象传统的DLL能够导出函数一样,MFC扩展DLL可以导出类。
任何动态链接到MFCDLL的应用程序都能动态链接到MFC扩展DLL。
作为开发者,你只需使其包括必要的头文件并在应用程序的链接列表中添加DLL导入库。
编写MFC扩展DLL困难吗?
有了VisualC++和MFC的支持,这实际非常轻松。
本文解释了如何创建MFC扩展DLL来弥补MFC的CToolTipCtrl类的明显不足。
一旦意识到其简便性,你会忍不住亲自编写几个MFC的扩展。
编写MFC扩展DLL
从理论角度而言,MFC的CTool-TipCtrl类简化了将提示信息(ToolTip)与对话框的控件或窗口的任意区域相关联的过程。
(提示信息是当鼠标光标停滞于工具栏按钮或其它UI对象时弹出的小型帮助文本窗口。
)但有个问题尚待解决。
由于CToolTipCtrl:
:
AddTool不能自动成为提示信息依附的窗口的子类,因此鼠标事件必须手工转交给提示信息控制。
这通常意味着你必须自己给窗口建立子类。
如果你给CToolTipCtrl对象下的提示信息控制传送了正确的标志,它应该能给自己创建子类――这显然是被MFC设计组忽略的功能。
幸运的是,该疏忽并不难以纠正。
只要从CToolTipCtrl类中派生出一个类,用类似的函数代替CToolTipCtrl:
:
AddTool即可,该函数的TTM_ADDTOOL消息使用TOOLINFO结构,它的uFlags域中包含TTF_SUBCLASS标志。
更好的方式是用两个函数代替它:
它们分别给子窗口和矩形窗口区域添加提示信息。
AddTool函数同时支持两者,但在语法结构上创建提示信息的两种方法截然不同。
图1和图2显示了名为CToolTip-CtrlEx的CToolTipCtrl的派生类的源代码。
该派生类给它继承的内容添加了两个函数,其一CToolTipCtrl:
:
AddWindow将提示信息与子窗口相关联,其二AddRectangle使提示信息依附于窗口的矩形区域。
这两个函数都使用了TTF_SUBCLASS标志以使提示信息的创建过程尽可能简单。
假设m_tooltipCtrl是CToolTipCtrlEx对象,给控制ID为IDC_BUTTON的按钮添加提示信息就非常容易了:
m_tooltipCtrl.AddWindow(
GetDlgItem(IDC_BUTTON),
"Entertooltiptexthere!
");
如何将CToolTipCtrlEx类封装至DLL呢?
以下是在VisualC++4.x中的详细步骤:
1.启动VisualC++并通过从File菜单选择New来创建新项目,双击ProjectWorkspace。
在NewProjectWorkspace的Name框中输入“MfcExt”(不带引号)。
在Type框中选择MFCAppWizard(dll)。
然后点击Create按钮。
2.在AppWizard的Step1对话框中,通过在“WhattypeofDLLwouldyouliketocreate?
”项中选择“MFCExtensionDLL(usingsharedMFCDLL)”。
点击Finish按钮,然后点击OK产生DLL的初始代码。
注意“MFCExtensionDLL”后括弧中显示的“usingsharedMFCDLL”。
当你编写MFC扩展DLL时,不能选择静态链接至MFC。
DLL必须动态链接到MFC库。
3.弹出ClassWizard并点击AddClass按钮。
选择New打开CreateNewClass对话框。
在其中标有“Baseclass”的框中选择CToolTipCtrl,在标有“Name”的框中输入“CToolTipCtrlEx”。
使用Change按钮将文件名改为Tooltip.h和Tooltip.cpp。
(改变文件名并不是绝对必要的,我这样做是为了避免长文件名。
)不要选中“AddtoComponentGallery”框以节省磁盘空间。
点击Create命令ClassWizard执行类派生,而后点击OK退出ClassWizard。
4.如图2所示,给CToolTipCtrlEx类添加成员函数AddWindow和AddRectangle。
由于这两个函数要在CToolTipCtrlEx外被访问,因此确定它们都是public的。
技巧:
在VisualC++中给类添加成员函数的简便方法是在ClassView窗口中右击类名,并从快捷菜单中选择AddFunction。
5.在ClassView窗口中,双击CToolTipCtrlEx打开类的头文件。
在类说明的class关键字后添加AFX_EXT_CLASS(参见图1)。
6.建立项目。
你将产生两个重要文件:
DLL本身(Mfcext.dll)以及DLL的导入库(Mfcext.lib)。
导入库基本上是导出函数名的列表――或者,在本例中是一系列导出类。
链接至导入库使应用程序能使用从MFC扩展DLL中导出的类,就如同包含类的库是静态链接的一样。
与Mfcext.lib链接还使得Windows知道应用程序需要Mfcext.dll才能运行。
使用MFC扩展DLL
创建使用Mfcext.dll的应用程序是轻而易举的。
只要确保在使用CToolTipCtrlEx的每个类中包括Tooltip.h头文件,并且将Mfcext.lib添加至项目的链接库列表中即可。
然后CToolTipCtrlEx就可以象普通MFC类那样使用了。
当回答AppWizard的询问时一定要选择“AsasharedDLL”,这样你的应用程序才能动态链接至MFC。
你可以通过从VisualC++的Build菜单中选择Settings将Mfcext.lib添加至项目的链接列表中,点击Link标签并在标有“Object/librarymodules”的框中输入Mfcext.lib的路径(参见图3)。
ToolTest是作为样例的应用程序,它在对话框中显示一个按钮。
它动态链接至Mfcext.dll并使用CToolTipCtrlEx。
该应用程序是基于对话框的,dialog类包含名为m_tooltipCtrl的CToolTipCtrlEx成员变量。
对话框的OnInitDialog函数中的以下代码创建提示信息控制并给对话框的按钮设置提示信息:
m_tooltipCtrl.Creat(this);
m_tooltipCtrl.AddWindowTool(
GetDlgItem(IDC_EXIT),
"Clickheretoclose");
当光标停在按钮上时,提示信息窗口中显示“Clickheretoclose”。
点击该按钮可以关闭应用程序。
你可以从PCMagazineOnline()下载ToolTest和Mfcext.dll的完整源代码。
从主页左侧的菜单中选择Downloads,然后依次选择PCTechArchives和文件V16n15.zip。
CompuServe的Utilities/Tips论坛(GOZNT:
TIPS)上也有该文件。
我们的文件包含在该归档文件中。
使用PKUNZIP的-d开关解压文件(Mfcext.zip和Tooltest.zip),以便.ZIP文件中的目录也能一同被解压。
在运行ToolTest之前,将Mfcext.dll拷贝至Windows系统目录或Tooltest.exe所在的目录。
否则,当执行ToolTest时,Windows可能找不到Mfcext.dll。
如果你打算建立自己的Tooltest.exe版本,修改ProjectSettings对话框的“Object/librarymodules”框的路径名,使VisualC++能获悉在PC的何处寻找Mfcext.lib文件。
总结
创建MFC扩展DLL非常容易――只要你知道了该如何操作。
当你给其它开发人员分发MFC扩展DLL时,不要忘记提供描述DLL中类的头文件以及相应的.LIB文件和DLL本身。
此后开发人员就能充分利用你装配的扩展了。
VC++动态链接库编程之MFC扩展DLL
来源:
qqread 作者:
新书城收集整理 发布时间:
2006-12-23 人气:
268
前文我们对非MFCDLL和MFC规则DLL进行了介绍,现在开始详细分析DLL的最后一种类型――MFC扩展DLL。
6.1概论
MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。
MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。
MFC扩展DLL使用MFC动态链接库版本,因此只有用共享MFC版本生成的MFC可执行文件(应用程序或规则DLL)才能使用MFC扩展DLL。
从前文可知,MFC规则DLL被MFC向导自动添加了一个CWinApp的对象,而MFC扩展DLL则不包含该对象,它只是被自动添加了DllMain函数。
对于MFC扩展DLL,开发人员必须在DLL的DllMain函数中添加初始化和结束代码。
从下表我们可以看出三种DLL对DllMain入口函数的不同处理方式:
对于MFC扩展DLL,系统会自动在工程中添加如下表所示的宏,这些宏为DLL和应用程序的编写提供了方便。
像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA这样的宏,在DLL和应用程序中将具有不同的定义,这取决于_AFXEXT宏是否被定义。
这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意思。
在DLL中,表示输出(因为_AFXEXT被定义,通常是在编译器的标识参数中指定/D_AFXEXT);在应用程序中,则表示输入(_AFXEXT没有定义)。
6.2MFC扩展DLL导出MFC派生类
在这个例子中,我们将产生一个名为“ExtDll”的MFC扩展DLL工程,在这个DLL中导出一个对话框类,这个对话框类派生自MFC类CDialog。
使用MFC向导生成MFC扩展DLL时,系统会自动添加如下代码:
staticAFX_EXTENSION_MODULEExtDllDLL={NULL,NULL};
extern"C"intAPIENTRY
DllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserved)
{
//RemovethisifyouuselpReserved
UNREFERENCED_PARAMETER(lpReserved);
//说明:
lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零
if(dwReason==DLL_PROCESS_ATTACH)
{
TRACE0("EXTDLL.DLLInitializing!
\n");
//ExtensionDLLone-timeinitialization
if(!
AfxInitExtensionModule(ExtDllDLL,hInstance))
return0;
//InsertthisDLLintotheresourcechain
newCDynLinkLibrary(ExtDllDLL);
}
elseif(dwReason==DLL_PROCESS_DETACH)
{
TRACE0("EXTDLL.DLLTerminating!
\n");
//Terminatethelibrarybeforedestructorsarecalled
AfxTermExtensionModule(ExtDllDLL);
}