Win.HostLibs.Mod 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. (**
  2. AUTHOR: Alexey Morozov
  3. PURPOSE: Dynamic library tools for Windows platforms
  4. *)
  5. MODULE HostLibs;
  6. IMPORT
  7. SYSTEM, Kernel32;
  8. TYPE
  9. LibHandle* = Kernel32.HANDLE; (** dynamic library handle type *)
  10. CONST
  11. NilLibHandle* = Kernel32.NULL; (** invalid library handle *)
  12. (**
  13. Load a dynamic library
  14. fileName: library file name
  15. lib: returned loaded library handle; NilLibHandle in case of an error
  16. Return: TRUE in case of success
  17. *)
  18. PROCEDURE LoadLibrary*(CONST fileName: ARRAY OF CHAR; VAR lib: LibHandle): BOOLEAN;
  19. BEGIN
  20. lib := Kernel32.LoadLibrary(fileName);
  21. RETURN (lib # NilLibHandle);
  22. FINALLY
  23. RETURN FALSE;
  24. END LoadLibrary;
  25. (**
  26. Free a previously loaded dynamic library
  27. lib: library handle
  28. Return: TRUE in case of success
  29. *)
  30. PROCEDURE FreeLibrary*(CONST lib: LibHandle): BOOLEAN;
  31. BEGIN
  32. RETURN (Kernel32.FreeLibrary(lib) # 0);
  33. FINALLY
  34. RETURN FALSE;
  35. END FreeLibrary;
  36. (**
  37. Get a procedure from a loaded dynamic library
  38. lib: library handle
  39. name: name of the procedure
  40. procAddr: address of the destination procedure pointer (e.g. ADDRESSOF(procedureVariable))
  41. Return: TRUE in case of success
  42. *)
  43. PROCEDURE GetProcedure*(CONST lib: LibHandle; CONST name: ARRAY OF CHAR; CONST procAddr: ADDRESS): BOOLEAN;
  44. VAR addr: ADDRESS;
  45. BEGIN
  46. ASSERT(procAddr # NIL);
  47. Kernel32.GetProcAddress(lib,name,addr);
  48. IF addr # NIL THEN
  49. SYSTEM.PUT(procAddr,addr);
  50. RETURN TRUE;
  51. END;
  52. FINALLY
  53. RETURN FALSE;
  54. END GetProcedure;
  55. END HostLibs.