dll(1)

来源:互联网 发布:js excel身份证号码 编辑:程序博客网 时间:2024/05/21 11:02

dll文件的介绍:

    dll文件,拥有自己的数据段,但是没有自己的堆栈,使用应用程序的堆栈,在两个dll中不可以共享全局的变量。dll可以用来封装相应的功能,实现了和应用程序的物理上的分开。简单的dll导出函数,复杂dll在其中调用了其他dll,可以到处类等,还可以使用dll来封装相应的应用程序的资源。

exports function funName index indexnum name ''; index 来制定导出函数的序号,没有由编译器默认。 name 来指定导出函数的名字,没有则是原来的函数的名字。 在应用程序中这样来引用函数 ----------静态的方式。 function funone external 'dllname' name aliasname; -- 应用的时候也可以使用函数的别名来进行引用。 ------静态链接全部被加载到内存中应用程序启动的时候 ------动态的加载只有在使用的时候才加载到内存中来,并且可以根据情况来选择合适dll。但是复杂。 ------------------------------------------------------------------------------------- 函数的引用的方式。 1.通过过程或者函数名 function funone:integer;stdcall; external 'dllname.dll' 2.通过过程或者函数的别名。 function funone:integer; external 'dllname.dll' name funnamealias 3.通过过程或者函数的索引。速度快,但是不是很直观。 function funname :integer;stdcall; external 'dllname.dll' index 5; 为了各种语言中的dll的兼容性在使用的时候,需要使用windows的stdcall delphi的register c/c++ cdecl dll中有自己的ds 但是没有ss ,在dll中可以使用自己的变量,但是调用它的模块不可以使用它定义的变量。 可以通过函数来进行传递操作。 为实现进程间的通信可以使用多种方法。

1.创建dll工程,添加一个单元,然后创建下面的代码

unit untdemo;

interface

function funOne:Integer;stdcall;---使用标准的方式导出,如果便于c++的调用使用pChar,shortString

避免使用和他不想兼容的类型。

implementation

function funOne: Integer; begin     Result := 100; end;

2.在工程的文件中导出本函数。

 exports     funOne name 'one'; -- -----------------name 表示对函数的重新命名。

3.编译生成dll。

第二,创建一个新的应用程序进行相应的调用。

1.application。

函数的声明。

function one: Integer;external 'staticDll.dll';

-----------------external 表示该函数在那个dll中,这是静态的调用。

然后就可以使用该函数了。

注意:dll的调试:

在调试dll的时候,可以设置。run——parameter--load中设置相应的应用程序来进行dll的调试。

很久没有使用delphi的dll了,先写一篇,静态调用的方式,后面继续介绍相应的知识。!!!

下面说明一下dll的动态调用的方法和注意事项!!!、

1.编写相应的动态链接库。 例如导出:这样的函数 function funOne: integer;stdcall; exports funOne; 2.对该函数进行相应的动态调用。 a.声明相应的类型来对得到的函数指针进行相应的变换。 type TMyFun = function: integer; b.对dll进行相应的动态加载。 procedure TForm1.btn1Click(Sender: TObject); var hinstance: THandle; proc: TFarProc; iResult: Integer; begin hinstance := LoadLibrary('dllDynamic.dll');//加载模块,返回相应的句柄。 if hinstance = 0 then exit; proc := GetProcAddress(hinstance,PChar('funOne'));//得到函数的地址。 if proc <> nil then iResult := tmyfun(proc);//对函数地址进行相应的转换。 ShowMessage(IntToStr(iResult)); FreeLibrary(hinstance);// 释放相应的模块。 end;

 

 

原创粉丝点击