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;
//---------------------------------