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
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to