[Up] [Contents] [Index] [Summary]
This section discusses the functionality of the (autoload) library
shlib.pl
, providing an interface to shared libraries.
Currently it supports MS-Windows DLL (.DLL
) libraries and
Unix
.so
(shared object) files.
- load_foreign_library(+Lib)
-
Equivalent to load_foreign_library(Lib, install).
- load_foreign_library(+Lib,
+Entry)
-
Search for the given foreign library and link it to the current
SWI-Prolog instance. The library may be specified with or without the
extension. First, absolute_file_name/3
is used to locate the file. If this succeeds, the full path is passed to
the low-level function to open the library. Otherwise, the plain library
name is passed, exploiting the operating-system defined search mechanism
for the shared library. The file_search_path/2
alias mechanism defines the alias
foreign
, which refers to
the directories <plhome>/lib/<arch>
and
<plhome>/lib
, in this order.
If the library can be loaded, the function called Entry
will be called without arguments. The return value of the function is
ignored.
The Entry function will normally call
PL_register_foreign() to declare functions in the library as foreign
predicates.
- unload_foreign_library(+Lib)
-
If the foreign library defines the function uninstall(), this function
will be called without arguments and its return value is ignored. Next, abolish/2
is used to remove all known foreign predicates defined in the library.
Finally the library itself is detached from the process.
- current_foreign_library(-Lib,
-Predicates)
-
Query the currently loaded foreign libraries and their predicates. Predicates
is a list with elements of the form Module:Head, indicating the
predicates installed with PL_register_foreign() when the entry-point of
the library was called.
Figure 6 connects a Windows
message-box using a foreign function. This example was tested using
Windows NT and Microsoft Visual C++ 2.0.
#include
#include
static foreign_t
pl_say_hello(term_t to)
{ char *a;
if ( PL_get_atom_chars(to, &a) )
{ MessageBox(NULL, a, "DLL test", MB_OK|MB_TASKMODAL);
PL_succeed;
}
PL_fail;
}
install_t
install()
{ PL_register_foreign("say_hello", 1, pl_say_hello, 0);
}
Figure 6 : MessageBox() example in Windows NT
Section Index