文档库 最新最全的文档下载
当前位置:文档库 › 如何用delphi制作DLL动态库方法

如何用delphi制作DLL动态库方法

如何用delphi制作DLL动态库方法
如何用delphi制作DLL动态库方法

用DeIPhi制作DLL的方法

一Dll的制作一般步骤

二参数传递

三DLL的初始化和退出清理[如果需要初始化和退出清理]

四全局变量的使用

五调用静态载入

六调用动态载入

七在DLL建立一个TForM

八在DLL中建立一个TMDIChiIdForM

九示例:

十DeIPhi制作的Dll与其他语言的混合编程中常遇问题:十一相关资料一Dll的制作一般分为以下几步:

1在一个DLL工程里写一个过程或函数

2写一个EXPOrtS关键字,在其下写过程的名称。不用写参数和调用后缀。

二参数传递

1参数类型最好与Window C++的参数类型一致。不要用DELPHI的数据类型。

2最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败]?一句话,与Windows c++兼容。

3用Stdcall声明后缀。

4最好大小写敏感。

5无须用far调用后缀,那只是为了与Windows 16位程序兼容。

三DLL的初始化和退出清理[如果需要初始化和退出清理]

1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入

口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下:

PrOCedUre DllE nterPoi nt(dwReaso n: DWoRD);far;StdCaII;

dwReason参数有四种类型:

DLL_PROCESS_ATTACH:进程进入时

DLL_PROCESS_DETACH 进程退出时

DLL_THREAD_A TTACH 线程进入时

DLL_THREAD_DETACH 线程退出时

在初始化部分写:

DLLPrOC := @DLLE nterPoi nt;

DIIE nterPoi nt(DLL_PROCESS_ATTACH);

2 女口Form 上有TdCOmCOnnectiOn 组件,就USeS Activex,在初始化时写一句CoInitialize (nil); 3在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。

四全局变量的使用

在Widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中

是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用

程序间的数据传递,除非你用内存映像文件。

五调用静态载入

1客户端函数声名:

1) 大小写敏感。

2) 与DLL中的声明一样。

女口:ShoWform(form:Tform);Far;external'yproject_dll.dll:

3) 调用时传过去的参数类型最好也与Win dows c++ 一样。

4) 调用时DLL必须在Win dows搜索路径中,顺序是:当前目录;Path路径;

Wi ndows;WidoWS'system;Wi ndows?ssystem32;

六调用动态载入

1建立一种过程类型[如果你对过程类型的变量只是一个指针的本质清楚的话,你就知道是怎么回事

了]。如:

type

mypoi nter=procedure(form:Tform);Far;external;

Var

Hin st:Tha ndle;

showform:mypo in ter;

begin

Hinst:=Ioadlibrary('yproject_dll');〃Load —个Dll,按文件名找。

ShoWform:=getprocaddress(Hinst,'showform');//按函数名找,大小写敏感。如果你知道自动化对象的本质就清楚了。

showform(application.mainform);// 找到函数入口指针就调用。

FreeIibrary(Hi nst);

en d;

七在DLL建立一个TForM

1把你的Form USeS到Dll中,你的Form用到的关联的单元也要USeS进来[这是最麻烦的

一点,因为你的Form或许USeS 了许多特殊的单元或函数]

2传递一个APPIiCatiOn参数,用它建立Form.

八在DLL中建立一个TMDIChildForM

1 Dll 中的MDIForm.FormStyIe 不用为fmMDIChild.

2在CreateFOrm后写以下两句:

function ShowForm(ma inFo rm:TForm):i nteger;StdCaIl

Var

Form1: TForm1;

ptr:PL Onglnt;

begin

ptr:=@(APPIiCatiOn.MainForm);// 先把dll的MainForm 句柄保存起来,也无须释放,只不过是替换一下

ptr^:=Lo ngl nt(ma in Form);// 用主调程序的mai nF Orm 替换DLL 的Mai nForm。 Ma in Form 是特殊的WlNDoW ,它专门管理APPIiCatiOn中的Forms资源.

//为什么不直接APPIiCation.MainForm := mainForm, 因为APPIiCation.MainForm 是只读属性

Form1:=TForm1.Create(mainForm);// 用参数建立

en d;

备注:参数是主调程序的APPIiCati On .Mai nForm

九示例:

DLL源代码:

Iibrary PrOjeCt2;

USeS

SysUtils,

Classes,

Dialogs,

Forms,

Unit2 in 'U ni t2.pas' {Form2};

{$R *.RES}

Var

ccc: Pchar;

PrOCedUre OPenFo rm(ma inFo rm:TForm);StdCall; Var

Form1: TForm1;

ptr:PL Onglnt;

begin

ptr:=@(APPIiCati on.MainFo rm);

ptr^:=L On gI nt(mai nF orm);

Form1:=TForm1.Create(mai nF orm);

en d;

PrOCedUre In PUtCCC(Text: PChar);StdCaII;

begin

CCC := Text;

en d;

PrOCedUre ShOWCCC;StdCaII;

begin

ShOWMeSSage(Stri ng(ccc));

en d;

exports

OPenForm;

In PUtCCC,

ShOWCCC;

begin

en d.

调用方源代码:

UnitUni t1;

in terface

USeS

Win dows, Messages, SysUtils, Classes, Graphics, Con trols, Forms, Dialogs, StdCtrls;

type

TForm1 = CIaSS(TFOrm)

Butto n1: TBUtt on;

Butto n2: TBUtt on;

Edit1: TEdit;

PrOCedUre Butto n1Click(Se nder: TObject);

PrOCedUre Butto n2Click(Se nder: TObject);

PriVate

{ PriVate declarati OnS }

PUbIiC

{ PUbIiC declarati OnS }

en d;

Var

Form1: TForm1;

impleme ntati On

{$R *.DFM}

PrOCedUre OPenFo rm(ma inFo rm:TForm);StdCall;EXter nal'project2.dll';

PrOCedUre ShOWCCC;StdCall;EXter nal'project2.dll';

PrOCedUre In PUtCCC(Text: PChar);StdCall;EXternal'project2.dll';

PrOCedUre TForm1.Butt On 1Click(Se nder: TObject);

Var

Text: Pchar;

begin

TeXt := PChar(Edit1.Text);

// OPenForm(Application.MainForm);// 为了调MDlCHILD

InputCCC(Text);//为了实验DLL中的全局变量是否在各个应用程序间共享en d;

ProCedUre TForm1.Butt On 2Click(Se nder: TObject);

begin

ShOWCCC;//这里表明WlNDoWS 32位应用程序DLL中的全局变量也是在应用程序地址空间中,16位应用程序或许不同,没有做实验。

en d;

十DeIPhi制作的Dll与其他语言的混合编程中常遇问题:

1与POWerBUiIder混合编程

在定义不定长动态数组方面在函数退出清理堆栈时老出现不可重现的地址错,原因未明,大

概与PB的编译器原理有关,即使PB编译成二进制代码也如此。

Windows的执行文件可以划分为两种形式程序和动态连接库

(DLLS)。一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL中的函数。

当我们调用Windows中的API函数的时候,实际上就是调用存储在DLL中的函数。

在如下几种情况下,调用DLL是合理的:

1)不同的程序使用相同的DLL ,这样只需要将DLL在内存中装载一次,节省了内存的开销。

2)当某些内容需要升级的时候,如果使用DLL只需要改变DLL就可以了,而不需要把整个程序都进行变动。

3)由于DLL是独立于语言的,所以,当不同语言习惯的人

共同开发一个大型项目的时候,使用DLL便于程序系统的交流,

当然,DeIPhi开发的DLL也可以在诸如ViSUaI BASIC,C++等系统中使用。

下面通过几个例子,说明DeIPhi开发动态连接库的方法和规

范。

第一节动态连接库的构建和调用方法

一、动态连接库构建

File---New---Other---DLL WiZard

这就创建了一个动态连接库的基本模块

Iibrary PrOjeCt2;

USeS

SySUtiIs, Classes;

{$R *.res}

begin

en d.

把工程名改为Mydll ,并写入必要的函数

Iibrary mydll;

USeS

SySUtiISQaSSeS,Dialogs,w in dows;

fun ctio n TriPIe(N:1 nteger):i nteger;StdCaII;

begin resuIt:=N+3;

en d;

fun ctio n DoubIe(N:I nteger):i nteger;StdCaII;

begin resuIt:=N+2;

en d;

function TriPIe1(N:I nteger):i nteger;StdCaII;

begin

ShOWmeSsage(计算N+3'); resuIt:=N+3;

en d;

function DoubIe1(N:I nteger):i nteger;StdCaII;

begin

messagebox(0,计算N+2','计算N+2',mb_ok); resuIt:=N+2;

en d;

exports

TriPIe n ame 'Tr',

Double n ame 'Do',

TriPIeI name 'TrM',

Double1 n ame 'DoM';

TriPIe,DoubIe,TripIe1,DoubIe1;

{$R *.RES}

begin

en d.

其中函数:TriPIe :把传入值加三

Double :把传入值加二

TriPleI :把传入值加三并显示提示DoUbleI :把传入值加二并显示提示从这个例子中可以看出DLL程序的几个规则:

1) 在DLL程序中,输出函数必须被声明为

StdCaIl ,以使用标

准的Win32参数传递技术来代替优化的RegiSter O

(说明:在DeIPhi中RegiSter方式是缺省的调用约定,这个约

定尽量采用寄存器来传递参数,传递次序从左到右,最多可用到3

个CPU的寄存器,如果参数多于3个,剩下的就通过栈来传送,使

用寄存器传送可保证参数传递的速度最快。

而Stdcall方式是通过Windows的标准调用来传递参数,传递

秩序从左到右,这种方式适合调用Windows的APl ,在DLL中,当

然要使用这种方式)。

2) 所有的输出函数都必须列在exports子句下面,这使的子例程在DLL外部就可以看到。

exports

TriPIe n ame 'Tr',

Double n ame 'Do',

TriPIeI name 'TrM', Double1 n ame 'DoM';

列出了用户使用这个函数的接口名字。虽然别名不是必须的,但

最好给个别名,以便用户程序更容易找到这个函数,同时还要指出,

DeIPhi 6.0取消了DeIPhi 5.0中允许使用的index ,如果还用Index 来指明接口名字,DeIPhi 6.0中将提示错误。

实例中给出了两种提示方法,主要想说明一个问题:

ShOWmeSSage(''),是VCL提供的函数,由于多次编译VCL ,做出的程序会比较大。

而messagebox(0,",",mb_ok) 是Windows 提供的API 函数,做出的程序会比较小。

这就是说,编写DLL程序的时候,要尽量避免多次编译VCL。作

为一个实例,这里把两种方法都列出来了。

保存

编译:ProjrCt---Build Mydll

静态链接库lib和动态链接库dll区别

1.什么是静态连接库,什么是动态链接库 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的EXE 文件中了。但是若使用DLL,该DLL 不必被包含在最终EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与EXE 独立的DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。静态链接库与静态链接库调用规则总体比较如下。 对于静态链接库(比较简单): 首先,静态链接库的使用需要库的开发者提供生成库的.h头文件和.lib文件。 生成库的.h头文件中的声明格式如下: extern "C" 函数返回类型函数名(参数表); 在调用程序的.cpp源代码文件中如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态库一起链接 第二,因为静态链接库是将全部指令都包含入调用程序生成的EXE文件中。因此如果用的是静态链接库,那么也就不存在“导出某个函数提供给用户使用”的情况,要想用就得全要!要不就都别要!:) 对于动态链接库: 动态链接库的使用,根据不同的调用方法,需要提供不同的资源: 1. 静态加载------程序静态编译的时候就静态导入dll,这样的话就需要提供给库 使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处: 1 程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行; 2 由于载入的是整个dll,需要耗费资源较多 其调用方法如下: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") 但是这种方式的话可以调用Class method. 2.动态加载-----那么只需要提供dll文件。 因此调用程序若想调用DLL中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用Class method了。 如果要调用Dll中的function,需要经历3个步骤: Handle h=LoadLibrary(dllName) --> GetProcAddress(h,functionName) 返回函数指针,通过函指针调用其function-->FreeLibrary(h) 例如:Another.dll有一个int Add(int x,int y)函数。则完整的调用过程如下:

在VB中调用DLL的方法

1制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。 语句格式为:Declare Sub过程名Lib[Alias"别名]([ByVal参数AS类型]),或为Declare Function函数名Lib[Alias"别名]([ByVal参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。 例如上面的ADD.DLL在VB中就可以声明为: Declare Function ADD Lib“c:\ADD.dll”(ByVal X AS Integer,ByVal Y AS Integer,ByVal filein asstring)AS Integer 通过此声明语句将函数ADD声明到VB中,便可直接调用。 2、dll文件中的函数好像是C语言写的, //函数名:int__stdcall GetMacNo(int*MacNo) //功能:获取卡机的卡机号(单机时) //参数:MacNo[0]-被读出的卡机号 //返回值:0-成功, //2-PC接收超时, //3-应答错误 dll的文件名是COMM232.dll 函数的形参int*MacNo是指针吗? 在VB中应该怎么声明和调用该函数? VB里也可以定义指针吗? 问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事, 我是这样声明的对吗? Public Declare Function GetMacNo Lib"COMM232.dll"(ByVal MacNo As Integer)As Integer 又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做? 都说了MacNo是被读出的卡机号,那么就是传址的了。 dim l as integer dim m as integer l=GetMacNo(m) if l=0then label1.caption="卡机号:"&m elseif l=2then msgbox"PC接收超时" elseif l=3then msgbox"应答错误" end if

C C++动态链接库的创建与调用

C/C++中动态链接库的创建和调用 1.动态链接库的创建步骤: 创建Non-MFC DLL动态链接库 1.打开File —> New —> Project选项,选择Win32 Dynamic-Link Library —>sample project —>工程名:DllDemo 2.新建一个.h文件DllDemo.h 并添加如下代码: #ifdef DllDemo_EXPORTS #define DllAPI _declspec(dllexport) #else #define DllAPI _declspec(dllimport) extern “C” // 原样编译 { DllAPI int _stdcall Max(int a,int b); //_stdcall使非C/C++语言内能够调用API } #endif 3.新建一个.cpp文件,并添加如下代码 #include "DllDemo.h" DllAPI int __stdcall Max(int a,int b) { if(a==b) return NULL; else if(a>b) return a; else return b; } 4.编译程序生成动态链接库 1.2 用.def文件创建动态连接库DllDemo.dll 1、删除DllDemo工程中的DllDemo.h文件。 2、在DllDemo.cpp文件头,删除#include DllDemo.h语句。 3、向该工程中加入一个文本文件,命名为DllDemo.def并写入如下语句: LIBRARY MyDll EXPORTS Max@1 4、编译程序生成动态连接库。 2.动态链接库的调用步骤 2.1 隐式调用 1.建立DllCnsTest工程 2.将文件DllDemo.dll、DllDemo.lib拷贝到DllCnsTest工程所在的目录 3.在DllCnsTest中添加如下语句: #define DllAPI _declspec(dllimport) #pragma comment(lib,”DllDemo.lib”) extern “C” { DllAPI int _stdcall Max(int a,int b);

lib和dll文件的区别和联系

(1)lib是编译时需要的,dll是运行时需要的。 如果要完成源代码的编译,有lib就够了。 如果也使动态连接的程序运行起来,有dll就够了。 在开发和调试阶段,当然最好都有。 (2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。 (3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。 一、开发和使用dll需注意三种文件 1、 dll头文件 它是指dll中说明输出的类或符号原型或数据结构的.h文件。当其它应用程序调用dll时,需要将该文件包含入应用程序的源文件中。 2、 dll的引入库文件 它是dll在编译、链接成功后生成的文件。主要作用是当其它应用程序调用dll时,需要将该文件引入应用程序。否则,dll无法引入。 3、 dll文件(.dll) 它是应用程序调用dll运行时,真正的可执行文件。dll应用在编译、链接成功后,.dll文件即存在。开发成功后的应用程序在发布时,只需要有.exe文件和.dll文件,不必有.lib文件和dll头文件。 动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。 动态链接与静态链接的不同之处在于:动态链接允许可执行模块(.dll 文件或 .exe 文件)仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中,链接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。 使用动态链接代替静态链接有若干优点。DLL 节省内存,减少交换操作,节省磁盘空间,更易于升级,提供售后支持,提供扩展 MFC 库类的机制,支持多语言程序,并使国际版本的创建轻松完成。 lib与dll文件最大区别在调用方面 dll可以静态陷入 lib与DLL 从这一章起,我讲述的内容将特定于windows平台。其实这篇文章也可看作是我在windows下的开发经验总结,因为以后我决定转unix了。 前面有一章说编译与链接的,说得很简略,其实应该放到这一章一块儿来说的。许多单讲

DELPHI中如何调用API,可举例说明

DELPHI中如何调用API,可举例说明 第一部分Delphi知识1. 如果一个元件希望放到IDE的元件面板上,它必须从________类派生,如果一个元件能作为其它元件的容器,它必须从_____________类派生,如果一个元件在运行时可见,它必须从___________________类派生(A)TGraphicControl (B)TWinContr 1、rtl70.bpl是什么?有什么用? 2、delphi的Package相对dll有什么优点? 3、以下的记录(结构)变量在内存占多少字节?type a = packed record v1: Byte; v2: Word; v3: string[16]; v4: Double; v5: string; v6: TForm; end; 4、以下的写法是否正确?type a 1.您为什么选择软件开发这个行业?(30字左右简写); 2.如果有您解决不了的软件问题您会采取什么样的解决措施; 3.a.请您写出Object Pascal所支持的数据类型;b.请您写出Shl、Shr、Xor、Not 的数学表示法; 4.请您写出VCL结构层次(以TObject开始,最少五层);5 二.是非题(共20道)1.从主菜单上选择Project|Syntax Check 菜单选项,Delphi将编译从上次编译后有改动的任何单元,并报出遇到的错误。()2.Delphi的VCL对象有些是指针,从堆栈中分配空间,有些则不是。()3.粘贴时,如果作为容器的组件已被选择,

剪贴 一.选择题(共40道)1.用户开发程序时需要经常在窗体和编辑器窗口之间来回切换,可使用快捷键()。A、F12和F11 B、F12和F13 C、F12和Ctrl+F12 D、F12和Alt+F12 E、F12和Shift+F12 2.某函数如下:Function check(n,k:Integer):Integer; Var m:Integer; Beg 编程语言:delphi7.0或Vc++6.0 时间:4小时内环境:可参考帮助文档,但不能上网查资料1、编程查找指定目录下所有EXE 文件,并将其全路径存入Result.txt中,要求用递归。2、采用SOCKET(可用SOCKET API或delphi Socket控件)实现点对点传输大文件,要求不能掉

VC++动态链接库创建和调用全过程详解

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。

VC++ MFC DLL动态链接库编写详解

VC++ MFC DLL动态链接库编写详解(2008-07-10 17:38:40) 标签:it分类:com技术然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型 使用VC++可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 1、MFC扩展DLL 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。 Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。 2、常规DLL 使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。 当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 二、建立DLL 利用Visual C++提供的向导功能可以很容易建立一个不完成任何实质任务的DLL,这里就不多讲了,主要的任务是如何给DLL添加功能,以及在客户程序中利用这个DLL 1、导出类 用向导建立好框架后,就可以添加需要导出类的.cpp .h文件到DLL中来,或者用向导创建C++ Herder File/C++ Source File。为了能导出这个类,在类声明的时候要加“_declspe c(dllexport)”,如:

delphi之调用外部dll中的函数

分早绑定和晚绑定两种。 早绑定的代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; //MB 函数的声明: function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall; implementation {$R *.dfm} {调用外部 DLL 中的函数,譬如调用系统 user32.dll 中的 MessageBoxA} //function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external user32 name 'MessageBoxA'; {其中 user32 是 Delphi 定义的常量 'user32.dll',可以直接写成:} //function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external 'user32.dll' name 'MessageBoxA'; {name 后面说明函数的真实名字} {external 子句说明单元载入时就加载函数,也就是早绑定;如果晚绑定需要用LoadLibrary} {stdcall 指令表示参数传递是从右到左(Pascal则反之),不通过CPU寄存器

VC++动态链接库(DLL)编程深入浅出

VC++动态链接库(DLL)编程深入浅出 作者:宋宝华 联系作者:e-mail:21cnbao@https://www.wendangku.net/doc/8010429533.html, 出处:Pconline 由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。 问:本文主要讲解什么内容? 答:本文详细介绍了DLL编程的方方面面,努力学完本文应可以对DLL有较全面的掌握,并能编写大多数DLL程序。 问:如何看本文? 答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经WINRAR压缩)。所有这些例程都由笔者编写并在VC++6.0中调试通过。 当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握DLL的奥妙。 问:学习本文需要什么样的基础知识? 答:如果你掌握了C,并大致掌握了C++,了解一点MFC的知识,就可以轻松地看懂本文。 目录 1、概论 2、静态链接库 3、库的调试与查看 4、非MFC DLL 5、MFC规则DLL 6、MFC扩展DLL的创建

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。 (2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。 (3)VC动态链接库的分类 Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

演练:创建和使用动态链接库 (C++)

Visual C++ 指导教程 演练:创建和使用动态链接库(C++) Visual Studio 2010 其他版本 0(共1)对本文的评价是有帮助评价此主题 我们将创建的第一种类型的库是动态链接库(DLL)。使用DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。 本演练涵盖以下内容: ?创建新的动态链接库(DLL) 项目。 ?向动态链接库添加类。 ?创建引用动态链接库的应用程序。 ?在控制台应用程序中使用类库的功能。 ?运行应用程序。 系统必备 本主题假定您具备C++ 语言的基础知识。如果您是刚开始学习C++,建议您参阅Herb Schildt 编写的“C++ Beginner's Guide”(《C++ 初学者指南》),该书可从 https://www.wendangku.net/doc/8010429533.html,/fwlink/?LinkId=115303在线获得。 创建新的动态链接库(DLL) 项目 1.从“文件”菜单中,选择“新建”,然后选择“项目…”。 2.在“项目类型”窗格中,选择“Visual C++”下的“Win32”。 3.在“模板”窗格中,选择“Win32 控制台应用程序”。 4.为项目选择一个名称,如MathFuncsDll,并将其键入“名称”字段。为解决方案选择一个名 称,如DynamicLibrary,并将其键入“解决方案名称”字段。 5.单击“确定”启动Win32 应用程序向导。在“Win32 应用程序向导”对话框的“概述”页中, 单击“下一步”。

6.在“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果 可用),或者选择“控制台应用程序”(如果“DLL”不可用)。某些版本的Visual Studio 不支持通过使用向导创建DLL 项目。您可以稍后对此进行更改,以将项目编译为DLL。 7.在“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”。 8.单击“完成”创建项目。 向动态链接库添加类 1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。将显示“添加新项”对话框。 在“类别”窗格中,选择“Visual C++”下的“代码”。在“模板”窗格中选择“头文件(.h)”。为 头文件选择一个名称,如MathFuncsDll.h,并单击“添加”。将显示一个空白文件。 2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。代 码应与以下内容类似: 复制 // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, dou ble b); // Returns a * b static __declspec(dllexport) double Multiply(double a, dou ble b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, doubl e b); }; } 3.请注意此代码方法声明中的__declspec(dllexport)修饰符。这些修饰符使DLL 能够导出 该方法以供其他应用程序使用。有关更多信息,请参见dllexport, dllimport。

windowsapi编程之动态链接库(dll)

Windows API编程之动态链接库(DLL) 本文总结Windows API编程之动态链接库(DLL),内容涉及DLL的制作、发布、使用及相关技术以供大家参考。 作者:tyc611,2007-05-26 链接库分为静态链接库和动态链接库,而动态链接库在使用时,又进一步分为装载时链接和运行时链接。装载时链接是指该动态链接库是在程序装入时进行加载链接的,而运行时链接是指该动态链接库是在程序运行时执行LoadLibrary(或LoadLibraryEx,下同)函数动态加载的。因此,由于动态链接库有这两种链接方式,所以在编写使用DLL的程序时,就有了两种可选方案。 可能有人会问“为什么需要装载时链接?直接静态链接 不就行了吗?”,这是模块化程序设计的需要。试想,如果你开发一个很大的程序,并且经常需要更新。如果你选择静态链接,那么每次更新就必须更新整个exe文件,而如果你把需要经常更新的模块做成dll,那么只需要更新这个文件即可,每次程序运行时加载这个更新的文件即可。 在进入编写DLL程序之前,先介绍一些相关知识。 VC支持三种DLL,它们分别是Non-MFC DLL、MFC Regular DLL、MFC Extension DLL。由于本文只讲解API 编程,所以这里只对第一种DLL进行介绍,后面两种DLL 将在另外的文章中介绍。

动态链接库的标准后缀是.DLL,当然也可以使用其它任意后缀名。但使用.DLL后缀的好处是:一是,很直观表明该文件的性质;二是,只有后缀为.DLL的动态链接库才能被Windows自动地加载,而其它后缀的动态链接库只能通过LoadLibrary显示式加载。 动态链接库的用途:一是作为动态函数库使用,另一个常用的方式是作为动态资源库。当然,没有绝对的划分,比如你的动态函数库时也可能有资源,但动态资源库一般不会有函数。 另两个重要的、需要区分的概念是:对象库(Object Library)和导入库(Import Library)。对象库是指普通的库文件,比如C运行时库libc.lib;而导入库是一种比较特殊的对象库文件,与一个动态链接库相对应。它们都有后缀.lib,并且都仅在程序编译链接时使用,被链接器用来解析函数调用。然而,导入库不包含代码,它只为链接器提供动态链接库的信息,以便于链接器对动态链接库中的对象作恰当地链接。 动态链接库的查找规则。如果在使用时没有指定动态链接库的路径,则Windows系统按如下顺序搜索该动态链接库:使用该动态链接库的.exe文件所在目录、当前目录、Windows系统目录、Windows目录、环境变量%PATH%中的路径下的目录。

易语言中调用DLL使用说明

易语言中调用DLL使用说明 基本说明 本文所描述的部分功能需易语言4.01或以上版本支持。 “在易语言中调用DLL”包含两方面的内容:调用Windows系统API函数;调用普通DLL函数。 下文用到的“调用API”或“调用DLL”等字眼,除非特别注明,一般都是指以上两方面之一或之和,视上下文而定。绝大多数情况下,无需明确区分调用的是系统API还是普通DLL。 目前易语言只支持以stdcall方式调用DLL中的导出函数。 Windows系统API一般都是以stdcall调用方式导出的,故在易语言中调用它们时通常不必考虑函数调用方式的问题。而普通DLL有可能导出“非stdcall调用方式”(比如cdecl)的函数,调用时需要特别注意。一般而言,考虑到通用性,DLL开发者都会选择导出以sdtcall方式调用的函数。(支持生成DLL的编程语言通常都支持导出stdcall调用方式的函数,具体实现请参考各编程语言手册。) 易语言编译生成的DLL,其导出函数全部为stdcall调用方式,所以在易语言中调用易语言生成的DLL不存在问题。 目前在易语言中调用DLL时只支持1字节对齐的结构(自定义数据类型) 如果DLL命令的某个参数或参数的某个成员是结构类型(自定义数据类型),则其对齐方式必须是1字节对齐。Windows系统API中所用到的结构都是1字节对齐的,故在调用API时不受此限制。但如果想用其它编程语言生成DLL供易语言调用且数据类型中包含了1或2字节数据长度的成员(如字符型或短整数),就需要考虑结构的1字节对齐。

在Delphi中,可以这样定义1字节对齐的结构(结构在Delphi中称为record): 在其它编程语言或编译器中的定义方式请参考各自的编程手册。 目前易语言支持调用任意复杂的DLL命令 只要满足了前面的两个条件——调用方式为stdcall,参数结构为1字节对齐——易语言支持调用任意复杂的DLL命令:参数除了可以是基本数据类型或普通结构类型外,还可以是基本类型地址或基本类型数组,也可以是结构类型地址或结构类型数组,结构类型的成员中还可以包含任意数量和任意层次的其它结构、结构地址、结构数组,等等。 DLL命令调用表 要在易语言中调用Windows API或普通DLL中的导出函数,必须首先在易语言中对该函数进行声明,声明的方式就是颇具易语言特色的“填写‘DLL命令调用表’”。“DLL命令调用表”正确填写完毕之后,就可以象调用普通易语言子程序一样调用DLL命令了。 下面重点说明“DLL命令调用表”的填写。 在易语言中,选择菜单“插入→DLL命令”即可插入一个空白的“DLL命令调用表”。当然还有其它操作方式,请参考易语言相关操作手册。

动态链接库的使用方法

动态链接库的使用方法 动态链接库是一堆变量,函数和类的集合体,供其它函数调用。 为什么要使用动态链接库,原因很多,其中三条1.可跨平台调用2.方便二次开发3.方便项目管理。 动态链接库的使用有两个方面,一是把原来的源代码做成动态链接库文件(即生成DLL和lib 格式的文件),二是在其它源代码中使用动态链接库。 把源代码做成动态链接库文件 可以使用vc6.0及其以上的版本来做,直接建一个动态链接库工程,这个工程和其它的工程类似,有头文件和源文件,不同之处是在为了让DLL导出函数,需在每一个要导出的函数前添加标识符_declspec(dllexport)或declspec(dllimport)。 在头文件中,申明要导出的函数,类,以及一些全局变量。在源文件中,定义或实现头文件中要导出的函数,类以及变量。 做单独的头文件,该头文件可以同时用于动态链接库和使用动态链接库的程序。 为了方便的添加标识符,我们一般在头文件中使用宏定义,示例如下: #ifdef DLL1_API #else #define DLL1_API _declspec(dllimport) #endif 这样在后面的使用中,可以用DLL1_API来代替_declspec(dllimport),如下: DLL1_API int add (int a,int b); DLL1_API int subtract(int a,int b); class DLL1_API Point { public: void output(int x,int y); }; 在动态链接库的源文件中包含动态链接库头文件和一条宏定义 在源文件中,要重新定义标识符,使用_declspec(dllexport),所以在源文件中也要添加一条宏定义#define DLL1_API _declspec(dllexport),之后再包含头文件#include "Dll1.h" 二.在目标程序中调用动态链接库 在使用动态链接库的程序中隐式的调用动态链接库: 1.把动态链接库的头文件拷贝到目标程序目录下 2.在使用动态链接库的源文件中包含该头文件 3.拷贝动态链接库的两个文件到目标程序目录下 4.在vc6.0的工程/设置/连接中的对象/库模块中输入动态链接库文件名,如DLL1.lib 三.其它 1.关于DLL中全局变量的定义 在头文件中声明,在源文件中定义,如: 在头文件中extern _declspec(dllimport) int num_cai1; 在源文件中则是int num_cai1=200;

VC++ 2017 动态链接库的创建和使用总结

Visual studio c++ 2017 动态链接库的创建和使用总结 一动态链接库的创建两种方式: 1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接 库(.dll)->生成解决方案,才会生成.dll和.lib文件。 (1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。 可以看出,导出的函数名都被编译器篡改了。

(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。 可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。 2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。

二动态链接库的调用两种方式: 1、显式调用 (1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。否则GetProcAddress( )不能正确地获取dll中的函数名。 但是导出的类不能使用extern “C”修饰。 (2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。必须事先知道dll中的函数名和形式参数。 (3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。而隐式调用DLL函数,由于使用了DLL的头文件.h,使用起来非常方便。 2、隐式调用 (1)隐式调用DLL函数缺点: 应用程序加载时,在内存中载入DLL动用库中的函数、变量、或类。使用完毕后,DLL 也不会从内存中释放。 .lib包含了库函数的入口,但不包含函数代码,应用程序调用时,才从dll中载入。(2)隐式调用DLL函数优点: 应用程序调用dll时,需要.lib和.h文件,在应用程序.exe文件夹debug或者release 中有DLL文件,即.h、.lib和.dll三个文件,在应用程序中直接使用DLL中的类和函数,可以不考虑编译DLL函数和变量名发生改变的问题。不需要像显式调用那样,函数需要 用 GetProcAddress( )一一获取。 隐式调用DLL中的变量、函数和类,有两种方法: (1)在主程序中包含DLL的头文件dll.h,在main( )前加上#pragma comment(lib,”dll.lib”),没有分号,再在debug或release中复制DLL.dll。 (2)在主程序中包含DLL的头文件dll.h,在项目属性->链接器->添加依赖项中加上“dll.lib;“,再在debug或release中复制DLL.dll,即可。

C#调用动态链接库

C#程序实现动态调用DLL的研究 摘要:在《csdn开发高手》2004年第03期中的《化功大法——将DLL嵌入EXE》一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案。这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动速度太慢”。这是因为程序启动时实现DLL释放,然后再加载释放出来的DLL,这个过程会耗费一定的时间。鉴于此问题,经过思索,提出另一个设计方案:DLL作为资源文件嵌入程序,但不需进行DLL释放及其重新加载。本文就是对该设计方案的原理分析及使用C#编程来实现该设计方案。 关键词:动态调用DLL,嵌入DLL,C# 正文: 一、DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。 动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。 DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。 下面列出了当程序使用DLL时提供的一些优点:[1] 1)使用较少的资源 当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在Windows操作系统上运行的程序。 2)推广模块式体系结构 DLL有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。 3)简化部署和安装 当DLL中的函数需要更新或修复时,部署和安装DLL不要求重新建立程序与该DLL的链接。此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方DLL时,此问题可能会更频繁地出现。 二、DLL的调用

如何用delphi制作DLL动态库方法

用Delphi制作DLL的方法 一Dll的制作一般步骤 二参数传递 三DLL的初始化和退出清理[如果需要初始化和退出清理] 四全局变量的使用 五调用静态载入 六调用动态载入 七在DLL建立一个TForM 八在DLL中建立一个TMDIChildForM 九示例: 十Delphi制作的Dll与其他语言的混合编程中常遇问题: 十一相关资料 一Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称。不用写参数和调用后缀。 二参数传递 1 参数类型最好与window C++的参数类型一致。不要用DELPHI的数据类型。 2 最好有返回值[即使是一个过程],来报出调用成功或失败,或状态。成功或失败的返回值最好为1[成功]或0[失败].一句话,与windows c++兼容。 3 用stdcall声明后缀。 4 最好大小写敏感。 5 无须用far调用后缀,那只是为了与windows 16位程序兼容。 三DLL的初始化和退出清理[如果需要初始化和退出清理] 1 DLLProc[SysUtils单元的一个Pointer]是DLL的入口。在此你可用你的函数替换了它的入口。但你的函数必须符合以下要求[其实就是一个回调函数]。如下: procedure DllEnterPoint(dwReason: DWORD);far;stdcall; dwReason参数有四种类型: DLL_PROCESS_ATTACH:进程进入时 DLL_PROCESS_DETACH进程退出时 DLL_THREAD_A TTACH 线程进入时 DLL_THREAD_DETACH 线程退出时 在初始化部分写: DLLProc := @DLLEnterPoint; DllEnterPoint(DLL_PROCESS_ATTACH); 2 如Form上有TdcomConnection组件,就Uses Activex,在初始化时写一句CoInitialize (nil); 3 在退出时一定保证DcomConnection.Connected := False,并且数据集已关闭。否则报地址错。 四全局变量的使用 在widnows 32位程序中,两个应用程序的地址空间是相互没有联系的。虽然DLL在内存中是一份,但变量是在各进程的地址空间中,因此你不能借助dll的全局变量来达到两个应用

相关文档
相关文档 最新文档