Description Usage Arguments Details Value See Also Examples
generic.dll.loader
is to be called from the .onLoad
of a package. It calls library.dynam
on all the DLLs it can find in the "libs" folder (so you don't need to specify their names), or in the appropriate sub-architecture folder below "libs". It also creates "R aliasses" in your namespace for all the registered low-level routines in each DLL (i.e. those returned by getDLLRegisteredRoutines
, qv), so that the routines can be called efficiently later on from your code— see Details.
If you just want to use mvbutils
to help build/maintain your package, and don't need your package to import/depend on other functions in mvbutils
, then it's fine to just copy the code from generic.dll.loader
etc and put it directly into your own .onLoad
.
ldyn.tester
, create.wrappers.for.dll
, and ldyn.unload
are to help you develop a DLL that has fully-registered routines, without immediately having to create an R package for it. ldyn.tester
loads a DLL and returns its registration info. The DLL must be in a folder .../libs/<subarch>
where <subarch>
is .Platform$r_arch
iff that is non-empty; this is because ldyn.tester
merely tricks library.dynam
into finding a spurious "package", and that's the folder structure that library.dynam
needs to see. create.wrappers.for.dll
does the alias-creation mentioned above for generic.dll.loader
. ldyn.unload
unloads the DLL.
1 2 3 4 5 6 | # Only call this inside your .onLoad!
generic.dll.loader(libname, pkgname, ignore_error=FALSE)
# Only call these if you are informally developing a DLL outside a package
ldyn.tester(chname)
create.wrappers.for.dll( this.dll.info, ns=new.env( parent=parent.frame(2)))
ldyn.unload( l1)
|
libname, pkgname |
as per |
ignore_error |
?continue to load other DLLs if one fails? |
chname |
(for |
this.dll.info |
(for |
ns |
(for |
l1 |
(for |
R-callable aliasses for your low-level routines will be called e.g. C_myrout1
, Call_myrout2
, F_myrout3
, or Ext_myrout4
, depending on type. Those for routines in "myfirstdll" will be stored in the environment LL_myfirstdll
("Low Level") in your package's namespace, which itself inherits from the namespace. In your own R code elsewhere in your package, you can then have something like
1 | .C( LL_myfirstdll$C_myrout1, <<arguments>>) # NB no need for PACKAGE argument
|
Getting fancy, you can alternatively set the environment of your calling function to LL_myfirstdll
(which inherits from the namespace, so all your other functions are still visible). In that case, you can just write
1 | .C( C_myrout1, <<arguments>>)
|
generic.dll.loader
returns NULL (but see Details).
ldyn.tester
returns a class "DLLInfo" object if successful. ldyn.unload
should return NULL if successful, and crash otherwise.
create.wrappers.for.dll
returns the environment containing the aliasses.
Be careful with accidentally saving and loading the results of ldyn.tester
and create.wrappers.for.dll
; they won't be valid in a new R session. You might be better off creating them in the mvb.session.info
environment on the search path; they will still be found, but won't persist in a different R session. See Examples.
set.finalizer
for a safe way to ensure cleanup after low-level routines.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ## Not run:
mypack:::.onLoad <- function( libname, pkgname) generic.dll.loader( libname, pkgname)
#... or just copy the code into your .onLoad
# For casual testing of a DLL that's not yet in a package
dl <- ldyn.tester( 'path/to/my/dll/libs/i386/mydll.dll')
getDLLRegisteredRoutines( l1)
LL_mydll <- create.wrappers.for.dll( dl)
.C( LL_mydll$C_rout1, as.integer( 0)) # ... whatever!
ldyn.unload( dl)
# Safer because not permanent:
assign( 'dl', ldyn.tester( 'path/to/my/dll/libs/i386/mydll.dll'), pos='mvb.session.info')
assign( 'LL_mydll', create.wrappers.for.dll( dl), pos='mvb.session.info')
.C( LL.mydll$C_rout1, as.integer( 0)) # ... whatever!
## End(Not run)
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.