(这里是翻译为对象,还是目标呢?)
Calling dynamically loadable libraries(调用动态调入库) Calling dynamically loadable libraries(调用动态调入库)
你可以直接调用操作系统的例程,但它们直到运行时才被链接到你的程序。这说明在编译程序时它们不必存在,同时也说明在(试图)导入一个例程时不会进行编译时验证。
在调用由共享目标文件(shared object,是仅仅指Linux下的吗?)所定义的例程前,你必须导入这些例程。这有两种方式:一是声明一个外部(external)过程或函数,二是直接调用操作系统。不论使用哪种方式,例程都是直到运行时才链接到你的程序中。
Object Pascal不支持从共享库中导入变量。
静态调入
导入过程或函数最简单的方法是用external指示字声明它们,比如,
在Windows下: procedure DoSomething; external 'MYLIB.DLL';
在Linux下: procedure DoSomething; external 'mylib.so';
若你在程序中包含这个声明,MYLIB.DLL(Windows)或mylib.so(Linux)在程序启动时被调入一次,在程序的整个运行期间,标志符DoSomething总是指同一个共享库中的同一个入口点。
导入例程的声明可以直接放在需要它们的程序或单元中。但为了维护方便,你可以把external声明放在一个单独的“导入单元”中,这个单元也可以包含和库进行交互所需要的常量和类型声明。其它使用这个导入单元的模块就可以调用它声明的任何例程。
要了解external声明的信息,请参考External declarations。
Dynamic loading(动态调入)
你可以直接调用操作系统的库函数来访问一个库中的例程,这些库函数包括LoadLibrary、FreeLibrary和GetProcAddress。在Windows下,这些函数在Windows.pas单元声明,在Linux下,为了兼容性考虑,它们在SysUtils.pas单元实现,实际的Linux例程是dlopen、dlclose和dlsym(这些都在Kylix的Libc单元声明,请参考帮助)。此时,我们使用过程类型的变量来引用导入的例程。
比如,在Windows或Linux下:
- 131 -
Libraries and packages
uses Windows, ...; {On Linux, replace Windows with SysUtils }
type
TTimeRec = record
Second: Integer;
Minute: Integer;
Hour: Integer;
end;
TGetTime = procedure(var Time: TTimeRec);
THandle = Integer;
var
Time: TTimeRec;
Handle: THandle;
GetTime: TGetTime;
...
begin
Handle := LoadLibrary('libraryname');
if Handle <> 0 then
begin
@GetTime := GetProcAddress(Handle, 'GetTime');
if @GetTime <> nil then
begin
GetTime(Time);
with Time do
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23665-98.html
不过小米能主动送检
好坏好坏的
中国人
只要舍得花公关费