1、/ static version of the RunTime Library:/ 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#pragma argsuseddouble dblValue(double);double halfValue(double);/extern _declspec(dllexport)/double changeValue(double, boo
2、l);extern C _declspec(dllexport) double _stdcall changeValue(double, bool);double dblValue(double value) return value * value;double halfValue(double value) return value / 2.0;_declspec(dllexport) double _stdcall changeValue(double value, bool whichOp) return whichOp?dblValue(value):halfValue(value)
3、;int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) return 1;在工程上右键build,即可生成dll和对应的lib使用BCB File|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。1DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL
4、;2在程序中加入自己所要创建的DLL过程、函数;3用dllimport描述出口;注意:动态链接库中调用过程、函数时有不同的CALL方式 _cdecl、 _pascal, _fastcall、_stdcall,BCB中默认的方式为_cdecl(可不写),如果考虑兼容性可用时_stdcall声明方法为:对于其中过程函数定义为:二、使用DLL在BCB中使用DLL有两种方法:1用静态调用法首先需要在BCB的项目中加入输入接口库(import library),由dll产生,方法如下,在cmd窗口中运行如下命令,得到*.lib.implib *.lib *.dll /*是具体的文件名也可以用:tlib
5、*.lib *.lst产生dll的内部函数列表。若dll由自己编写则可以直接采用dll工程build后的dll和lib文件。1. 打开工程项目,使用BCB View|Project Manager打开项目列表,向项目中加入接口库(*.lib)。(这种方法有时候不成功,多编译几次,或者采用反复取消和勾选lib文件的方法尝试多次编译,如下:或者采用在cpp文件件加入以下语句导入lib:#pragma comment(lib, .Project1.lib) /此方法比较可靠加入dll对应的lib文件。2.其次在头文件中加入接口声明(dllimport)导入dll函数。例程序如下:TForm1 *Fo
6、rm1;/#pragma comment(lib, )/语句式导入lib,比较可靠! _declspec(dllimport) double _stdcall changeValue(double, bool);_fastcall TForm1:TForm1(TComponent* Owner) : TForm(Owner)void _fastcall TForm1:Button1Click(TObject *Sender) ShowMessage(FloatToStr(changeValue(2,true);注意:(1)动态链接库调用过程、函数时CALL方式与创建时方式一样不写为_cdecl
7、,其它需要声明。(2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB的implib工具产生:implib xxx.lib xxx.dll;另外可用:tlib xxx.lib,xxx.lst 产生DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。2动态调用法动态调用法要用Windows API 中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函数位置,这种方法较常见。 HINSTANCE dd; int _stdcall (*ddd)(void); dd=LoadLibrary
8、(“xxx.dll”); ddd=GetProcAddress(dd,“test”); Caption=IntToStr(ddd();FreeLibrary(dd);另一个实例: HINSTANCE hHandle; double _stdcall (*DllFunc)(double, bool); hHandle=LoadLibrary(.Project1.dll); DllFunc=(double (_stdcall *)(double, bool)GetProcAddress(hHandle,changeValue ShowMessage(FloatToStr(DllFunc(2,tru
9、e); FreeLibrary(hHandle);三、注意:创建DLL时编译链接时注意设置Project Options: 1)Packages标签:去除Builder with runtime packages检查框。2)Linker标签:去除Use dynamic RTL检查框。否则创建的DLL需要Runtime packages或Runtime library。动态调用dll源代码BCB如何编写,调用动态链接库DLL一 编写动态链接库DLLDLL简称动态链接库,是Windows中程序的重要组成部分。想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块
10、,团队每一个成员开发一个模块。问题来了:如何将模块组合并成一个完整系统?还有,我们开发的软件需要不断升级,如何升级?难道每次非得把整个工程重新编译一次再发布给用户吗?解决这些问题的科学办法,就是开发动态链接库DLL。现在以开发myDLL.dll动态链接库为例,讲讲BCB中开发动态链接库的方法。1、新建立一个工程:File-New-Other.在New卡中选择DLL Wizard2、将工程存为myDLL.bpr3、在myDLL.cpp中写接口代码:/-/ Important note about DLL memory management when your DLL uses the stati
11、c 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
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1