最近在写程序时用到了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