(转)BCB如何编写,调用动态链接库DLL

上传人:gu****n 文档编号:108253609 上传时间:2022-06-15 格式:DOCX 页数:8 大小:19.98KB
收藏 版权申诉 举报 下载
(转)BCB如何编写,调用动态链接库DLL_第1页
第1页 / 共8页
(转)BCB如何编写,调用动态链接库DLL_第2页
第2页 / 共8页
(转)BCB如何编写,调用动态链接库DLL_第3页
第3页 / 共8页
资源描述:

《(转)BCB如何编写,调用动态链接库DLL》由会员分享,可在线阅读,更多相关《(转)BCB如何编写,调用动态链接库DLL(8页珍藏版)》请在装配图网上搜索。

1、(转)BCB如何编写,调用动态链接库DLL一 编写动态链接库DLL DLL简称动态链接库,是Windows中程序的重要组成部分。想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个模块。问题来了:如何将模块组合并成一个完整系统?还有,我们开发的软件需要不断升级,如何升级?难道每次非得把整个工程重新编译一次再发布给用户吗?解决这些问题的科学办法,就是开发动态链接库DLL。 现在以开发myDLL.dll动态链接库为例,讲讲BCB中开发动态链接库的方法。1、新建立一个工程:File-New-Other.在New卡中选择DLL Wizard

2、2、将工程存为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 paramete

3、r 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 wh

4、ich 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 c

5、har / * 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

6、 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(vo

7、id) 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,再在里面

8、设置好版权信息6、现在可以进入Project-Build myDLL生成myDLL.dll和myDLL.lib这两个文件。二 静态调用动态链接库DLL 调用DLL有两种方式,一种是静态调用,另一种就是动态调用。静态调用需要LIB库文件和DLL文件,程序编译时,需要用到LIB文件,发布时这个LIB文件就不再需要,而且,编译系统时,这个动态链接库已编译进程序,这样,在程序一开始运行时就会查找这个DLL文件,如果这个DLL文件不存在,那么,程序是启动不起来的。相反,动态调用DLL则不是这样,它只需要DLL文件,程序运行时,程序不需要知道这个DLL文件当前是否存在,只有当程序运行到某个点,才需要去调用

9、DLL文件多个应用程序调用DLL时,DLL 在内存中只产生一个实例,因此,可以有效地节省内存空间,提高系统的运行效率。注意到,DLL 的编制与编程语言无关,只要遵守DLL的接口规范,许多语言都可以开发出高效的DLL程序,其它语言开发的DLL,同样可以在BCB中调用。 下面介绍以myDLL.dll为例静态调用DLL的步骤:1、将myDLL.dll和myDLL.lib文件拷入到新建的开发工程中,FORM上放置两个Button。注意到,应用程序发布时,这个lib文件是不需要的。如果是其它语言开发的DLL,在没有lib文件的情况下,可以用implib.exe工具程序,生成一个lib文件,用法:impl

10、ib.exe 文件名.lib 文件名.DLL 2、Project-Add to project将myDLL.lib库导入到工程。如果要从工程中清除库文件,方法有两种:a、Project-Remove from projectb、View-Project Manager 3、在工程的Unit1.cpp中写程序代码:/-#include #pragma hdrstop#include Unit1.h/-#pragma package(smart_init)#pragma resource *.dfmTForm1 *Form1;extern C _declspec(dllimport) _stdca

11、ll 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) Sh

12、owMessage(aboutMe();/-三 动态调用动态链接库DLL动态调用DLL函数可分为八步:第一步:函数定义。这里的函数为地址转换函数。下面这个函数其实就是定义 int _stdcall myAdd(int,int); int _stdcall (*myAdd)(int,int);第二步:定义模块句柄,全局变量,它是载入DLL文件后的实例 HINSTANCE HmyDLL;第三步:装入DLL文件,同时获得它的句柄 HmyDLL=LoadLibrary(myDLL.dll);第四步:定义函数地址变量 FARPROC P;第五步:获取动态链接库内的某一函数的内存地址P=GetProcAd

13、dress(HmyDLL,myAdd);第六步:强制类型转换,即将所获取的函数地址强制转换为函数myAdd=(int _stdcall (_cdecl *)(int,int)P; 第七步:函数调用n=myAdd(10,20);第八步:释放DLL FreeLibrary(HmyDLL);下面以动态调用myDLL.dll函数为例,进行讲解:/-#include #pragma hdrstop#include Unit1.h/-#pragma package(smart_init)#pragma resource *.dfmTForm1 *Form1;/第一步:函数定义。这里的函数为地址转换函数。下

14、面这个函数其实就是定义 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:Button1Cli

15、ck(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 ShowMessag

16、e(打开动态链接库文件myDLL.dll错误!); /-void _fastcall TForm1:FormDestroy(TObject *Sender)/第八步:释放DLL FreeLibrary(HmyDLL);/-void _fastcall TForm1:Button2Click(TObject *Sender) FARPROC P; if(HmyDLL!=NULL) P=GetProcAddress(HmyDLL,aboutMe); if(P=NULL) ShowMessage(打开aboutMe()函数错误!); else aboutMe=(AnsiString _stdcall (_cdecl *)(void)P; ShowMessage(aboutMe(); else ShowMessage(打开动态链接库文件myDLL.dll错误!); /-注意:动态调入myDLL.dll文件后,它在内存中只存在一个副本,这时,动态链接库文件已于关闭状态。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!