12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- (**
- AUTHOR: Alexey Morozov
- PURPOSE: Dynamic library tools for Windows platforms
- *)
- MODULE HostLibs;
- IMPORT
- SYSTEM, Kernel32;
- TYPE
- LibHandle* = Kernel32.HANDLE; (** dynamic library handle type *)
- CONST
- NilLibHandle* = Kernel32.NULL; (** invalid library handle *)
- (**
- Load a dynamic library
- fileName: library file name
- lib: returned loaded library handle; NilLibHandle in case of an error
- Return: TRUE in case of success
- *)
- PROCEDURE LoadLibrary*(CONST fileName: ARRAY OF CHAR; VAR lib: LibHandle): BOOLEAN;
- VAR err: LONGINT;
- BEGIN
- lib := Kernel32.LoadLibrary(fileName);
- IF lib # NilLibHandle THEN
- RETURN TRUE;
- END;
- err := Kernel32.GetLastError();
- TRACE(fileName, err);
- FINALLY
- RETURN FALSE;
- END LoadLibrary;
- (**
- Free a previously loaded dynamic library
- lib: library handle
- Return: TRUE in case of success
- *)
- PROCEDURE FreeLibrary*(CONST lib: LibHandle): BOOLEAN;
- BEGIN
- RETURN (Kernel32.FreeLibrary(lib) # 0);
- FINALLY
- RETURN FALSE;
- END FreeLibrary;
- (**
- Get a procedure from a loaded dynamic library
- lib: library handle
- name: name of the procedure
- procAddr: address of the destination procedure pointer (e.g. ADDRESSOF(procedureVariable))
- Return: TRUE in case of success
- *)
- PROCEDURE GetProcedure*(CONST lib: LibHandle; CONST name: ARRAY OF CHAR; CONST procAddr: ADDRESS): BOOLEAN;
- VAR addr: ADDRESS;
- BEGIN
- ASSERT(procAddr # NIL);
- Kernel32.GetProcAddress(lib,name,addr);
- IF addr # NIL THEN
- SYSTEM.PUT(procAddr,addr);
- RETURN TRUE;
- END;
- FINALLY
- RETURN FALSE;
- END GetProcedure;
- END HostLibs.
|