Win.HostLibs.Mod 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. VAR err: LONGINT;
  20. BEGIN
  21. lib := Kernel32.LoadLibrary(fileName);
  22. IF lib # NilLibHandle THEN
  23. RETURN TRUE;
  24. END;
  25. err := Kernel32.GetLastError();
  26. TRACE(fileName, err);
  27. FINALLY
  28. RETURN FALSE;
  29. END LoadLibrary;
  30. (**
  31. Free a previously loaded dynamic library
  32. lib: library handle
  33. Return: TRUE in case of success
  34. *)
  35. PROCEDURE FreeLibrary*(CONST lib: LibHandle): BOOLEAN;
  36. BEGIN
  37. RETURN (Kernel32.FreeLibrary(lib) # 0);
  38. FINALLY
  39. RETURN FALSE;
  40. END FreeLibrary;
  41. (**
  42. Get a procedure from a loaded dynamic library
  43. lib: library handle
  44. name: name of the procedure
  45. procAddr: address of the destination procedure pointer (e.g. ADDRESSOF(procedureVariable))
  46. Return: TRUE in case of success
  47. *)
  48. PROCEDURE GetProcedure*(CONST lib: LibHandle; CONST name: ARRAY OF CHAR; CONST procAddr: ADDRESS): BOOLEAN;
  49. VAR addr: ADDRESS;
  50. BEGIN
  51. ASSERT(procAddr # NIL);
  52. Kernel32.GetProcAddress(lib,name,addr);
  53. IF addr # NIL THEN
  54. SYSTEM.PUT(procAddr,addr);
  55. RETURN TRUE;
  56. END;
  57. FINALLY
  58. RETURN FALSE;
  59. END GetProcedure;
  60. END HostLibs.