delphi的dll中index的使用

最近在写程序时用到了Dll,在dll中对于name的用法,一般在书上讲的比较简单,也较为全面,

而对index的用法讲的较少,以下是我自己的经验之谈。

通常的name使用:

exports
a name ‘newa’;

这就代表了给a这个模块(可能过程可能函数)重命名为newa,因此在外部调用时a的名称就是newa;

反汇编有这样的结果:

可以看出在外部调用时 函数名是newa;当然也可以把a的名字变为空 a name ‘’;这样a外部调用名就为空了。

那么该如何调用名字为空的函数呢,这里可以用到index。

简单说 index是对dll中每个模块的一个编号,用index的编号调用dll中模块比用名字能快些, 同时若没有用index 对函数进行编号,系统会自行依照exports中从前到后的顺序对每个模块从1开始进行编号。也就是说dll中每个模块可以没有外部调用的函数名,但是他一定有他自身的调用编号。

这里还需要强调一下, 若一个模块既有name又有自定义的index,那么在exports中他们使用是有顺序的,即是:

dll文件中的模块名 index 编号(1~32767) name 外部调用名称;如有多个则每个后面用逗号分开,最后用分号结尾。如果不是这样 而是name在前 index在后则编译不成功!!!!!!这点要切记~~

说了这么多,那么用编号调用dll中的模块呢。

这里与用名字调用一样有两种方式,一种是静态的,另一种是动态。

先给出一个简单的DLL代码:

library Project1;

uses
SysUtils,
Classes;

{$R *.res}
function a(k:integer):integer;stdcall;
begin
a:=k;
end;

exports
a index 5 name ”;

begin
end.

可以看出这个DLL中只有一个函数,它的外部调用名称是 空,它的调用索引号是5.

先说静态:

在需要调用DLL的程序的implementation下加这样一句;

function RunMyDll(k:integer):integer;stdcall;external ‘Project1.dll’ index 5;

其中RunMyDll为在程序中定义的DLL函数function a(k:integer):integer;stdcall;的名称,
这里可以得到基本的调用DLL函数的格式:

function 函数名(参数表):返回值;external ’DLL文件名’;
function 函数名(参数表):返回值;external ’DLL文件名’ index 索引号;
function 函数名(参数表):返回值;external ’DLL文件名’ name exports中的外部调用名称;

同理过程的调用也有:

procedure 过程名(参数表);external ’DLL文件名’;
procedure 过程名(参数表);external ’DLL文件名’ index 索引号;
procedure 过程名(参数表);external ’DLL文件名’ name exports中的外部调用名称;

当然这些声明是添加在所需调用DLL程序的implementation后。

在调用时,只需要值程序中需要的调用的按照的定义的名字当作函数,过程使用就好了。

比如,上面那个例子使用,就只需在程序中需要调用它的地方输入以下代码:

RunMyDll(8);(8为参数值)。

以上是静态调用方法。下面介绍动态调用:

这是调用代码,

var
hnd:Thandle;
fun:function (k:integer):integer;stdcall;
begin
hnd:=loadlibrary(‘Project1.dll’);
@fun:=getprocaddress(hnd,lpcstr(5));
memo1.Lines.Add(inttostr(fun(6)));
end;

解释一下,其中fun为指针函数,程序开始先通过loadlibrary(‘Project1.dll’);获得载入句柄,在后用 getprocaddress(hnd,lpcstr(5));获得编号为5的函数的入口地址,并把获得地址放入fun中,说明一下,getprocaddress在delphi中的原型如下:

function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;

第二个参数是函数名,这里其实亦可以是函数的index编号,但是用编号时候需要进行一个类型转换,
像这样lpcstr(5) ,ipcstr在delphi中的定义如下:LPCSTR = PAnsiChar;

以上就是要介绍的index的用法,希望大家有帮助.

引用 http://hi.baidu.com/94lzx/blog/item/141c7309ce6bbaa52fddd43f.html



发表评论

电子邮件地址不会被公开。 必填项已用*标注

47 + = 53