C++Builder中dll的写法及静态动态调用Word文档格式.docx
- 文档编号:15691972
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:17
- 大小:185.50KB
C++Builder中dll的写法及静态动态调用Word文档格式.docx
《C++Builder中dll的写法及静态动态调用Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++Builder中dll的写法及静态动态调用Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
//staticversionoftheRunTimeLibrary:
//………………………………
//IfyourDLLusesthedynamicversionoftheRTL,youdonotneedto
//explicitlyaddMEMMGR.LIBasthiswillbedoneimplicitlyforyou
#pragmaargsused
doubledblValue(double);
doublehalfValue(double);
//extern__declspec(dllexport)
//doublechangeValue(double,bool);
extern"
C"
__declspec(dllexport)double_stdcallchangeValue(double,bool);
doubledblValue(doublevalue)
{
returnvalue*value;
};
doublehalfValue(doublevalue)
returnvalue/2.0;
}
__declspec(dllexport)double__stdcallchangeValue(doublevalue,boolwhichOp)
returnwhichOp?
dblValue(value):
halfValue(value);
intWINAPIDllEntryPoint(HINSTANCEhinst,unsignedlongreason,void*lpReserved)
return1;
在工程上右键build,即可生成dll和对应的lib
使用BCBFile|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。
1.DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;
参数:
hinst用来指示DLL的基地址;
reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;
2.在程序中加入自己所要创建的DLL过程、函数;
3.用dllimport描述出口;
注意:
动态链接库中调用过程、函数时有不同的CALL方式__cdecl、__pascal,__fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),如果考虑兼容性可用时__stdcall声明方法为:
对于其中过程函数定义为:
二、使用DLL
在BCB中使用DLL有两种方法:
1.用静态调用法
首先需要在BCB的项目中加入输入接口库(importlibrary),由dll产生,方法如下,在cmd窗口中运行如下命令,得到*.lib.
implib***.lib***.dll//***是具体的文件名
也可以用:
tlib***.lib***.lst
产生dll的内部函数列表。
若dll由自己编写则可以直接采用dll工程build后的dll和lib文件。
1.打开工程项目,使用BCBView|ProjectManager打开项目列表,向项目中加入接口库(*.lib)。
(这种方法有时候不成功,多编译几次,或者采用反复取消和勾选lib文件的方法尝试多次编译,如下:
或者采用在cpp文件件加入以下语句导入lib:
#pragmacomment(lib,"
..\\Project1.lib"
)//此方法比较可靠
加入dll对应的lib文件。
2.其次在头文件中加入接口声明(dllimport)导入dll函数。
例程序如下:
TForm1*Form1;
//#pragmacomment(lib,"
)//语句式导入lib,比较可靠!
!
__declspec(dllimport)double__stdcallchangeValue(double,bool);
__fastcallTForm1:
:
TForm1(TComponent*Owner)
:
TForm(Owner)
void__fastcallTForm1:
Button1Click(TObject*Sender)
ShowMessage(FloatToStr(changeValue(2,true)));
注意:
(1)动态链接库调用过程、函数时CALL方式与创建时方式一样不写为__cdecl,其它需要声明。
(2)BCB创建的DLL有对应的输入接口库(importlibrary),如只有DLL而无库时,可用BCB的implib工具产生:
implibxxx.libxxx.dll;
另外可用:
tlibxxx.lib,xxx.lst产生DLL的内部函数列表,许多Windows的未公开技术就是用这种方法发现的。
2.动态调用法
动态调用法要用WindowsAPI中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函数位置,这种方法较常见。
HINSTANCEdd;
int_stdcall(*ddd)(void);
dd=LoadLibrary(“xxx.dll”);
ddd=GetProcAddress(dd,“test”);
Caption=IntToStr(ddd());
FreeLibrary(dd);
另一个实例:
HINSTANCEhHandle;
double_stdcall(*DllFunc)(double,bool);
hHandle=LoadLibrary("
..\\Project1.dll"
);
DllFunc=(double(_stdcall*)(double,bool))GetProcAddress(hHandle,"
changeValue"
ShowMessage(FloatToStr(DllFunc(2,true)));
FreeLibrary(hHandle);
三、注意:
创建DLL时编译链接时注意设置ProjectOptions:
1)Packages标签:
去除Builderwithruntimepackages检查框。
2)Linker标签:
去除UsedynamicRTL检查框。
否则创建的DLL需要Runtimepackages或Runtimelibrary。
动态调用dll源代码
BCB如何编写,调用动态链接库DLL
一编写动态链接库DLL
DLL简称动态链接库,是Windows中程序的重要组成部分。
想象一下,一个程序需要多人共同完成开发,怎么个共同法?
这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个模块。
问题来了:
如何将模块组合并成一个完整系统?
还有,我们开发的软件需要不断升级,如何升级?
难道每次非得把整个工程重新编译一次再发布给用户吗?
解决这些问题的科学办法,就是开发动态链接库DLL。
现在以开发myDLL.dll动态链接库为例,讲讲BCB中开发动态链接库的方法。
1、新建立一个工程:
File-New-Other...在New卡中选择DLLWizard
2、将工程存为myDLL.bpr
3、在myDLL.cpp中写接口代码:
////---------------------------------------------------------------------------
////
ImportantnoteaboutDLLmemorymanagementwhenyourDLLusesthe
staticversionoftheRunTimeLibrary:
////
IfyourDLLexportsanyfunctionsthatpassStringobjects(orstructs/
classescontainingnestedStrings)asparameterorfunctionresults,
youwillneedtoaddthelibraryMEMMGR.LIBtoboththeDLLprojectand
anyotherprojectsthatusetheDLL.
YouwillalsoneedtouseMEMMGR.LIB
ifanyotherprojectswhichusetheDLLwillbeperformingnewordelete
operationsonany
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Builder dll 写法 静态 动态 调用