![[About]](e:\os2httpd_1.3.2\htdocs\rexxtipsntricks\about.gif)
![[Toc]](e:\os2httpd_1.3.2\htdocs\rexxtipsntricks\toc.gif)
0.9b (c) 1995 Peter Childs
If the function <RxFuncAdd returns 0 this only means that the new function is registered. It does not mean that you can use this function! The same is true for the function <RxFuncQuery.
Example:
say rxFuncAdd( "TestFunc1", "REXXUTIL", "TestFunc1" )
/* result is 0 (= function registered!) */
say rxFuncQuery( "TestFunc1" )
/* result is 0 (= function registered!) */
call TestFunc1
/* error: Function not found! */
To use a DLL which does not exist in one of the directoies in the <LIBPATH you can use a fully qualified path for the name of the DLL containing the functions. But be aware that functions like <SysLoadFuncs will not work in this case because they expect the DLL to be in the <LIBPATH. You have to register all needed functions from the DLL manually using <RxFuncAdd. This is true for REXXUTIL and mostly all DLLs exporting a function to register the other DLL functions. (Source: Documentation for the REXX DosStartSessionTool)
A name for an external function (the first parameter for the function RxFuncAdd) can only be registered once. So, if you want to reRegister a name you must first deRegister it using <RxFuncDrop before registering it (or use another REXX name, see Loading more than one DLL with the same function names)
The conclusion from the statements above: To register a function you should use a routine like the following:
LoadMyDll:
/* install a temporary error handler */
/* note: the previous error handler is auto- */
/* maticly restored a the end of the */
/* routine */
SIGNAL ON SYNTAX NAME InitDllError
/* set a marker */
dllInitOK = 0
/* first deregister the function */
call rxFuncDrop "InitMyDll"
/* load the function */
dummy = rxFuncAdd( "InitMyDll", "MYDLL", "InitMyDLL" )
/* call the init function */
call InitMyDll
dllInitOK = 1 /* set the marker, this statement is not */
/* executed if the previous statement fails! */
InitDllError:
/* deRegister the name if the init call */
/* failed */
if dllInitOK = 0 then
call rxFuncDrop "InitMyDll"
/* returns: 1 - dll init ok */
/* 0 - dll init error */
RETURN dllInitOK
Note: see also DLL loading failed, Loading more than one DLL with the
same function names and RxFuncDrop
Inf-HTML End Run - Successful