C++Builder中dll的写法及静态动态调用Word文档格式.docx

上传人:b****5 文档编号:15691972 上传时间:2022-11-15 格式:DOCX 页数:17 大小:185.50KB
下载 相关 举报
C++Builder中dll的写法及静态动态调用Word文档格式.docx_第1页
第1页 / 共17页
C++Builder中dll的写法及静态动态调用Word文档格式.docx_第2页
第2页 / 共17页
C++Builder中dll的写法及静态动态调用Word文档格式.docx_第3页
第3页 / 共17页
C++Builder中dll的写法及静态动态调用Word文档格式.docx_第4页
第4页 / 共17页
C++Builder中dll的写法及静态动态调用Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

C++Builder中dll的写法及静态动态调用Word文档格式.docx

《C++Builder中dll的写法及静态动态调用Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++Builder中dll的写法及静态动态调用Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

C++Builder中dll的写法及静态动态调用Word文档格式.docx

//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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1