FFI::Library - Perl Access to Dynamically Loaded Libraries


FFI documentation Contained in the FFI distribution.

Index


Code Index:

NAME

Top

FFI::Library - Perl Access to Dynamically Loaded Libraries

SYNOPSIS

Top

    use FFI::Library;
    $lib = FFI::Library->new("mylib");
    $fn = $lib->function("fn", "signature");
    $ret = $fn->(...);

DESCRIPTION

Top

This module provides access from Perl to functions exported from dynamically linked libraries. Functions are described by signatures, for details of which see the FFI module's documentation.

EXAMPLES

Top

    $clib_file = ($^O eq "MSWin32") ? "MSVCRT40.DLL" : "-lc";
    $clib = FFI::Library->new($clib_file);
    $strlen = $clib->function("strlen", "cIp");
    $n = $strlen->($my_string);

TODO

Top

LICENSE

Top

This module can be distributed under the same terms as Perl. However, as it depends on the FFI module, please note the licensing terms for the FFI code.

STATUS

Top

This is a maintenance release. We will be releasing an updated but incompatible 2.00 version shortly.

AUTHOR

Top

Paul Moore, <gustav@morpheus.demon.co.uk> is the original author of FFI.

Mitchell Charity <mcharity@vendian.org> contributed fixes.

Anatoly Vorobey <avorobey@pobox.com> and Gaal Yahas <gaal@forum2.org> are the current maintainers.

SEE ALSO

Top

The FFI module.


FFI documentation Contained in the FFI distribution.

package FFI::Library;

use strict;
use Carp;
use vars qw($VERSION);
use FFI;

$VERSION = '1.04';

if ($^O eq 'MSWin32') {
    require Win32;
}
else {
    require DynaLoader;
}

sub new {
    my $class = shift;
    my $libname = shift;
    scalar(@_) <= 1
        or croak 'Usage: $lib = new FFI::Library($filename [, $flags])';
    my $lib;
    if ($^O eq 'MSWin32') {
        $lib = Win32::LoadLibrary($libname) or return undef;
    }
    else {
        my $so = $libname;
        -e $so or $so = DynaLoader::dl_findfile($libname) || $libname;
        $lib = DynaLoader::dl_load_file($so, @_)
            or return undef;
    }
    bless \$lib, $class;
}

sub DESTROY {
    if ($^O eq 'MSWin32') {
        Win32::FreeLibrary(${$_[0]});
    }
    else {
        DynaLoader::dl_free_file(${$_[0]})
            if defined (&DynaLoader::dl_free_file);
    }
}

sub function {
    my $self = shift;
    my $name = shift;
    my $sig = shift;
    my $addr;
    if ($^O eq 'MSWin32') {
        $addr = Win32::GetProcAddress(${$self}, $name);
    }
    else {
        $addr = DynaLoader::dl_find_symbol(${$self}, $name);
    }
    croak "Unknown function $name" unless defined $addr;

    sub { FFI::call($addr, $sig, @_); }
}

1;
__END__