dll的创建与调用[3]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 kinglion 的 blog

 2      文件没有被发现

 3      路径没有被发现

 5      企图动态链接一个任务或者有一个共享或网络保护错

 6      库需要为每个任务建立分离的数据段

 8      没有足够的内存启动应用程序

 10     windows版本不正确

 11     可执行文件非法。或者不是windows应用程序,或者在.exe映像中有错误

 12     应用程序为一个不同的操作系统设计(如os/2程序)

 13     应用程序为ms dos4.0设计

 14     可执行文件的类型不知道

 15     试图装载一个实模式应用程序(为早期windows版本设计)

 16     试图装载包含可写的多个数据段的可执行文件的第二个实例

 19     试图装载一个压缩的可执行文件。文件必须被解压后才能被装裁

 20     动态链接库文件非法

 21     应用程序需要32位扩展

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

假如在应用程序用loadlibrary调用某一模块前,其它应用程序已把该模块装入内存,则loadlibrary并不会装载该模块的另一实例,而是使该模块的“引用计数”加1。 

2.getprocaddress:捡取给定模块中函数的地址

 语法为:  function getprocaddress(module: thandle; procname: pchar): tfarproc; 

  module包含被调用的函数库模块的句柄,这个值由loadlibrary返回。如果把module设置为nil,则表示要引用当前模块。

 procname是指向含有函数名的以nil结尾的字符串的指针,或者也可以是函数的次序值。如果procname参数是次序值,则如果该次序值的函数在模块中并不存在时,getprocaddress仍返回一个非nil的值。这将引起混乱。因此大部分情况下用函数名是一种更好的选择。如果用函数名,则函数名的拼写必须与动态链接库文件exports节中的对应拼写相一致。

如果getprocaddress执行成功,则返回模块中函数入口处的地址,否则返回nil。

3.freelibrary:从内存中移出库模块

  语法为: procedure freelibrary(module : thandle); 

    module为库模块的句柄。这个值由loadlibrary返回。

  由于库模块在内存中只装载一次,因而调用freelibrary首先使库模块的引用计数减一。如果引用计数减为0,则卸出该模块。

  每调用一次loadlibrary就应调用一次freelibray,以保证不会有多余的库模块在应用程序结束后仍留在内存中。 

//———————————— 动态调用举例 

 在利用getprocaddess返回的函数指针时,必须进行强制类型转换: 

   order := tinstr(pfunc)(text,key);

  tinstr是一个定义好了的函数类型: 

type

  tinstr = function(source: pchar;check: char): integer;

//---------------------------------

本文关键:dll
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top