{******************************************************************} { } { Project JEDI } { OS independent Dynamic Loading Helpers } { } { The initial developer of the this code is } { Robert Marquardt INVALID_MODULEHANDLE_VALUE; end; // load the .so file FileName // dlopen() with flags is used to get better control of the loading // for the allowed values for flags see "man dlopen". function LoadModuleEx(var Module: TModuleHandle; FileName: string; Flags: Cardinal): Boolean; begin Module := dlopen(PChar(FileName), Flags); Result := Module <> INVALID_MODULEHANDLE_VALUE; end; // unload a .so loaded with LoadModule or LoadModuleEx // The procedure will not try to unload a handle with // value INVALID_MODULEHANDLE_VALUE and assigns this value // to Module after unload. procedure UnloadModule(var Module: TModuleHandle); begin if Module <> INVALID_MODULEHANDLE_VALUE then dlclose(Module); Module := INVALID_MODULEHANDLE_VALUE; end; // returns the pointer to the symbol named SymbolName // if it is exported from the .so Module // nil is returned if the symbol is not available function GetModuleSymbol(Module: TModuleHandle; SymbolName: string): Pointer; begin Result := nil; if Module <> INVALID_MODULEHANDLE_VALUE then Result := dlsym(Module, PChar(SymbolName)); end; // returns the pointer to the symbol named SymbolName // if it is exported from the .so Module // nil is returned if the symbol is not available. // as an extra the boolean variable Accu is updated // by anding in the success of the function. // This is very handy for rendering a global result // when accessing a long list of symbols. function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: string; var Accu: Boolean): Pointer; begin Result := nil; if Module <> INVALID_MODULEHANDLE_VALUE then Result := dlsym(Module, PChar(SymbolName)); Accu := Accu and (Result <> nil); end; // get the value of variables exported from a .so Module // Delphi cannot access variables in a .so directly, so // this function allows to copy the data from the .so. // Beware! You are accessing the .so memory image directly. // Be sure to access a variable not a function and be sure // to read the correct amount of data. function ReadModuleData(Module: TModuleHandle; SymbolName: string; var Buffer; Size: Cardinal): Boolean; var Sym: Pointer; begin Result := True; Sym := GetModuleSymbolEx(Module, SymbolName, Result); if Result then Move(Sym^, Buffer, Size); end; // set the value of variables exported from a .so Module // Delphi cannot access variables in a .so directly, so // this function allows to copy the data to the .so! // BEWARE! You are accessing the .so memory image directly. // Be sure to access a variable not a function and be sure // to write the correct amount of data. // The changes are not persistent. They get lost when the // .so is unloaded. function WriteModuleData(Module: TModuleHandle; SymbolName: string; var Buffer; Size: Cardinal): Boolean; var Sym: Pointer; begin Result := True; Sym := GetModuleSymbolEx(Module, SymbolName, Result); if Result then Move(Buffer, Sym^, Size); end; end.