[fpc-devel] Dynamically Loading Libraries

Sergei Gorelkin sergei_gorelkin at mail.ru
Mon Nov 2 21:45:25 CET 2009


Vincent Snijders wrote:

>> Should do the following right? Correct me if i'm wrong:
>>
>> Static function:
>>
>> function foobar_dosomething(a:cint; b:cdouble): cint; extdecl;external 
>> foobarlib;
>>
>> Becomes a dyn function:
>>
>> var foobar_dosomething: function(a:cint; b:cdouble): cint; extdecl;
>>
> And a statement to initialize the variable.
> 
I'd also note that the current approach (loading all functions at once) actually defeats the nature 
of dynamic linking, and smartlinking as well. If some function is absent in the library, error will 
occur on loading regardless of whether this function is actually used by the program. With static 
linking, if the problematic function isn't used, there will be no loading error.
For this reason, I use the following approach in my projects (in pseudocode):

interface

function foo(args): integer;

implementation

type
   tfoo = function(args): integer;

const
   bad_ptr = pointer(1);

var
   _foo: pointer = bad_ptr;

function foo(args): integer;
var
   p: PPointer;
begin
   p := @_foo;
   Result := E_NOTIMPL;         // other values may be used, or an exception raised
   if p^ = bad_ptr then
     p^ := GetProcAddress(libHandle, 'foo_name');
   if Assigned(P^) then
     Result := tfoo(p^)(args);
end;

Such approach, of course, introduces somewhat bigger overhead, but allows the compiler to optimize 
unused parts away.

Sergei



More information about the fpc-devel mailing list