CBuilder建立及调用DLL.doc_第1页
CBuilder建立及调用DLL.doc_第2页
CBuilder建立及调用DLL.doc_第3页
CBuilder建立及调用DLL.doc_第4页
CBuilder建立及调用DLL.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+Builder建立及调用DLLDLL简称动态链接库,是Windows中程序的重要组成部分。想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个模块。问题来了:如何将模块组合并成一个完整系统?还有,我们开发的软件需要不断升级,如何升级?难道每次非得把整个工程重新编译一次再发布给用户吗?解决这些问题的科学办法,就是开发动态链接库DLL。现在以开发myDLL.dll动态链接库为例,讲讲BCB中开发动态链接库的方法。1、新建立一个工程:File-New-Other.在New卡中选择DLL Wizard2、将工程存为myDLL.bpr3、在myDLL.cpp中写接口代码:/-#include #include #pragma hdrstop/-/ Important note about DLL memory management when your DLL uses the/ static version of the RunTime Library:/ If your DLL exports any functions that pass String objects (or structs/ classes containing nested Strings) as parameter or function results,/ you will need to add the library MEMMGR.LIB to both the DLL project and/ any other projects that use the DLL. You will also need to use MEMMGR.LIB/ if any other projects which use the DLL will be performing new or delete/ operations on any non-TObject-derived classes which are exported from the/ DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling/ EXEs to use the BORLNDMM.DLL as their memory manager. In these cases,/ the file BORLNDMM.DLL should be deployed along with your DLL./ To avoid using BORLNDMM.DLL, pass string information using char * or/ ShortString parameters./ If your DLL uses the dynamic version of the RTL, you do not need to/ explicitly add MEMMGR.LIB as this will be done implicitly for you/-extern C _declspec(dllexport) _stdcall int myAdd(int,int);extern C _declspec(dllexport) _stdcall AnsiString aboutMe(void);int add(int n1,int n2);#pragma argsusedint WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) return 1;/-_declspec(dllexport) _stdcall int myAdd(int n1,int n2)int T;T=add(n1,n2);return T;int add(int n1,int n2)return n1+n2;_declspec(dllexport) _stdcall AnsiString aboutMe(void)return 曾棕根好你个大笨蛋,居然现在才学会用DLL!半年前施勇强就告诉了你呀!研究进度太慢!;4、需要注意的是,在编写DLL这样的程序时,要力求简单,少用大量内存分配,尽量按照标准C的程序设计方法,以模块化结构设计为好,少采用面向对象的程序设计方法。5、进入Project-Options: 勾掉Linker页中的Use Dynamic RTL 勾掉Packages页中的Build with runtime packages 按一次Compiler中的Release按钮 在Version Info页中勾选Include version information in project,并勾选Auto-increment build number,再在里面设置好版权信息6、现在可以进入Project-Build myDLL生成myDLL.dll和myDLL.lib这两个文件。二 静态调用动态链接库DLL调用DLL有两种方式,一种是静态调用,另一种就是动态调用。静态调用需要LIB库文件和DLL文件,程序编译时,需要用到LIB文件,发布时这个LIB文件就不再需要,而且,编译系统时,这个动态链接库已编译进程序,这样,在程序一开始运行时就会查找这个DLL文件,如果这个DLL文件不存在,那么,程序是启动不起来的。相反,动态调用DLL则不是这样,它只需要DLL文件,程序运行时,程序不需要知道这个DLL文件当前是否存在,只有当程序运行到某个点,才需要去调用DLL文件多个应用程序调用DLL时,DLL 在内存中只产生一个实例,因此,可以有效地节省内存空间,提高系统的运行效率。注意到,DLL 的编制与编程语言无关,只要遵守DLL的接口规范,许多语言都可以开发出高效的DLL程序,其它语言开发的DLL,同样可以在BCB中调用。下面介绍以myDLL.dll为例静态调用DLL的步骤:1、将myDLL.dll和myDLL.lib文件拷入到开发工程中,注意到,应用程序发布时,这个lib文件是不需要的。如果是其它语言开发的DLL,在没有lib文件的情况下,可以用implib.exe工具程序,生成一个lib文件,用法:implib.exe 文件名.lib 文件名.DLL2、Project-Add to project将myDLL.lib库导入到工程。如果要从工程中清除库文件,方法有两种:a、Project-Remove from projectb、View-Project Manager3、在工程的Unit1.cpp中写程序代码:/-#include #pragma hdrstop#include Unit1.h/-#pragma package(smart_init)#pragma resource *.dfmTForm1 *Form1;extern C _declspec(dllimport) _stdcall int myAdd(int,int);extern C _declspec(dllimport) _stdcall AnsiString aboutMe(void);/-_fastcall TForm1:TForm1(TComponent* Owner) : TForm(Owner)/-void _fastcall TForm1:Button1Click(TObject *Sender) int n; n=myAdd(1,2); ShowMessage(IntToStr(n);/-void _fastcall TForm1:Button2Click(TObject *Sender)ShowMessage(aboutMe(); /-三 动态调用动态链接库DLL动态调用DLL函数可分为八步:第一步:函数定义。这里的函数为地址转换函数。下面这个函数其实就是定义 int _stdcall myAdd(int,int); int _stdcall (*myAdd)(int,int);第二步:定义模块句柄,全局变量,它是载入DLL文件后的实例 HINSTANCE HmyDLL;第三步:装入DLL文件,同时获得它的句柄HmyDLL=LoadLibrary(myDLL.dll);第四步:定义函数地址变量 FARPROC P;第五步:获取动态链接库内的某一函数的内存地址 P=GetProcAddress(HmyDLL,myAdd);第六步:强制类型转换,即将所获取的函数地址强制转换为函数 myAdd=(int _stdcall (_cdecl *)(int,int)P;第七步:函数调用 n=myAdd(10,20);第八步:释放DLLFreeLibrary(HmyDLL);下面以动态调用myDLL.dll函数为例,进行讲解:/-#include #pragma hdrstop#include Unit1.h/-#pragma package(smart_init)#pragma resource *.dfmTForm1 *Form1;/第一步:函数定义。这里的函数为地址转换函数。下面这个函数其实就是定义 int _stdcall myAdd(int,int);int _stdcall (*myAdd)(int,int);AnsiString _stdcall (*aboutMe)(void);/第二步:定义模块句柄,全局变量,它是载入DLL文件后的实例HINSTANCE HmyDLL;/-_fastcall TForm1:TForm1(TComponent* Owner) : TForm(Owner)/第三步:装入DLL文件,同时获得它的句柄HmyDLL=LoadLibrary(myDLL.dll);/-void _fastcall TForm1:Button1Click(TObject *Sender) int n; /第四步:定义函数地址变量 FARPROC P; if(HmyDLL!=NULL) /第五步:获取动态链接库内的某一函数的内存地址 P=GetProcAddress(HmyDLL,myAdd); if(P=NULL) ShowMessage(打开myAdd()函数错误!); else /第六步:强制类型转换,即将所获取的函数地址强制转换为函数 myAdd=(int _stdcall (_cdecl *)(int,int)P; /第七步:函数调用 n=myAdd(10,20); ShowMessage(IntToStr(n); else ShowMessage(打开动态链接库文件myDLL.dll错误!); /-void _fastcall TForm1:FormDestroy(TObject *Sender)/第八步:释放DLLFreeLibrary(HmyDLL);/-void _fastcall TForm1:Button2Click(TObject *Sender)FARPROC P;if(HmyDLL!=NULL) P=GetProcAddress(HmyDLL,aboutMe); if(P=NULL) ShowMessage(打开abo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论